Engineering · Dec 18, 2025 · 4 min read
Why our blog ships from TypeScript and not a CMS
Yes, this blog. Why we keep posts in TypeScript, what it costs us, and what we'll switch to (and when).
Mushfique Raiyan
Lead Full Stack Engineer
This blog you are reading lives in a TypeScript file. Each post is an object in an array, with a slug and a title and a body string. There is no CMS, no Markdown loader, no MDX pipeline, no headless contentful sanity datocms strapi.
This is intentional, for now. We post about once a month. Adding a CMS would mean adding a dependency, a build step, an editor login, a content review flow, and a place where things go stale. For ten posts a year, none of that earns its keep.
The line we will cross when this changes: when more than one person is writing weekly. At that point we will add Supabase as the backend, build a thin admin, and migrate the array. The blog post you are reading will be the last one shipped from a TypeScript file. Probably.
Like what you're reading?
Get one studio dispatch a month, no tracking pixels, unsubscribe in one click.
Related reading
Engineering · 9 min
Edge personalization without writing another Jamstack blog post
How we run real per-user personalization at the edge on Vercel, geographic, behavioural, and A/B, without a CDN cache flush.
Engineering · 8 min
The actual cost of choosing an ORM
We use raw SQL via the Supabase client. Here's why the ORM tax is real, and the four cases where Drizzle or Prisma still wins.