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.