name.boxd.sh automatically — see HTTPS. Custom domains let you put your own domain in front of it instead, two ways:
- Per-machine: point one domain you own at a single machine (
app.example.com→myapp). - Org-wide (organizations only): delegate a wildcard subdomain to your whole org, so every machine gets its own name under it (
myapp.preview.mysaas.com,other-vm.preview.mysaas.com, …) with no per-machine setup.
Per-machine
1
Start adding the domain
myapp.boxd.sh already resolves to — boxd machine get myapp shows it too. The wildcard CNAME is required even if you don’t plan to use subdomains yet; it’s how the certificate gets issued (see below).2
Add those records at your registrar
Exactly as printed — don’t add anything else, and don’t delegate NS records for this one (that’s the org-wide flow, below).
3
Confirm
Same terminal, same command — it’s paused waiting for you. Once the records are live, press Enter. This is the point where boxd actually starts checking; nothing is created server-side before this.Scripting it instead of running it interactively? Pass
-y/--confirm up front and it skips the wait — only do this once the records are actually live:pending and a background check verifies DNS and issues the certificate, typically within a minute or two of the records actually resolving. Once both the apex and wildcard certs exist, it flips to active and starts routing.
Not available on a Tailscale-only org’s machines — the A record lives in your own DNS pointing at boxd’s public proxy, which can’t be repointed at a tailnet address. Org-wide vanity domains (below) don’t have this restriction.
Don’t test the domain before adding the DNS records. Public DNS resolvers cache a “this doesn’t exist” answer once they’ve seen it — sometimes for a while, independent of what the record’s own TTL says once it does exist. If you (or a browser, or a monitoring tool) look up the domain before the records are live, that negative answer can stick around and make a perfectly correct setup look broken for longer than it should. If a domain you just set up won’t resolve for you but boxd’s own check succeeds (console shows
active), it’s almost always this — try a different network, or a resolver you haven’t queried it from yet (e.g. explicitly set your browser to use 1.1.1.1 or 8.8.8.8 under “secure DNS” settings).Org-wide (vanity wildcard)
Requires being an org admin. One domain per org — the wildcard covers every machine, current and future, with no per-machine step.1
Start setting the domain
2
Delegate at your registrar
This is NS delegation, not an A/CNAME record — you’re handing off DNS authority for
preview.mysaas.com itself to boxd, which is what lets it mint a wildcard cert and answer for any subdomain under it automatically. Don’t delegate your whole domain’s apex, just this one subdomain.3
Confirm
Same terminal, same command — press Enter once delegation is live. For scripts, pass
-y/--confirm up front instead:<machine-name>.preview.mysaas.com in addition to <machine-name>.boxd.sh — the default domain never stops working. The bare vanity domain itself (preview.mysaas.com with no machine name) isn’t routed anywhere; there’s no “default machine” for it.
boxd.orgs.set_domain/get_domain/clear_domain). The console’s Domains page links there too, for anyone who lands on the per-machine flow looking for this instead.
Unlike per-machine custom domains, this works on a Tailscale-only org too — boxd-dns is authoritative for the delegated apex (that’s what NS delegation buys you), so it can serve the tailnet address instead of the public proxy IP.