Every project ships on a free {slug}.nookdocs.site subdomain. Adding a custom domain is a 3-step flow: type the hostname in the dashboard, copy the DNS record, wait for verification. SSL provisions automatically. This page covers every edge case we've hit: apex domains, CAA records, Cloudflare proxy mode, multi-domain setups, and canonical URL handling for SEO.
Why use a custom domain
Brand consistency
docs.acme.com reads as part of your product; acme-docs.nookdocs.site reads as a third-party tool.
SEO authority
Backlinks accrue to your apex domain, not ours. Custom domains compound your organic search.
User trust
Users are trained to verify the domain bar. A branded host is one fewer phishing signal.
Pick the host shape
Two shapes work out of the box. Pick based on where your docs live in your information architecture.
Subdomain — docs.acme.com
A subdomain of your apex. Add a CNAME record, we verify it, SSL provisions automatically. 90% of setups look like this.
Subpath — acme.com/docs
Hosts your docs as a path prefix of your marketing site. Requires a reverse proxy rule in front of your site. Advanced — see subdomain for the split.
Add via the dashboard
Open Settings → Custom domains
Scroll to Custom domains. Empty when you've only been using the default subdomain; otherwise you'll see existing domains with verification state.
Enter your hostname
Type docs.acme.com (or whatever you own) and hit Add. Each project can carry multiple custom domains simultaneously — e.g. docs.acme.com + docs.acme.dev + a regional help.acme.eu — each with its own verification state. Mark one as Primary (see canonical URLs below) and the rest stay aliased.
Copy the DNS record we show you
You'll see something like:
Type : CNAME
Host : docs
Value : cname.nookdocs.site
TTL : 3600 (or Auto)Copy the Value field — that's what your DNS provider needs.
Add the record at your DNS provider
Open Cloudflare / Route 53 / DNSimple / GoDaddy / Google Domains / Namecheap and paste the CNAME record as shown. Save.
Wait for verification
Our checker polls DNS every 5 seconds for up to 60 seconds. When it catches the propagated record, the domain flips from Pending to Active and SSL provisioning kicks off.
DNS record reference
CNAME — the default case
docs.acme.com. IN CNAME cname.nookdocs.site.CNAMEs are the simplest case — your provider routes docs.acme.com through us, and everything (TLS, headers, caching) flows end-to-end.
Don't create an A record as well. CNAME + A on the same hostname is invalid per RFC 1034 and most providers reject it.
CAA — required when you have one
If your domain already has a CAA record, it must allow Let's Encrypt. Otherwise our cert issuance fails silently.
acme.com. IN CAA 0 issue "letsencrypt.org"Check your current CAA:
dig acme.com CAA +short
# → 0 issue "digicert.com" ← blocks Let's Encrypt
# → no output ← no CAA, any issuer allowed ✓If you see an existing issue entry, add Let's Encrypt alongside it:
acme.com. IN CAA 0 issue "digicert.com"
acme.com. IN CAA 0 issue "letsencrypt.org"Apex domain (acme.com)
Apex domains — the bare root without any subdomain — can't use CNAMEs per the DNS spec. Three options, from best to worst:
ALIAS / ANAME / flattening (recommended)
Modern providers (Cloudflare, DNSimple, Route 53) offer a CNAME-like record at the apex that resolves to the target's current IPs on every query.
acme.com. CNAME cname.nookdocs.site. ; proxy: OFFCloudflare users — keep the proxy off. The orange cloud (proxied mode) breaks the SSL handshake by terminating TLS at Cloudflare. Set the record to "DNS only" (grey cloud) so traffic flows end-to-end.
A record fallback
If your provider doesn't support ALIAS, fall back to A records pointing at our published IPs:
acme.com. IN A 76.76.21.21Downsides: IPs can change (90 days notice), and single-A means no multi-region failover. Prefer ALIAS when available.
Subdomain redirect
Dodge the problem entirely — keep your apex as your marketing site, and run docs on a subdomain:
acme.com → www.acme.com (marketing)
docs.acme.com → NookDocs (this guide)SSL
SSL certificates auto-provision via Let's Encrypt (issued through Vercel's edge) the moment verification succeeds.
First issuance — usually under 30 seconds after the DNS record goes green.
Renewal — automatic, ~30 days before expiry.
Issuer — Let's Encrypt R3.
Reserved path —
/.well-known/acme-challenge/*is reserved for the challenge handshake; don't configure your docs to write content to that path.
Multiple domains per project
Add more than one custom domain to the same project — e.g. regional domains or migration scenarios where both old and new domains need to serve during a cutover.
docs.acme.com primary ✓ active
docs.acme.dev ✓ active
help.acme.eu ✓ active
acme.nookdocs.site default ✓ activeAll active domains serve the same content. The primary domain drives canonical URLs — see below.
Canonical URLs for SEO
When you have multiple domains serving the same docs, search engines need one canonical URL per page to avoid duplicate-content penalties. NookDocs picks the canonical automatically in this priority order:
The domain marked Primary in Settings → Custom domains
The first verified custom domain in the list
The default
{slug}.nookdocs.sitesubdomain
Every rendered page ships <link rel="canonical" href="https://{canonical-host}/{path}"> so Google/Bing know which URL to index. Override site-wide via nookdocs.config.json:
{
"seo": {
"metatags": {
"canonical": "https://docs.acme.com"
}
}
}See SEO for the full indexing + sitemap + robots story.
Cloudflare-specific gotchas
Vercel verification (if your DNS is managed on Vercel)
Vercel-hosted DNS adds a TXT record during verification. If you manage your DNS on Vercel (most users don't — this is an edge case), you'll see a prompt asking you to add:
_vercel.acme.com. IN TXT "vc-domain-verify=docs.acme.com,abc123..."Paste into Vercel's DNS panel. We detect the record, verification completes, the TXT record can stay (harmless) or be removed.
Troubleshooting
Related
Subdomain vs subpath —
docs.acme.comvsacme.com/docstrade-offsSEO — canonical URLs + sitemap + robots behaviour
Site settings —
seo.metatagsfor canonical overrideCustom domain (config reference) — field-by-field config reference