TypeScript manifest: tight loop, strong types
The manifest is a single .ts file with a typed array of slugs. Every editorial change is a git commit; the diff shows exactly what changed. The Next.js build catches schema violations at compile time; our build-time validator catches mediocrity (citation count, body length, em-dash usage) before deploy. The loop from edit to preview is whatever your dev server's hot-reload time is, typically two to four seconds. The cost is that non-engineers cannot edit; the benefit is that the editorial state in source control is the production state, byte-for-byte, with no drift.
Headless CMS: scale and accessibility
A CMS lets a non-technical author edit a leaf without filing a PR. Above two hundred leaves with three or more authors, this is the only sustainable shape; the PR queue becomes the bottleneck otherwise. The trade-off is two surfaces of state: the CMS database and the deployed front-end. They will drift unless you wire revalidation hooks and treat the CMS as the source of truth. The drift risk is real; we have seen a Sanity-backed surface ship a half-updated set of leaves because the webhook fired before the editor finished a transaction.
The crossover point and the migration path
Our heuristic: under one hundred fifty leaves with one or two authors, TypeScript. Over two hundred leaves or three plus authors, CMS. The hundred-fifty-to-two-hundred band is a judgment call; if the authors are technical, stay on TypeScript. The migration path from TypeScript to CMS is straightforward: dump the manifest to JSON, ingest into the CMS as initial content, switch the page renderer to fetch at build time from the CMS instead of importing the manifest. The reverse migration (CMS to TypeScript) is harder because you lose the editorial UX. Pick the right shape at the start.
