From 8d15b71c06646107c1bac214ec2318a8a900c00e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 23 Jun 2026 00:40:49 +0000 Subject: [PATCH 1/2] Initial plan From 3eb347da064aed990a17be3373322b1aec698041 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 23 Jun 2026 00:44:39 +0000 Subject: [PATCH 2/2] Rewrite Njal.la domain-setup instructions (no IP box, Name-field clarification, subdomain-or-domain) --- .../static/js/features.js | 53 ++++++++++++++----- app/sovran_systemsos_web/static/onboarding.js | 26 +++++---- .../templates/onboarding.html | 5 +- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/app/sovran_systemsos_web/static/js/features.js b/app/sovran_systemsos_web/static/js/features.js index 794a012..666f9c7 100644 --- a/app/sovran_systemsos_web/static/js/features.js +++ b/app/sovran_systemsos_web/static/js/features.js @@ -73,22 +73,47 @@ function openDomainSetupModal(feat, onSaved) { npubField = '
'; } - var externalIp = _cachedExternalIp || "your external IP"; + var introHtml; + if (_currentRole === "node") { + introHtml = + '

To enable ' + escHtml(feat.name) + ', it needs its own domain from Njal.la.

' + + '
    ' + + '
  1. Create an account at njal.la.
  2. ' + + '
  3. Set up a domain for it — either a free subdomain or a separate domain. Pick one option:
  4. ' + + '
'; + } else { + introHtml = + '

To enable ' + escHtml(feat.name) + ', it needs its own domain from Njal.la. ' + + 'In your Njal.la account, set up a domain for it — either a free subdomain or a separate domain. Pick one option:

'; + } $domainSetupBody.innerHTML = '
' + - '

Before continuing:

' + - '
    ' + - '
  1. Create an account at https://njal.la
  2. ' + - '
  3. 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.
  4. ' + - '
  5. In the Njal.la web interface, create a Dynamic record pointing to this machine\'s external IP address:
    ' + - '' + escHtml(externalIp) + '
  6. ' + - '
  7. Njal.la will give you a curl command like:
    ' + - 'curl "https://njal.la/update/?h=sub.domain.com&k=abc123&auto"
  8. ' + - '
  9. Enter the subdomain and paste that curl command below
  10. ' + + introHtml + + '
    ' + + 'Option A — Free subdomain (recommended)' + + '
      ' + + '
    1. In Njal.la, open a domain you own and click "Add record".
    2. ' + + '
    3. Set record type to Dynamic.
    4. ' + + '
    5. In the Name field, type ONLY the host part — the word before your domain.
      ' + + '(Example only, your choice — for "call.yourdomain.com" you'd type just:  call)
      ' + + '⚠ Do NOT type the full domain here — Njal.la adds it automatically.
    6. ' + + '
    7. A Dynamic record has NO IP field — the IP auto-fills after the rebuild/reboot.
    8. ' + + '
    9. Copy the curl command Njal.la gives you, e.g.:
      ' + + 'curl "https://njal.la/update/?h=call.yourdomain.com&k=abc123&auto"
    10. ' + '
    ' + + '
    ' + + '
    ' + + 'Option B — Separate / new domain' + + '
      ' + + '
    1. In Njal.la, buy the domain you want.
    2. ' + + '
    3. Add a Dynamic record as in Option A. If this domain is dedicated to the service, leave the Name field blank or use @.
    4. ' + + '
    5. Copy the curl command Njal.la gives you.
    6. ' + + '
    ' + + '
    ' + + '

    Below, enter the full domain for this service — a subdomain (e.g. call.yourdomain.com) or a separate domain (e.g. call.com) — and paste its curl command.

    ' + '
' + - '
' + + '
' + '

ℹ Paste the full curl command from your Njal.la dashboard\'s Dynamic record

' + npubField + '
'; @@ -103,7 +128,7 @@ function openDomainSetupModal(feat, onSaved) { ddnsUrl = ddnsUrl.trim(); npub = npub.trim(); - if (!subdomain) { alert("Please enter a subdomain."); return; } + if (!subdomain) { alert("Please enter a domain."); return; } if (feat.id === "haven" && !npub) { alert("Please enter your Nostr public key."); return; } var saveBtn = document.getElementById("domain-setup-save-btn"); @@ -159,14 +184,14 @@ function openDomainReconfigureModal(feat, existingDomain, onSaved) { '

Troubleshooting steps:

' + '
    ' + '
  1. Log into your Njal.la dashboard at https://njal.la
  2. ' + - '
  3. Find the DNS record for ' + escHtml(currentDomain || "your domain") + '
  4. ' + + '
  5. Find the DNS record for ' + escHtml(currentDomain || "your domain") + '. In Njal.la\'s Name field, note that only the host part is stored (the word before the domain) — not the full domain.
  6. ' + '
  7. Verify it has a Dynamic record pointing to your current external IP:
    ' + '' + escHtml(externalIp) + '
  8. ' + '
  9. If the IP is wrong or the record is missing, update it
  10. ' + '
  11. If you changed the DDNS curl command, paste the updated one below
  12. ' + '
' + '' + - '
' + + '
' + '

ℹ Paste the full curl command from your Njal.la dashboard\'s Dynamic record

' + npubField + '
'; diff --git a/app/sovran_systemsos_web/static/onboarding.js b/app/sovran_systemsos_web/static/onboarding.js index c103d50..2a23aa2 100644 --- a/app/sovran_systemsos_web/static/onboarding.js +++ b/app/sovran_systemsos_web/static/onboarding.js @@ -333,8 +333,6 @@ async function loadStep3() { return; } - var externalIp = (networkData && networkData.external_ip) || "Unknown (could not retrieve)"; - // Build set of enabled service units var enabledUnits = new Set(); (_servicesData || []).forEach(function(svc) { @@ -352,18 +350,24 @@ async function loadStep3() { html += '

No domain-based services are enabled for your role. You can skip this step.

'; } else { html += '
' - + 'Before you continue:' + + '

Sovran_SystemsOS uses Njal.la for domains and Dynamic DNS.

' + '
    ' - + '
  1. Create an account at https://njal.la
  2. ' - + '
  3. 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.
  4. ' - + '
  5. In the Njal.la web interface, create a Dynamic record pointing to this machine\'s external IP address:
    ' - + '' + escHtml(externalIp) + '
  6. ' - + '
  7. Njal.la will give you a curl command like:
    ' - + 'curl "https://njal.la/update/?h=sub.domain.com&k=abc123&auto"
  8. ' - + '
  9. Enter the subdomain and paste that curl command below for each service
  10. ' + + '
  11. Create an account at https://njal.la.
  12. ' + + '
  13. Buy at least one domain. Each service below needs its own domain — you can either give each service its own subdomain of a single domain you buy (subdomains are free, and one domain can have many), OR use a separate domain for each. Your choice.
  14. ' + + '
  15. For each service, add a Dynamic record in Njal.la:' + + '
      ' + + '
    • In the Njal.la Name field, type ONLY the host part — the word before your domain.
      ' + + '(Example only, your choice — for "call.yourdomain.com" you'd type just: call.)
      ' + + 'If you bought a whole separate domain just for this service, leave Name blank or use @.
      ' + + '⚠ Do NOT type the full domain in the Name field — Njal.la adds it automatically.
    • ' + + '
    • A Dynamic record has NO IP field. You don't enter an IP anywhere — it auto-fills once Sovran_SystemsOS updates it (on save, and again after reboot).
    • ' + + '
    ' + + '
  16. ' + + '
  17. Njal.la gives you a curl command like:
    ' + + 'curl "https://njal.la/update/?h=call.yourdomain.com&k=abc123&auto"
  18. ' + '
' + '
'; - html += '

Enter each fully-qualified subdomain (e.g. matrix.yourdomain.com) and its Njal.la DDNS curl command.

'; + html += '

Enter each service\'s full domain — a subdomain (e.g. call.yourdomain.com) or a separate domain (e.g. call.com) — and its Njal.la DDNS curl command.

'; relevantDomains.forEach(function(d) { var currentVal = (_domainsData && _domainsData[d.name]) || ""; html += '
'; diff --git a/app/sovran_systemsos_web/templates/onboarding.html b/app/sovran_systemsos_web/templates/onboarding.html index 685fee5..699a8ee 100644 --- a/app/sovran_systemsos_web/templates/onboarding.html +++ b/app/sovran_systemsos_web/templates/onboarding.html @@ -128,9 +128,8 @@

Domain Configuration

Sovran_SystemsOS uses Njal.la for domains and Dynamic DNS. - First, create an account at Njal.la and purchase a new domain, 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. - Then, in the Njal.la web interface, create a Dynamic record pointing to this machine's external IP address (shown below). - Finally, paste the DDNS curl command from your Njal.la dashboard for each service below. + Create an account at Njal.la, then for each service below, add a Dynamic record — no IP needed, it auto-populates once the DDNS curl command runs. + Paste the curl command from your Njal.la dashboard for each service.