- router.dnsProviders: named accounts at DNS providers, used by dynamic DNS and certificates (ddclient and lego provider lists in pkgs/router-webui/providers.json). Schema 2 migrates router.ddns. - router.acme: a Let's Encrypt certificate for the web UI via security.acme (DNS-01, resolver 1.1.1.1), served and reloaded by the web UI; Certificate page. - Web UI: password change (web UI and root), reboot button, HTTP to HTTPS redirect (router.webui.httpPort), grouped menu. - Latest kernel (linuxPackages_latest); 7.3 and 7.3.0 are the same kernel for the reboot hint. - SPECS.md: wanted later (REST API, GraphQL, MCP). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeFqV9dZrK6nipHkPfyM4F
settings.json migrations
settings.json carries a top-level "version" (absent means 0). When a
release changes what settings.json may contain (a renamed or removed option, a
new default that must be written down), add N.jq here, where N is the next
number after the highest one. The file is a jq program that turns a version
N-1 document into a version N document; keep unknown keys as they are.
router-update runs the missing ones, in order, on the router's settings.json
before it rebuilds, and sets "version" after each. A release's schema version
is the number of N.jq files; the build refuses settings that are not at that
version, so a router never builds settings its release does not understand.
Example 1.jq, renaming router.wan.interface to router.wan.device:
.router.wan |= (.device = .interface | del(.interface))