Programmatic control of the DNS records for our farm domains. Each Homelab owns a domain whose records must be set in code — a `drop.<domain>` record for the upload bot, the apex pointed at the home IP, service subdomains, and eventually a whole Homelab provisioned from a form in The Guide. This is the plan for the DNS Module that does it, and how we call it.
## Why in Code
Clicking through a registrar's web UI does not scale to a co-operative of Homelabs, each with its own domain. This is the DNS limb of the one-domain-per-Homelab shape behind Federated Pinning Service and the Hitchhiker Embassy.
## Off Dynadot, Onto deSEC
The premise "build a Dynadot module" was forced by Dynadot's weak API — no Rust, Go or C# client exists, and its `set_dns2` overwrites the whole record set. So we move DNS *hosting* to **deSEC**: a non-profit, privacy-by-design service with a clean REST API, automatic DNSSEC, and a Caddy DNS module. Registration stays at Dynadot; only the nameservers change, and it is reversible. The deSEC Migration page has the steps; the win is on DNS Module.
## How We Call It
One question drives the design: where does the module *run*? The answer is **core plus adapters**: a portable TypeScript core (provider-abstracted, deSEC first), a **Rust component on the Spin server** as the canonical sandboxed service, and The Guide as the consumer. The full comparison is on Calling the Module.
## The Cluster
- DNS Module — the provider-abstracted core: a `DnsProvider` interface, deSEC first - deSEC Migration — moving DNS hosting off Dynadot, reversibly, and the DNS-01 win - Calling the Module — FastAPI vs wiki plugin vs Spin vs the Guide, and the decision - WASM on Spin — the Fermyon Spin trial: a Rust component sandboxed to deSEC - The Guide — the desktop application that manages the farms, local and hosted
## Links
## See - DNS Module · deSEC Migration · Calling the Module · WASM on Spin · The Guide - Federated Pinning Service — the sibling limb of the same co-operative - Caddy — the front door each Homelab's domain terminates at
# Assets
farm-dns-automation