Skip to content

Why I picked MDX over Notion as my CMS

Kevin TrinhApril 5, 2026

Notion is a great writing surface and a terrible runtime. Here's why this site uses git-tracked MDX files instead, and when I'd flip the call.

Why I picked MDX over Notion as my CMS

I almost shipped this site with Notion as the CMS. Then I built a tiny prototype, profiled it, and went back to MDX. Here's the call.

What I tried with Notion

  • Pull pages via the public Notion API.
  • Cache the JSON in Cloudflare KV with a 1-hour TTL.
  • Render the block tree as React components.
  • Trigger a re-fetch via a webhook from Notion when a page changes.

It worked. Articles loaded fast on a warm cache. But three things bugged me.

What broke

What MDX gives me back

  • Build-time everything. Articles are bundled into the worker. Cold first request = same as warm.
  • Code blocks are first-class. Shiki + line numbers + custom languages just work.
  • Custom components. I can drop <Callout>, <YouTube>, <Tweet>, <Figure> directly into prose without an export step.
  • Git is the audit log. Every edit has a diff and a timestamp.

When I'd flip the call

  • More than one author who doesn't want to touch git.
  • Phone-first writing (although Working Copy + GitHub is fine for me).
  • Editorial workflow with reviewers, drafts, scheduling.

For a single-author dev blog where the writer already lives in their editor? MDX wins.