From 82a62218800b29af46119e0fd2223f82211cfb04 Mon Sep 17 00:00:00 2001
From: Sovran Systems <99053422+naturallaw777@users.noreply.github.com>
Date: Sat, 13 Jun 2026 11:50:43 -0500
Subject: [PATCH] Clarify Element Calling 30000-40000 range needs separate TCP
and UDP forwards
The onboarding Step 4 port table listed the 30000-40000 TURN relay range as a
single "TCP/UDP" row, which is ambiguous on most routers where TCP and UDP
forwards are separate entries. Split it into two explicit rows (TCP and UDP),
add a clarifying note, and update the totals so users create both forwarding
rules.
---
app/sovran_systemsos_web/static/onboarding.js | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/app/sovran_systemsos_web/static/onboarding.js b/app/sovran_systemsos_web/static/onboarding.js
index 30dd1b8..fbabcf0 100644
--- a/app/sovran_systemsos_web/static/onboarding.js
+++ b/app/sovran_systemsos_web/static/onboarding.js
@@ -355,9 +355,9 @@ async function loadStep3() {
+ 'Before you continue:'
+ '
Purchase a new domain on Njal.la, or create a subdomain from a domain you already own. Tip: Subdomains are free to create — you only need to purchase one domain, and you can add as many subdomains as you need at no extra cost.
'
+ + '
Purchase a new domain on Njal.la, or create a subdomain from a domain you already own. Tip: Subdomains are free to create — you only need to purchase one domain, and you can add as many subdomains as you like.
'
+ '
In the Njal.la web interface, create a Dynamic record pointing to this machine\'s external IP address: '
- + '' + escHtml(externalIp) + '
'
+ + '' + escHtml(externalIp) + ''
+ '
Njal.la will give you a curl command like: '
+ 'curl "https://njal.la/update/?h=sub.domain.com&k=abc123&auto"
'
+ '
Enter the subdomain and paste that curl command below for each service
'
@@ -370,7 +370,7 @@ async function loadStep3() {
html += '';
html += '';
html += '';
- html += '';
+ html += '';
html += '
ℹ Paste the curl URL from your Njal.la dashboard\'s Dynamic record
';
html += '';
html += '';
@@ -551,7 +551,7 @@ async function loadStep4() {
// Optional ports table
html += '
';
html += '
Optional — Only needed if you enable Element Calling:
';
- html += '
These 5 additional port openings are required on top of the 3 required ports above.
';
+ html += '
These additional port openings are required on top of the 3 required ports above.
';
html += '
';
html += '
Port
Protocol
Forward to
Purpose
';
html += '';
@@ -559,14 +559,16 @@ async function loadStep4() {
html += '
7882
UDP
' + ip + '
LiveKit media (UDP mux)
';
html += '
5349
TCP
' + ip + '
TURN over TLS
';
html += '
3478
UDP
' + ip + '
TURN (STUN/relay)
';
- html += '
30000–40000
TCP/UDP
' + ip + '
TURN relay (WebRTC)
';
+ html += '
30000–40000
TCP
' + ip + '
TURN relay (WebRTC) — TCP rule
';
+ html += '
30000–40000
UDP
' + ip + '
TURN relay (WebRTC) — UDP rule
';
html += '
';
+ html += '
ℹ The 30000–40000 range must be forwarded for both TCP and UDP. On most routers these are two separate forwarding rules.
';
html += '
';
// Totals
html += '
';
html += 'Total port openings: 3 (without Element Calling) ';
- html += 'Total port openings: 8 (with Element Calling — 3 required + 5 optional)';
+ html += 'Total port openings: 9 (with Element Calling — 3 required + 6 optional; the 30000–40000 range counts as one TCP rule and one UDP rule)';
html += '