Skip to main content
Site

Engineering

Why we built our own marketing platform

On the trade-offs behind rolling our own Astro-based stack instead of reaching for an off-the-shelf CMS.

Editorial 1 min

Every few months someone asks the obvious question: why not just use an existing CMS? It’s a fair challenge, and one we took seriously before writing a single line of code. Here’s the short version of how we landed where we did.

The trouble with one-size-fits-all

Off-the-shelf platforms are excellent at the 80% case. The remaining 20% — multi-brand theming, typed content contracts, AI-assisted authoring, predictable performance budgets — is exactly where most of our clients live. We kept hitting the same wall:

  1. Content models would balloon into a thicket of optional fields.
  2. Brand tokens would drift from the design system within a release or two.
  3. Editorial workflows would devolve into copy-pasting between tools.

We didn’t want a platform that could do everything. We wanted one that did the right things by default.

What we chose instead

We built on top of a small, opinionated set of tools:

  • Astro for content-first rendering and zero-JS-by-default pages.
  • Zod schemas as the single source of truth for every content type.
  • Design tokens as plain CSS variables, generated from a per-site tokens.ts.
  • A shared design system that every site consumes — no forks, no drift.

The result is a stack that feels boring in the best possible way. Adding a new site is a matter of supplying tokens and content; adding a new content type means writing a schema and a template, then watching it appear consistently across every property.

What’s coming

Next on the roadmap: a richer landing-page builder, first-class A/B testing primitives, and a content authoring assistant that respects our schemas instead of fighting them. We’ll write up each piece as it ships.

  • #astro
  • #architecture
  • #design-systems