What changed, and why
Third verse, and the last one for static workloads: static.mseeks.me leaves the zo-k8s cluster for Vercel. Terraform keeps only the DNS record, the infra/k8s/static stack is retired, and — the part with teeth — the read-thru publishing flow in CLAUDE.md loses a step. Deploying a guide used to mean pushing the static repo's main and then running the stack's install.sh against the cluster. Now the push is the deploy.
After cutover the cluster serves exactly one thing: Everwhen, plus its PR previews. (The models.mseeks.me dashboard and the tailscale egress were retired in the parallel #24 while this PR was in flight.) Every plain static site now lives on Vercel, dashboard-managed, with Terraform holding the DNS and nothing else. The app-repo half of this move is mseeks/static#1.
dns.tf: the last static A record becomes a CNAME
Identical mechanics to glassbox: subdomain, type change, forced replacement. The committed value is the project's own target, issued by the dashboard when the domain was added — the same per-project scheme both prior migrations got. The record comment says where a fresh value comes from if the Vercel project is ever recreated, and the apply waited until the domain was attached.
The rewritten record: comment, CNAME, stable-target TTL.
infra/dns.tf · 383 lines
⋯ 113 lines hidden (lines 1–113)
⋯ 252 lines hidden (lines 132–383)
The stack retired, the docs re-pointed
Five files under infra/k8s/static/ go, the same census as glassbox and 2ls before it (namespace; nginx Deployment + Service; single-host Ingress with its cert; install script; README). The live namespace waits for cutover.
The doc sweep has a different center of gravity this round: beyond the usual example re-pointing, it reaches CLAUDE.md, because the read-thru workflow itself changes:
| file | swap |
|---|---|
CLAUDE.md | read-thru deploy step: push static's main, ~~then run install.sh~~ — the push deploys |
cert-manager/README.md | live example → everwhen's Ingress (playeverwhen.com → playeverwhen-com-tls) |
ingress-nginx/README.md | example Ingress host → playeverwhen.com |
everwhen/README.md | drops "Unlike static…" — nothing static is left to compare to |
dns.tf (comment) | hairpin host list drops static |
The simplified read-thru flow: write the guide, push, done.
CLAUDE.md · 90 lines
⋯ 71 lines hidden (lines 1–71)
⋯ 15 lines hidden (lines 76–90)
Verification, and the cutover runbook
terraform fmt -check, init, and validate pass on the branch, and the targeted plan shows exactly the one intended action:
mseeks_me_staticmust be replaced —type: "A" -> "CNAME"(forces replacement),value: "174.138.116.75" -> "a4cfcb8c32267377.vercel-dns-017.com.",ttl: 300 -> 3600. Plan: 1 to add, 0 to change, 1 to destroy.
The known DOKS patch-bump drift stays out of scope, as in both prior migrations.
The cutover, in order:
1. Import mseeks/static in the Vercel dashboard (vercel.json carries build command and output directory — no dashboard config), let it deploy, attach static.mseeks.me. The dashboard mints the project's CNAME target at that moment; the committed value is the one it issued. 2. Merge both PRs; apply the targeted record change. 3. Verify: the root listing renders, a shared read-thru clean URL serves its page, server: Vercel — and the guide refreshes that were queued behind the old rollout step appear. 4. kubectl delete namespace static; prune branches, bump the submodule pointer.