Skip to main content
Contact
Engineering

Typed content collections beat a CMS for the first year

Reaching for a CMS on day one is the default, and for most projects it is early. A schema-validated content directory buys you the same guarantees with a fraction of the surface area.

  • Elliot Shaw
2 min read

The argument for a CMS is that non-technical people need to edit content. It is a good argument. It is also, for most projects in their first year, answering a question nobody has asked yet.

What you are actually buying

A CMS bundles several things that are worth separating:

  • A schema for your content.
  • An editing interface.
  • A hosting and access-control layer.
  • A publishing workflow.

The first is the one you need immediately. The other three become valuable at the point where someone outside the build team is editing regularly — which, on a project that is still finding its shape, is often several months after launch.

The version with less surface area

A content directory with a validated schema gives you the first item outright:

const blog = defineCollection({
  loader: glob({ pattern: "**/[^_]*{md,mdx}", base: "./src/data/blog" }),
  schema: ({ image }) =>
    z.object({
      title: z.string(),
      description: z.string(),
      pubDate: z.coerce.date(),
      heroImage: image(),
      categories: z.array(z.string()).min(1),
    }),
});

Bad frontmatter now fails the build rather than rendering an empty element in production. That is the same guarantee a CMS’s required-field validation gives you, enforced earlier and with nothing to host.

You also get content in version control, which is a bigger deal than it sounds: a content change and the code change that supports it land in the same commit, review together, and revert together.

When to actually migrate

The signal is not “someone asked for an editor”. It is someone outside the build team is blocked. Until that is true, the editing interface is a cost with no user.

When it does become true, a schema-validated directory is close to the easiest thing in the world to migrate from — the schema is already written down, the content is already structured, and the mapping is mechanical. Starting with a CMS and discovering the schema was wrong is the migration that actually hurts.

Elliot Shaw

Head of platform. Spends most of his time on the unglamorous half — build pipelines, deploy gates, and the difference between a fast site and a site that stays fast.

More from Elliot Shaw
All posts

Ready to get off the ground?

Tell us what you're building. We'll tell you how we'd approach it — no pitch deck required.

Book a call