All ten
Content Studio logo

Content Studio

Headless publishing platform and editorial app

Architecture, migration, API, reader, editorial app

Private — public soon

A publishing platform born out of a rescue: a long-running news site on a legacy PHP stack, with roughly 100,000 articles, 65 GB of media and two decades of search ranking that could not be put at risk. The archive moved to a modern content model behind an API, the public site became statically generated and fast, and the editorial tool built along the way became a product in its own right.

Public readerEditorial studioREST APIEdge media workers
~100,000articles migrated
65 GBmedia re-processed
legacy → edgeplatform jump
0URLs lost

Screens

legacy CMS PHP · MySQL migration one-way, never deployed canonical model PostgreSQL + Drizzle Astro reader static + ISR at the edge Content Studio block editor, packaged ~100,000 articles · 65 GB media · every legacy URL preserved
Migration and delivery path

Key engineering

100K-row content migrationURL / SEO equity preservationcanonical content modelstatic generation + ISRedge media pipelineblock-based editor architecturedisposable migration tooling

Under the hood

Architecture

Headless: a read-mostly public API with a statically generated reader in front of it, and the editorial application as a separate client. The migration tooling was built as a one-way pipeline and deliberately kept disposable.

Data & state

A canonical content model the legacy archive was mapped onto, rather than the old schema carried forward. Media re-processed into object storage and served from the edge.

Runs on

Pages generated ahead of time and revalidated, served from the edge. Uploads and media transforms run as their own edge workers, keeping the API out of the media path.

Operational risk

Two decades of accumulated search authority was the constraint that could not be undone: every old address had to keep resolving. An archive that size is messy in ways that only appear at volume, so the migration was rehearsed repeatedly and validated against the live site before it became the live site.

Stack

Reader
AstroSSG + ISRedge deliverystructured data
Studio
Reactblock editor packagesown UI primitivesTanStack Query
API
Honolayered modulesZodpublic read + authenticated write
Data
PostgreSQLDrizzlecanonical content modelone-way migration pipeline from legacy MySQL
Edge
Cloudflare Workers (uploads, media)R2TurborepoNode 24pnpm

What it took

  • Search ranking was the hard constraint. Two decades of accumulated authority meant every old address had to keep working and every page stay legible to search engines — the part of a move like this where a mistake is expensive and slow to undo.
  • Twenty years of archive is its own problem. Old content is messy, inconsistent and full of edge cases; most of the effort went into making it clean enough to build on, with the migration tooling deliberately kept disposable.
  • The editorial tool outgrew the project. It was separated from the site it was built for, so it can serve another publisher without a fork.
  • Readers feel the result. Pages are generated ahead of time and served from the edge, so the site is fast everywhere — including on the phones most of its readers use.