- Client
- Kindling Media
- Industry
- Media
- Year
- 2025
- Duration
- 9 months
- Team
- 7 engineers, 2 designers
- Services
- Web platforms · Design systems · Support & maintenance
Kindling ran 40 local titles across 12 CMS installs, four of them unsupported. We consolidated them onto a single publishing pipeline without losing a URL.
The product
Rebuilt interface, live figures. Everything below is the shipped surface, not a concept.
Titles live
40
In the queue
18
Edge purge
1.9s
Council budget notes
Ferry timetable
Budget explainer
Harbour levy vote
Weekend long read
Flood defences ruling
Transit strike, day 3
Syndication — transit strike, day 3
days to launch a new title
Kindling had grown by acquisition and inherited twelve CMS installs, four of them on versions with no upstream support left. An editor moving between titles relearned the tool each time, and a national story got pasted into six systems by hand on deadline. A platform-wide change was not slow, it was impossible — and two of the titles were one unpatched dependency away from becoming a story themselves.
One publishing core with per-title theming instead of forty codebases, so a template change lands everywhere at once. Content moved title by title through an importer that preserved every canonical URL and redirect, verified against a crawl of 1.4 million live pages before each cutover; we ran the same crawl after, and the diff was the go/no-go. Editors got a single composer with syndication built in — write once, push to any title, local edits tracked separately so a regional desk can rework a headline without fighting the national one. Delivery is edge-cached with per-title tag invalidation, so a correction purges in under two seconds instead of waiting out a TTL. We migrated the smallest title first to learn on, and the loudest one fourth, once the importer had stopped surprising us.
All forty titles were on the shared pipeline in nine months with zero redirect regressions in the post-launch crawl. Launching a new title went from eleven weeks to three days, which changed the commercial conversation more than anything technical we did. Infrastructure spend per million monthly readers fell 61%. The platform runs under a managed support plan with a fifteen-minute P1 response, and the four unsupported CMS installs are switched off.
Solid lines carry request traffic. Dashed lines are asynchronous — replication, shadow reads and audit trails that must never sit on the critical path.
export function resolve(legacy: LegacyUrl): Redirect | null { const hit = redirects.get(normalise(legacy.pathname)) if (!hit) return null return { to: new URL(hit.path, originFor(hit.titleId)).toString(), status: hit.permanent ? 301 : 302, }}Every legacy URL keeps resolving. The crawl diff before and after each title's cutover was the go/no-go.
Title twenty-seven of forty. The crawl diff was the go/no-go.
Local titles on one publishing pipeline, migrated in nine months
To launch a new title, down from eleven weeks
Lower infrastructure spend per million monthly readers
Figures reported by Kindling Media after launch.
- 01Single publishing core with per-title theming and shared templates
- 02URL-preserving importer verified against a 1.4M-page crawl
- 03Cross-title syndication with local edits tracked separately
- 04Edge-cached delivery with per-title tag invalidation under 2s
- 05Managed support plan with a fifteen-minute P1 response
- Next.js
- TypeScript
- Node
- PostgreSQL
- Cloudflare
- S3
- Sentry
“Forty newsrooms, one pipeline, and not a single broken link in the crawl. The migration was the least dramatic thing that happened to us that year.”