diff --git a/docs/screenshots/domain-verification.png b/docs/screenshots/domain-verification.png index a125ace..41c2b69 100644 Binary files a/docs/screenshots/domain-verification.png and b/docs/screenshots/domain-verification.png differ diff --git a/docs/screenshots/home.png b/docs/screenshots/home.png index 25fa8dc..4d26a00 100644 Binary files a/docs/screenshots/home.png and b/docs/screenshots/home.png differ diff --git a/router_dyndns/ddns.py b/router_dyndns/ddns.py index 824c279..42af83d 100644 --- a/router_dyndns/ddns.py +++ b/router_dyndns/ddns.py @@ -664,21 +664,40 @@ def _render_public_home( {created_html}
-
-
-

Create in one step

+
+

Choose your hostname

No account. No login.

-

The generated URL is the secret. FRITZ!Box replaces <ipaddr> and calls it when your public IP changes.

- +
+
+
+

Use our domain

+

Generate a KarlDNS hostname

+

KarlDNS generates the hostname, secret update URL, and optional router compatibility credentials automatically.

+
+ +
+
+
+
+
+

Use your own domain

+

Verify DNS ownership

+

Add one TXT record so KarlDNS can confirm you control the domain before it publishes A/AAAA records there.

+
+ + +
+
-
-

KarlDNS generates the hostname, secret update URL, and optional router compatibility credentials automatically.

- -
+
@@ -729,20 +748,21 @@ def _top_nav(label: str | None = None, links: str = "") -> str: def _custom_domain_flow(service: DdnsService, challenge: dict[str, str | None] | None, message: str | None) -> str: + if not challenge: + return "" challenge_html = "" create_form = "" - if challenge: - domain = html.escape(str(challenge["domain"])) - token = str(challenge["token"]) - claim_secret = html.escape(str(challenge.get("claim_secret") or "")) - verification_name = service.verification_name(str(challenge["domain"])) - claim_url = service.domain_claim_url(challenge) - status = html.escape(message or "Add this TXT record at your DNS provider, then check when it has propagated.") - txt_bundle = f"TXT name: {verification_name}\nTXT value: {token}" - challenge_html = f""" -
+ domain = html.escape(str(challenge["domain"])) + token = str(challenge["token"]) + claim_secret = html.escape(str(challenge.get("claim_secret") or "")) + verification_name = service.verification_name(str(challenge["domain"])) + claim_url = service.domain_claim_url(challenge) + status = html.escape(message or "Add this TXT record at your DNS provider, then check when it has propagated.") + txt_bundle = f"TXT name: {verification_name}\nTXT value: {token}" + challenge_html = f""" +
- 2 + 1

Add the TXT record

{status}

TXT name and value are public DNS records. The private claim link is secret.
@@ -758,11 +778,11 @@ def _custom_domain_flow(service: DdnsService, challenge: dict[str, str | None] |
""" - if challenge.get("verified_at"): - create_form = f""" -
+ if challenge.get("verified_at"): + create_form = f""" +
- 3 + 2

Create router hostname

@@ -776,11 +796,11 @@ def _custom_domain_flow(service: DdnsService, challenge: dict[str, str | None] |
""" - else: - create_form = """ -
+ else: + create_form = """ +
- 3 + 2

Create router hostname

This unlocks after the TXT record is visible in public DNS.

@@ -789,27 +809,13 @@ def _custom_domain_flow(service: DdnsService, challenge: dict[str, str | None] | return f"""
-
-
-
-

Direct custom-domain publishing

-

Verify DNS ownership

-

Use this only when KarlDNS should publish A/AAAA records directly inside your domain. If you just want your own subdomain, generate a hostname above and create a CNAME to it.

-
+
+
+

Direct custom-domain publishing

+

Verify DNS ownership

+

Use this only when KarlDNS should publish A/AAAA records directly inside your domain. If you just want your own subdomain, generate a hostname above and create a CNAME to it.

-
-
-
- 1 -

Enter domain

- - - - -
-
+
{challenge_html} {create_form}