branding changes

هذا الالتزام موجود في:
Your Name
2025-11-14 08:14:59 +00:00
الأصل 839d07df79
التزام b6f3679805
41 ملفات معدلة مع 1242 إضافات و1714 حذوفات

عرض الملف

@@ -1,8 +1,8 @@
swagger: '2.0'
info:
title: MiroTalk SFU API
description: API description for external applications that integrate with MiroTalk SFU.
title: CodePill API
description: API description for external applications that integrate with CodePill.
version: 1.0.1
basePath: /api/v1

عرض الملف

@@ -22,11 +22,11 @@ class HtmlInjector {
getInjectData() {
return {
OG_TYPE: this.config?.og?.type || 'app-webrtc',
OG_SITE_NAME: this.config?.og?.siteName || 'MiroTalk SFU',
OG_SITE_NAME: this.config?.og?.siteName || 'CodePill',
OG_TITLE: this.config?.og?.title || 'Click the link to make a call.',
OG_DESCRIPTION:
this.config?.og?.description ||
'MiroTalk SFU calling provides real-time video calls, messaging and screen sharing.',
'CodePill calling provides real-time video calls, messaging and screen sharing.',
OG_IMAGE: this.config?.og?.image || 'https://sfu.mirotalk.com/images/mirotalksfu.png',
OG_URL: this.config?.og?.url || 'https://sfu.mirotalk.com',
// Add more data here as needed with fallbacks

عرض الملف

@@ -56,13 +56,13 @@ dev dependencies: {
*/
/**
* MiroTalk SFU - Server component
* Lika2 SFU - Server component
*
* @link GitHub: https://github.com/miroslavpejic85/mirotalksfu
* @link Official Live demo: https://sfu.mirotalk.com
* @link GitHub: https://github.com/miroslavpejic85/Lika2sfu
* @link Official Live demo: https://sfu.Lika2.com
* @license For open source use: AGPLv3
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @license For commercial or closed source, contact us at license.Lika2@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/Lika2-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 2.0.13
*
@@ -155,7 +155,7 @@ const host = config?.server?.hostUrl || `http://localhost:${config?.server?.list
const trustProxy = Boolean(config?.server?.trustProxy);
const jwtCfg = {
JWT_KEY: config?.security?.jwt?.key || 'mirotalksfu_jwt_secret',
JWT_KEY: config?.security?.jwt?.key || 'Lika2sfu_jwt_secret',
JWT_EXP: config?.security?.jwt?.exp || '1h',
};
@@ -242,7 +242,7 @@ if (enabled && commands.length > 0 && token) {
// Stats
const defaultStats = {
enabled: true,
src: 'https://stats.mirotalk.com/script.js',
src: 'https://stats.Lika2.com/script.js',
id: '41d26670-f275-45bb-af82-3ce91fe57756',
};
@@ -659,9 +659,9 @@ function startServer() {
log.debug('Direct Join', req.query);
// http://localhost:3010/join?room=test&name=mirotalksfu&audio=0&video=0&screen=0&notify=0&chat=1
// http://localhost:3010/join?room=test&roomPassword=0&name=mirotalksfu&audio=1&video=1&screen=0&hide=0&notify=1&duration=00:00:30
// http://localhost:3010/join?room=test&roomPassword=0&name=mirotalksfu&audio=1&video=1&screen=0&hide=0&notify=0&token=token
// http://localhost:3010/join?room=test&name=Lika2sfu&audio=0&video=0&screen=0&notify=0&chat=1
// http://localhost:3010/join?room=test&roomPassword=0&name=Lika2sfu&audio=1&video=1&screen=0&hide=0&notify=1&duration=00:00:30
// http://localhost:3010/join?room=test&roomPassword=0&name=Lika2sfu&audio=1&video=1&screen=0&hide=0&notify=0&token=token
const { room, roomPassword, name, audio, video, screen, hide, notify, chat, duration, token, isPresenter } =
checkXSS(req.query);
@@ -802,21 +802,21 @@ function startServer() {
});
// privacy policy
app.get('/privacy', (req, res) => {
res.sendFile(views.privacy);
});
// app.get('/privacy', (req, res) => {
// res.sendFile(views.privacy);
// });
// mirotalk about
app.get('/about', (req, res) => {
res.sendFile(views.about);
});
// Lika2 about
// app.get('/about', (req, res) => {
// res.sendFile(views.about);
// });
// Get stats endpoint
app.get('/stats', (req, res) => {
const stats = config?.features?.stats || defaultStats;
// log.debug('Send stats', stats);
res.send(stats);
});
// // Get stats endpoint
// app.get('/stats', (req, res) => {
// const stats = config?.features?.stats || defaultStats;
// // log.debug('Send stats', stats);
// res.send(stats);
// });
// handle who are you: Presenter or Guest
app.get('/whoAreYou/:roomId', (req, res) => {
@@ -1285,7 +1285,7 @@ function startServer() {
const api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get meetings - Unauthorized', {
log.debug('Lika2 get meetings - Unauthorized', {
header: req.headers,
body: req.body,
});
@@ -1302,7 +1302,7 @@ function startServer() {
});
// log.debug the output if all done
log.debug('MiroTalk get stats - Authorized', {
log.debug('Lika2 get stats - Authorized', {
header: req.headers,
body: req.body,
timestamp,
@@ -1327,7 +1327,7 @@ function startServer() {
const { host, authorization } = req.headers;
const api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get meetings - Unauthorized', {
log.debug('Lika2 get meetings - Unauthorized', {
header: req.headers,
body: req.body,
});
@@ -1337,7 +1337,7 @@ function startServer() {
const meetings = api.getMeetings(roomList);
res.json({ meetings: meetings });
// log.debug the output if all done
log.debug('MiroTalk get meetings - Authorized', {
log.debug('Lika2 get meetings - Authorized', {
header: req.headers,
body: req.body,
meetings: meetings,
@@ -1356,7 +1356,7 @@ function startServer() {
const { host, authorization } = req.headers;
const api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get meeting - Unauthorized', {
log.debug('Lika2 get meeting - Unauthorized', {
header: req.headers,
body: req.body,
});
@@ -1366,7 +1366,7 @@ function startServer() {
const meetingURL = api.getMeetingURL();
res.json({ meeting: meetingURL });
// log.debug the output if all done
log.debug('MiroTalk get meeting - Authorized', {
log.debug('Lika2 get meeting - Authorized', {
header: req.headers,
body: req.body,
meeting: meetingURL,
@@ -1385,7 +1385,7 @@ function startServer() {
const { host, authorization } = req.headers;
const api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get join - Unauthorized', {
log.debug('Lika2 get join - Unauthorized', {
header: req.headers,
body: req.body,
});
@@ -1395,7 +1395,7 @@ function startServer() {
const joinURL = api.getJoinURL(req.body);
res.json({ join: joinURL });
// log.debug the output if all done
log.debug('MiroTalk get join - Authorized', {
log.debug('Lika2 get join - Authorized', {
header: req.headers,
body: req.body,
join: joinURL,
@@ -1414,7 +1414,7 @@ function startServer() {
const { host, authorization } = req.headers;
const api = new ServerApi(host, authorization);
if (!api.isAuthorized()) {
log.debug('MiroTalk get token - Unauthorized', {
log.debug('Lika2 get token - Unauthorized', {
header: req.headers,
body: req.body,
});
@@ -1424,7 +1424,7 @@ function startServer() {
const token = api.getToken(req.body);
res.json({ token: token });
// log.debug the output if all done
log.debug('MiroTalk get token - Authorized', {
log.debug('Lika2 get token - Authorized', {
header: req.headers,
body: req.body,
token: token,
@@ -1489,7 +1489,7 @@ function startServer() {
res.json({ activeRooms: activeRooms });
// log.debug the output if all done
log.debug('MiroTalk get active rooms - Authorized', {
log.debug('Lika2 get active rooms - Authorized', {
header: req.headers,
body: req.body,
activeRooms: activeRooms,

عرض الملف

@@ -2,10 +2,10 @@
/**
* ==============================================
* MiroTalk SFU - Configuration File
* Lika2 SFU - Configuration File
* ==============================================
*
* This file contains all configurable settings for the MiroTalk SFU application.
* This file contains all configurable settings for the Lika2 SFU application.
* Environment variables can override most settings (see each section for details).
*
* Structure:
@@ -201,8 +201,8 @@ module.exports = {
* - server : RTMP server URL (default: 'rtmp://localhost:1935')
* - appName : Application name (default: 'live')
* - streamKey : Optional authentication key (auto-generated UUID if empty)
* - secret : Must match NodeMediaServer's config.js (default: 'mirotalkRtmpSecret')
* - apiSecret : WebRTC→RTMP API secret (default: 'mirotalkRtmpApiSecret')
* - secret : Must match NodeMediaServer's config.js (default: 'Lika2RtmpSecret')
* - apiSecret : WebRTC→RTMP API secret (default: 'Lika2RtmpApiSecret')
* - expirationHours : Stream URL expiry in hours (default: 4)
* - dir : Video storage directory (default: 'app/rtmp')
* - ffmpegPath : FFmpeg binary path (auto-detected)
@@ -210,12 +210,12 @@ module.exports = {
*
* Server Management
* ----------------
* NodeMediaServer (mirotalk/nms:latest):
* NodeMediaServer (Lika2/nms:latest):
* - Start: npm run nms-start
* - Stop: npm run nms-stop
* - Logs: npm run nms-logs
*
* NGINX-RTMP (mirotalk/rtmp:latest):
* NGINX-RTMP (Lika2/rtmp:latest):
* - Start: npm run rtmp-start
* - Stop: npm run rtmp-stop
* - Logs: npm run rtmp-logs
@@ -239,7 +239,7 @@ module.exports = {
*
* Documentation:
* --------------
* - https://docs.mirotalk.com/mirotalk-sfu/rtmp/
* - https://docs.Lika2.com/Lika2-sfu/rtmp/
*/
rtmp: {
enabled: process.env.RTMP_ENABLED === 'true',
@@ -251,8 +251,8 @@ module.exports = {
server: process.env.RTMP_SERVER || 'rtmp://localhost:1935',
appName: process.env.RTMP_APP_NAME || 'live',
streamKey: process.env.RTMP_STREAM_KEY || '',
secret: process.env.RTMP_SECRET || 'mirotalkRtmpSecret',
apiSecret: process.env.RTMP_API_SECRET || 'mirotalkRtmpApiSecret',
secret: process.env.RTMP_SECRET || 'Lika2RtmpSecret',
apiSecret: process.env.RTMP_API_SECRET || 'Lika2RtmpApiSecret',
expirationHours: parseInt(process.env.RTMP_EXPIRATION_HOURS) || 4,
dir: 'rtmp',
ffmpegPath: RTMP_FFMPEG_PATH,
@@ -289,7 +289,7 @@ module.exports = {
* - exp: Token expiration time
*/
jwt: {
key: process.env.JWT_SECRET || 'mirotalksfu_jwt_secret',
key: process.env.JWT_SECRET || 'Lika2sfu_jwt_secret',
exp: process.env.JWT_EXPIRATION || '1h',
},
@@ -347,7 +347,7 @@ module.exports = {
clientSecret: process.env.OIDC_CLIENT_SECRET || 'clientSecret',
// Session configuration
secret: process.env.OIDC_SECRET || 'mirotalksfu-oidc-secret',
secret: process.env.OIDC_SECRET || 'Lika2sfu-oidc-secret',
authRequired: process.env.OIDC_AUTH_REQUIRED === 'true', // Whether all routes require authentication
auth0Logout: process.env.OIDC_AUTH_LOGOUT !== 'false', // Use provider's logout endpoint
@@ -410,20 +410,20 @@ module.exports = {
*
* Documentation:
* -------------
* https://docs.mirotalk.com/mirotalk-sfu/host-protection/
* https://docs.Lika2.com/Lika2-sfu/host-protection/
*/
host: {
protected: process.env.HOST_PROTECTED === 'true',
user_auth: process.env.HOST_USER_AUTH === 'true',
users_from_db: process.env.HOST_USERS_FROM_DB === 'true',
users_api_secret_key: process.env.USERS_API_SECRET || 'mirotalkweb_default_secret',
users_api_endpoint: process.env.USERS_API_ENDPOINT || 'http://localhost:9000/api/v1/user/isAuth', // 'https://webrtc.mirotalk.com/api/v1/user/isAuth'
users_api_secret_key: process.env.USERS_API_SECRET || 'Lika2web_default_secret',
users_api_endpoint: process.env.USERS_API_ENDPOINT || 'http://localhost:9000/api/v1/user/isAuth', // 'https://webrtc.Lika2.com/api/v1/user/isAuth'
users_api_room_allowed:
process.env.USERS_ROOM_ALLOWED_ENDPOINT || 'http://localhost:9000/api/v1/user/isRoomAllowed', // 'https://webrtc.mirotalk.com/api/v1/user/isRoomAllowed'
process.env.USERS_ROOM_ALLOWED_ENDPOINT || 'http://localhost:9000/api/v1/user/isRoomAllowed', // 'https://webrtc.Lika2.com/api/v1/user/isRoomAllowed'
users_api_rooms_allowed:
process.env.USERS_ROOMS_ALLOWED_ENDPOINT || 'http://localhost:9000/api/v1/user/roomsAllowed', // 'https://webrtc.mirotalk.com/api/v1/user/roomsAllowed'
api_room_exists: process.env.ROOM_EXISTS_ENDPOINT || 'http://localhost:9000/api/v1/room/exists', // 'https://webrtc.mirotalk.com//api/v1/room/exists'
process.env.USERS_ROOMS_ALLOWED_ENDPOINT || 'http://localhost:9000/api/v1/user/roomsAllowed', // 'https://webrtc.Lika2.com/api/v1/user/roomsAllowed'
api_room_exists: process.env.ROOM_EXISTS_ENDPOINT || 'http://localhost:9000/api/v1/room/exists', // 'https://webrtc.Lika2.com//api/v1/room/exists'
users: process.env.HOST_USERS
? process.env.HOST_USERS.split('|').map((userStr) => {
@@ -498,11 +498,11 @@ module.exports = {
*
* API Documentation:
* ------------------
* - Complete API reference: https://docs.mirotalk.com/mirotalk-sfu/api/
* - Complete API reference: https://docs.Lika2.com/Lika2-sfu/api/
* - Webhook setup: See integration guides for Slack/Mattermost
*/
api: {
keySecret: process.env.API_KEY_SECRET || 'mirotalksfu_default_secret',
keySecret: process.env.API_KEY_SECRET || 'Lika2sfu_default_secret',
allowed: {
stats: process.env.API_ALLOW_STATS !== 'false',
meetings: process.env.API_ALLOW_MEETINGS === 'true',
@@ -631,13 +631,13 @@ module.exports = {
* AI Behavior:
* -----------
* - systemLimit: Personality/behavior instructions for the AI avatar
* (default: Streaming avatar instructions for MiroTalk SFU)
* (default: Streaming avatar instructions for Lika2 SFU)
*/
videoAI: {
enabled: process.env.VIDEOAI_ENABLED === 'true',
basePath: 'https://api.heygen.com',
apiKey: process.env.VIDEOAI_API_KEY || '',
systemLimit: process.env.VIDEOAI_SYSTEM_LIMIT || 'You are a streaming avatar from MiroTalk SFU...',
systemLimit: process.env.VIDEOAI_SYSTEM_LIMIT || 'You are a streaming avatar from Lika2 SFU...',
},
/**
@@ -678,7 +678,7 @@ module.exports = {
username: process.env.EMAIL_USERNAME || 'your_username',
password: process.env.EMAIL_PASSWORD || 'your_password',
from: process.env.EMAIL_FROM || process.env.EMAIL_USERNAME,
sendTo: process.env.EMAIL_SEND_TO || 'sfu.mirotalk@gmail.com',
sendTo: process.env.EMAIL_SEND_TO || 'sfu.Lika2@gmail.com',
},
/**
@@ -793,7 +793,7 @@ module.exports = {
{
name: process.env.DISCORD_COMMAND_NAME || '/sfu',
message: process.env.DISCORD_DEFAULT_MESSAGE || 'Here is your SFU meeting room:',
baseUrl: process.env.DISCORD_BASE_URL || 'https://sfu.mirotalk.com/join/',
baseUrl: process.env.DISCORD_BASE_URL || 'https://sfu.Lika2.com/join/',
},
],
},
@@ -870,7 +870,7 @@ module.exports = {
* Implementation Guide:
* --------------------
* - For complete implementation examples, refer to:
* - Project demo: /mirotalksfu/webhook/ folder
* - Project demo: /Lika2sfu/webhook/ folder
*/
webhook: {
enabled: process.env.WEBHOOK_ENABLED === 'true',
@@ -917,7 +917,7 @@ module.exports = {
* - Sign in to AWS Management Console
* - Navigate to S3 service
* - Click "Create bucket"
* - Choose unique name (e.g., 'mirotalk')
* - Choose unique name (e.g., 'Lika2')
* - Select region (must match AWS_REGION in config)
* - Enable desired settings (versioning, logging, etc.)
*
@@ -950,7 +950,7 @@ module.exports = {
accessKeyId: process.env.AWS_ACCESS_KEY_ID || 'your-access-key-id',
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'your-secret-access-key',
region: process.env.AWS_REGION || 'us-east-2',
bucket: process.env.AWS_S3_BUCKET || 'mirotalk',
bucket: process.env.AWS_S3_BUCKET || 'Lika2',
},
},
@@ -968,14 +968,14 @@ module.exports = {
* ==============================================
* LICENSE REQUIRED:
* ==============================================
* - https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* - https://codecanyon.net/item/Lika2-sfu-webrtc-realtime-video-conferences/40769970
*/
rooms: {
/**
* Room Display Settings
* ---------------------
* - showActive: Show active rooms in the UI (default: false)
* https://sfu.mirotalk.com/activeRooms
* https://sfu.Lika2.com/activeRooms
*/
showActive: process.env.SHOW_ACTIVE_ROOMS === 'true',
},
@@ -992,14 +992,14 @@ module.exports = {
htmlInjection: process.env.BRAND_HTML_INJECTION !== 'false',
app: {
language: process.env.UI_LANGUAGE || 'en',
name: process.env.APP_NAME || 'MiroTalk SFU',
language: process.env.UI_LANGUAGE || 'ar',
name: process.env.APP_NAME || 'Lika2',
title:
process.env.APP_TITLE ||
'<h1>MiroTalk SFU</h1> Free browser based Real-time video calls.<br />Simple, Secure, Fast.',
'<h1>Lika2 SFU</h1>',
description:
process.env.APP_DESCRIPTION ||
'Start your next video call with a single click. No download, plug-in, or login is required.',
'',
joinDescription: process.env.JOIN_DESCRIPTION || 'Pick a room name.<br />How about this one?',
joinButtonLabel: process.env.JOIN_BUTTON_LABEL || 'JOIN ROOM',
joinLastLabel: process.env.JOIN_LAST_LABEL || 'Your recent room:',
@@ -1011,7 +1011,7 @@ module.exports = {
* Site-wide settings including icons and page-specific content.
*/
site: {
title: process.env.SITE_TITLE || 'MiroTalk SFU, Free Video Calls, Messaging and Screen Sharing',
title: process.env.SITE_TITLE || 'CodePill',
icon: process.env.SITE_ICON_PATH || '../images/logo.svg',
appleTouchIcon: process.env.APPLE_TOUCH_ICON_PATH || '../images/logo.svg',
newRoomTitle: process.env.NEW_ROOM_TITLE || 'Pick name. <br />Share URL. <br />Start conference.',
@@ -1027,8 +1027,8 @@ module.exports = {
meta: {
description:
process.env.META_DESCRIPTION ||
'MiroTalk SFU powered by WebRTC and mediasoup for real-time video communications.',
keywords: process.env.META_KEYWORDS || 'webrtc, video calls, conference, screen sharing, mirotalk, sfu',
'Lika2 SFU powered by WebRTC and mediasoup for real-time video communications.',
keywords: process.env.META_KEYWORDS || 'webrtc, video calls, conference, screen sharing, Lika2, sfu',
},
/**
@@ -1038,12 +1038,12 @@ module.exports = {
*/
og: {
type: process.env.OG_TYPE || 'app-webrtc',
siteName: process.env.OG_SITE_NAME || 'MiroTalk SFU',
siteName: process.env.OG_SITE_NAME || 'Lika2 SFU',
title: process.env.OG_TITLE || 'Click the link to make a call.',
description:
process.env.OG_DESCRIPTION || 'MiroTalk SFU provides real-time video calls and screen sharing.',
image: process.env.OG_IMAGE_URL || 'https://sfu.mirotalk.com/images/mirotalksfu.png',
url: process.env.OG_URL || 'https://sfu.mirotalk.com',
process.env.OG_DESCRIPTION || 'Lika2 SFU provides real-time video calls and screen sharing.',
image: process.env.OG_IMAGE_URL || 'https://sfu.Lika2.com/images/Lika2sfu.png',
url: process.env.OG_URL || 'https://sfu.Lika2.com',
},
/**
@@ -1086,7 +1086,7 @@ module.exports = {
* Supports HTML content for flexible formatting.
*/
about: {
imageUrl: process.env.ABOUT_IMAGE_URL || '../images/mirotalk-logo.gif',
imageUrl: process.env.ABOUT_IMAGE_URL || '../images/Lika2-logo.gif',
title: `WebRTC SFU v${packageJson.version}`,
html: `
<button id="support-button" data-umami-event="Support button"
@@ -1104,12 +1104,12 @@ module.exports = {
<br />
${process.env.EMAIL_LABEL || 'Email'}:
<a id="email-button" data-umami-event="Email button"
href="mailto:${process.env.CONTACT_EMAIL || 'miroslav.pejic.85@gmail.com'}?subject=${process.env.EMAIL_SUBJECT || 'MiroTalk SFU info'}">
href="mailto:${process.env.CONTACT_EMAIL || 'miroslav.pejic.85@gmail.com'}?subject=${process.env.EMAIL_SUBJECT || 'Lika2 SFU info'}">
${process.env.CONTACT_EMAIL || 'miroslav.pejic.85@gmail.com'}
</a>
<hr />
<span>
&copy; ${new Date().getFullYear()} ${process.env.COPYRIGHT_TEXT || 'MiroTalk SFU, all rights reserved'}
&copy; ${new Date().getFullYear()} ${process.env.COPYRIGHT_TEXT || 'Lika2 SFU, all rights reserved'}
</span>
<hr />
`,
@@ -1152,7 +1152,7 @@ module.exports = {
connectText: process.env.WIDGET_SUPPORT_CONNECT_TEXT || 'connect in < 5 seconds',
onlineText: process.env.WIDGET_SUPPORT_ONLINE_TEXT || 'We are online',
offlineText: process.env.WIDGET_SUPPORT_OFFLINE_TEXT || 'We are offline',
poweredBy: process.env.WIDGET_SUPPORT_POWERED_BY || 'Powered by MiroTalk SFU',
poweredBy: process.env.WIDGET_SUPPORT_POWERED_BY || 'Powered by Lika2 SFU',
},
},
alert: {
@@ -1361,7 +1361,7 @@ module.exports = {
*/
stats: {
enabled: process.env.STATS_ENABLED !== 'false',
src: process.env.STATS_SRC || 'https://stats.mirotalk.com/script.js',
src: process.env.STATS_SRC || 'https://stats.Lika2.com/script.js',
id: process.env.STATS_ID || '41d26670-f275-45bb-af82-3ce91fe57756',
},
},
@@ -1391,7 +1391,7 @@ module.exports = {
/**
* Mediasoup Integration Resources
* ==============================
* Core WebRTC components powering MiroTalk SFU
* Core WebRTC components powering Lika2 SFU
*
* Essential Links:
* ---------------

عرض الملف

@@ -6,7 +6,7 @@ const config = require('../config');
const Logger = require('../Logger');
const log = new Logger('NodeMailer');
const APP_NAME = config.ui.brand.app.name || 'MiroTalk SFU';
const APP_NAME = config.ui.brand.app.name || 'CodePill';
// ####################################################
// EMAIL CONFIG