Skip to content

Commit 634feb5

Browse files
[mirotalkc2c] - feat: add /privacy policy page with route and link from home
1 parent 30e306c commit 634feb5

9 files changed

Lines changed: 229 additions & 7 deletions

File tree

.env.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# ====================================================
2-
# MiroTalk C2C v.1.2.96 - Environment Configuration
2+
# MiroTalk C2C v.1.2.97 - Environment Configuration
33
# ====================================================
44

55
# App environment

backend/server.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* @license For private project or commercial purposes contact us at: license.mirotalk@gmail.com or purchase it directly via Code Canyon:
1010
* @license https://codecanyon.net/item/mirotalk-c2c-webrtc-real-time-cam-2-cam-video-conferences-and-screen-sharing/43383005
1111
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
12-
* @version 1.2.96
12+
* @version 1.2.97
1313
*/
1414

1515
require('dotenv').config();
@@ -165,6 +165,7 @@ const OIDCAuth = function (req, res, next) {
165165
const frontendDir = path.join(__dirname, '../', 'frontend');
166166
const htmlClient = path.join(__dirname, '../', 'frontend/html/client.html');
167167
const htmlHome = path.join(__dirname, '../', 'frontend/html/home.html');
168+
const htmlPrivacy = path.join(__dirname, '../', 'frontend/html/privacy.html');
168169

169170
const channels = {};
170171
const sockets = {};
@@ -265,6 +266,10 @@ app.get('/', OIDCAuth, (req, res) => {
265266
return res.sendFile(htmlHome);
266267
});
267268

269+
app.get('/privacy', (req, res) => {
270+
return res.sendFile(htmlPrivacy);
271+
});
272+
268273
app.get('/join/', (req, res) => {
269274
if (Object.keys(req.query).length > 0) {
270275
//http://localhost:3000/join?room=test&name=test

frontend/css/home.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,16 @@ body {
213213
white-space: nowrap;
214214
}
215215

216+
.form-divider .privacy-link {
217+
color: var(--text-secondary);
218+
text-decoration: none;
219+
transition: color 0.2s ease;
220+
}
221+
222+
.form-divider .privacy-link:hover {
223+
color: var(--accent);
224+
}
225+
216226
/* Support / footer button */
217227
.support-btn {
218228
width: 100%;

frontend/css/privacy.css

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
.privacy-container {
2+
background: var(--card-bg);
3+
border: 1px solid var(--card-border);
4+
border-radius: 20px;
5+
padding: 40px 36px 32px;
6+
backdrop-filter: blur(20px);
7+
-webkit-backdrop-filter: blur(20px);
8+
box-shadow:
9+
0 20px 60px rgba(0, 0, 0, 0.5),
10+
0 0 0 1px rgba(255, 255, 255, 0.05);
11+
width: 100%;
12+
max-width: 720px;
13+
margin: 0 auto;
14+
}
15+
16+
.privacy-header {
17+
text-align: center;
18+
margin-bottom: 32px;
19+
}
20+
21+
.privacy-logo {
22+
display: flex;
23+
justify-content: center;
24+
margin-bottom: 16px;
25+
}
26+
27+
.privacy-logo img {
28+
width: 48px;
29+
height: 48px;
30+
}
31+
32+
.privacy-header h1 {
33+
font-size: 1.6rem;
34+
font-weight: 700;
35+
color: var(--text-primary);
36+
margin: 0;
37+
}
38+
39+
.privacy-body p {
40+
color: var(--text-secondary);
41+
font-size: 0.92rem;
42+
line-height: 1.7;
43+
margin: 0 0 18px;
44+
}
45+
46+
.privacy-body strong {
47+
color: var(--text-primary);
48+
}
49+
50+
.privacy-body a {
51+
color: var(--accent);
52+
text-decoration: none;
53+
transition: color 0.2s;
54+
}
55+
56+
.privacy-body a:hover {
57+
color: var(--accent-hover);
58+
text-decoration: underline;
59+
}
60+
61+
.privacy-footer {
62+
text-align: center;
63+
margin-top: 32px;
64+
}
65+
66+
.privacy-footer .btn-agree {
67+
display: inline-block;
68+
padding: 12px 40px;
69+
background: var(--accent);
70+
color: #fff;
71+
font-family: 'Montserrat', sans-serif;
72+
font-size: 0.95rem;
73+
font-weight: 600;
74+
border: none;
75+
border-radius: var(--radius);
76+
cursor: pointer;
77+
text-decoration: none;
78+
transition:
79+
background 0.2s,
80+
transform 0.15s;
81+
}
82+
83+
.privacy-footer .btn-agree:hover {
84+
background: var(--accent-hover);
85+
transform: translateY(-1px);
86+
}

frontend/html/home.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ <h2>Start a Video Call</h2>
9494
<span>Join Call</span>
9595
</button>
9696

97-
<div class="form-divider"><span>or share this room link after joining</span></div>
97+
<div class="form-divider">
98+
<span><a href="/privacy" class="privacy-link">Privacy Policy</a></span>
99+
</div>
98100

99101
<button id="supportBtn" class="support-btn">&copy; 2026 MiroTalk C2C</button>
100102
</form>

frontend/html/privacy.html

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<title>MiroTalk - Privacy Policy</title>
5+
6+
<meta charset="UTF-8" />
7+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
8+
<meta
9+
name="viewport"
10+
content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
11+
/>
12+
<meta
13+
name="description"
14+
content="MiroTalk C2C Privacy Policy – learn how we handle your data with minimal collection and end-to-end encryption."
15+
/>
16+
17+
<link rel="apple-touch-icon" href="../images/favicon.png" />
18+
<link rel="icon" type="image/x-icon" href="../images/favicon.ico" />
19+
<link rel="stylesheet" href="../css/home.css" />
20+
<link rel="stylesheet" href="../css/common.css" />
21+
<link rel="stylesheet" href="../css/privacy.css" />
22+
23+
<script async src="../js/stats.js"></script>
24+
</head>
25+
<body>
26+
<div class="privacy-container">
27+
<div class="privacy-header">
28+
<div class="privacy-logo">
29+
<a href="/"><img src="../images/logo.svg" alt="MiroTalk C2C" /></a>
30+
</div>
31+
<h1>Privacy Policy</h1>
32+
</div>
33+
34+
<div class="privacy-body">
35+
<p>
36+
<strong>Minimal Data Collection</strong><br />
37+
We collect only the minimal data required to provide real-time communication functionality in
38+
<strong>MiroTalk</strong>.
39+
</p>
40+
<p>
41+
<strong>Signaling Data</strong><br />
42+
<strong>MiroTalk</strong> is a real-time peer-to-peer WebRTC application. Establishing a connection
43+
requires temporary signaling data such as
44+
<a
45+
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate"
46+
target="_blank"
47+
rel="noopener noreferrer"
48+
>RTCICECandidates</a
49+
>
50+
and
51+
<a
52+
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCSessionDescription"
53+
target="_blank"
54+
rel="noopener noreferrer"
55+
>RTCSessionDescription</a
56+
>. This data is used only to negotiate the connection between peers.
57+
</p>
58+
<p>
59+
<strong>No Persistent Storage</strong><br />
60+
This signaling data is not stored in any persistent database and is discarded immediately after the
61+
session ends or the user leaves the call. <strong>MiroTalk</strong> does not retain chat, audio,
62+
video, or file transfer content.
63+
</p>
64+
<p>
65+
<strong>Encryption</strong><br />
66+
Media streams are transmitted directly between peers using WebRTC and are encrypted using
67+
<a
68+
href="https://en.wikipedia.org/wiki/Secure_Real-time_Transport_Protocol"
69+
target="_blank"
70+
rel="noopener noreferrer"
71+
>Secure Real-time Transport Protocol</a
72+
>
73+
(SRTP). Data channels used for chat and file sharing via
74+
<a
75+
href="https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel"
76+
target="_blank"
77+
rel="noopener noreferrer"
78+
>RTCDataChannel</a
79+
>
80+
are secured using
81+
<a
82+
href="https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security"
83+
target="_blank"
84+
rel="noopener noreferrer"
85+
>Datagram Transport Layer Security</a
86+
>
87+
(DTLS).
88+
</p>
89+
<p>
90+
<strong>Peer-to-Peer Architecture</strong><br />
91+
<strong>MiroTalk</strong> does not act as an intermediary for user communications. Audio, video,
92+
chat messages, and file transfers are exchanged directly between users and are not routed through or
93+
stored on <strong>MiroTalk</strong> servers.
94+
</p>
95+
<p>
96+
<strong>Recordings</strong><br />
97+
Meeting recordings (if enabled by the user) are temporarily stored in the user's browser as a
98+
<a
99+
href="https://developer.mozilla.org/en-US/docs/Web/API/Blob"
100+
target="_blank"
101+
rel="noopener noreferrer"
102+
>Blob</a
103+
>
104+
and downloaded locally to the user's device. <strong>MiroTalk</strong> does not have access to or
105+
store these recordings.
106+
</p>
107+
<p>
108+
<strong>Analytics</strong><br />
109+
We use Umami to collect aggregated, non-personal usage statistics to improve the service. This data
110+
is not used to identify users and is not sold or shared with third parties.
111+
</p>
112+
</div>
113+
114+
<div class="privacy-footer">
115+
<a class="btn-agree" href="/">AGREE</a>
116+
</div>
117+
</div>
118+
</body>
119+
</html>

frontend/js/client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* @license For private project or commercial purposes contact us at: license.mirotalk@gmail.com or purchase it directly via Code Canyon:
1010
* @license https://codecanyon.net/item/mirotalk-c2c-webrtc-real-time-cam-2-cam-video-conferences-and-screen-sharing/43383005
1111
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
12-
* @version 1.2.96
12+
* @version 1.2.97
1313
*/
1414

1515
const roomId = new URLSearchParams(window.location.search).get('room');

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mirotalkc2c",
3-
"version": "1.2.96",
3+
"version": "1.2.97",
44
"description": "A free WebRTC Cam-2-Cam browser-based video calls",
55
"main": "server.js",
66
"scripts": {

0 commit comments

Comments
 (0)