Skip to content
← All posts

From Drupal to Bazo to Statamic: The TV2 Regionerne Story

I built two CMS platforms for Denmark's regional broadcaster. First Bazo, a headless Laravel + Nuxt system that replaced eight Drupal sites without downtime. Then Statamic, with 200+ core contributions and 40+ addons to make it scale horizontally on Kubernetes.

· 10 min read · Sylvester Damgaard
From Drupal to Bazo to Statamic: The TV2 Regionerne Story

I spent several years as Principal Architect at TV2 Regionerne, the regional arm of Denmark's largest commercial broadcaster. Eight regional news stations (TV2 Fyn, TV2 Østjylland, TV2 Kosmopol, TV Midtvest, TV SYD, TV2 ØST, and more), each with their own website, editorial team, and content workflows. When I joined, the sites ran on aging Drupal installations. Journalists fought the tools instead of focusing on stories.

Over my time there, I built two complete CMS platforms, migrated close to a million videos, and ran the Kubernetes infrastructure for all of it as a one-person ops team.

Chapter 1: Bazo

The first platform I built was Bazo, a headless CMS built in Laravel with a Nuxt.js frontend. The goal was to replace the eight Drupal sites with a modern, API-driven architecture that could share components across stations while letting each newsroom maintain editorial independence.

The hardest part was the migration. Eight Drupal sites with years of content, different schemas, different workflows, and different expectations. I migrated all of them to Bazo live, without downtime. No maintenance windows, no "please be patient while we update." Journalists kept publishing through the entire migration. Old URLs kept working. Search kept returning results. The switch happened behind their backs.

Bazo ran well for several years. The headless architecture gave the frontend team freedom to build fast, interactive experiences. The Laravel API layer handled content management, caching, and delivery.

Chapter 2: Statamic

Under new leadership, the priorities shifted. The headless architecture added complexity that a small team struggled to maintain. Two separate applications (Laravel API + Nuxt frontend) meant two deployment pipelines, two sets of dependencies, two things to debug when something broke at 2 AM on election night.

I proposed Statamic. A monolithic Laravel application with server-rendered templates, but with the editorial experience that journalists actually prefer. The CP is fast, intuitive, and doesn't require understanding API endpoints or JSON schemas.

The problem: Statamic wasn't built for the scale TV2 needed. It was designed for single-server deployments with flat-file storage. TV2 runs on Kubernetes with horizontal auto-scaling. Multiple pods need to share state. Cache invalidation across pods needs to be instantaneous. Content published on one pod needs to be visible on all pods within seconds.

I spent months contributing to Statamic core to make horizontal scaling possible. Over 200 pull requests. Fixes for race conditions in the Stache (Statamic's in-memory content cache). Database and Eloquent driver improvements so Statamic could share state across pods. Performance optimizations for large collections. Caching strategies that work when you have multiple pods behind a load balancer.

I couldn't have done this alone. Ryan Mitchell and Jack Sleight, both Statamic partners, deserve enormous credit here. Their deep knowledge of Statamic internals meant they could take my vision for horizontal scaling and execute large parts of it at the core level. I described what needed to change, contributed PRs where I could, and they did the heavy architectural lifting to make it real. That collaboration is why Statamic scales the way it does today.

Alongside the core contributions, I built 40+ custom addons under the tv2regionerne GitHub organization. Seven are free on the Statamic marketplace:

Plus dozens of internal addons: Bazo Import (migration tooling), Curated Collections, Locks, Collaboration Multiwindow, Events, Endless, and many more specific to broadcast workflows.

I've since taken over Reverse Relationship and Filter Builder and released them as Statamic 6 packages under my own Cbox marketplace, alongside Statamic MCP. The TV2 versions continue to run in production on Statamic 5.

Again, the migration from Bazo to Statamic happened live. No downtime. Journalists kept publishing. Old URLs kept working. Two zero-downtime CMS migrations in a row, both on my watch.

The Kubernetes infrastructure

I also built and operated the entire Kubernetes infrastructure for all TV2 Regionerne websites. As a one-person ops team. Kubernetes on Scannet KaaS, Fastly as CDN, S3 storage on a self-hosted Ceph cluster.

This is where the scale gets real. In a normal month: 1.74 billion requests, 266 TB bandwidth. The infrastructure handled election night traffic without breaking a sweat.

All of this ran on infrastructure I provisioned, monitored, and maintained. The auto-scaling policies, the caching strategies, the deployment pipelines, the monitoring dashboards. One person.

The video migration

I also migrated close to a million videos from one hosting provider to another, including a transcoding platform for archive content that significantly cut storage costs. That project has its own dedicated write-up.

What I took with me

TV2 taught me things I couldn't learn building smaller projects:

  • Journalists don't care about your architecture. They care about speed. How fast they can publish when news breaks. Every click, every page load, every save operation is measured in lost seconds during a breaking story.

  • Zero-downtime migrations aren't optional for news. A news site can't go dark for maintenance. If you can't migrate without downtime, you can't migrate.

  • One person can run production Kubernetes. It isn't comfortable, and I wouldn't recommend it, but it's possible. The key is automation and monitoring, not headcount.

  • Statamic scales. With the right contributions to core and the right addon architecture, it handles billions of requests per month. I presented these numbers at Laravel Live DK 2024 together with the Statamic team.

Several of the addons I built at TV2 now live under the Cbox GitHub org with Statamic 6 support. The patterns I learned about horizontal scaling, caching, and editorial workflows inform everything I build now.