Back to writing

Why I don't use a CMS

Framer / Webflow / WordPress look faster, but they lock up your content, take a cut, and own your SEO. MDX + git once, forever.

I used Notion for 5 years to write blog posts, WordPress for 3 years for client case studies, Ghost for 1 year for a newsletter. I regretted every one.

The “fast” of a CMS is sugar for the first project

A CMS looks fast: sign up, pick a template, drag blocks, live. But the costs that don’t show up in the first two months:

  • Content locked in the platform’s database → export gets you Markdown / HTML, styles all gone
  • Platform takes a cut / monthly fee → writing a 1000-word blog post, the platform skims 5%
  • Styling changes require a paid plan → want dark mode? upgrade to Pro $20/mo
  • SEO is gated by the platform → your title, meta, structure: you wrote it, the platform doesn’t always listen
  • Platform policy changes → suddenly disallows a class of content, all your work is gone

Framer / Webflow solved the “writing” part, but didn’t solve the “I want to own my stuff” problem.

What I actually want

  • Content is plain text + Markdown, tracked in git
  • Domain is mine, content survives platform switches
  • I write styles myself, can add anything in 5 minutes
  • Performance and SEO I control directly
  • Deploy 5 minutes, migrate 30 minutes

Sounds like a lot of engineering? Actually it’s a 1-week project, and then I don’t touch the base for 5 years.

What I use

  • Astro 5 — static by default, SSR when needed. Files are routes, components are layouts.
  • MDX — Markdown + components. I write content, occasionally import a small component for a chart / callout / embed.
  • TypeScript — content schemas validated with Zod. Rename a field, the build fails. Good.
  • Cloudflare Pages — static + Functions together, free tier covers most indie.
  • Git — all content is in git. Rename a line, commit, can recover any deleted file.

Doesn’t it get tedious?

Writing a blog post, I need to:

  1. Open VS Code
  2. Edit src/content/articles/en/<slug>.mdx
  3. git add && commit && push
  4. Cloudflare auto-deploys in ~30 seconds

Compared to a CMS: one extra step (commit). But fewer headaches: export formats, custom CSS, platform popups, paywalled features.

When NOT to use this

  • You don’t know git — the commit + push barrier is too high for non-developers
  • 3+ collaborators — git merge conflicts get painful with simultaneous editing
  • Frequent design changes — touching CSS for visual changes blocks designers

If only you write, git is a virtue (version-tracked history). If a team of multiple people writes, git is overhead — Notion / Sanity / headless CMS is the right call.

Closing

A CMS is a tool for people who don’t write code. I write code, and I don’t want to be locked in later when some platform changes its policy.

With MDX + git + Cloudflare, in 3 years this site still runs, content still exports, the platform swap doesn’t matter.

If you write code too, try Astro / Next.js + MDX + content collections. 15 minutes to a running site.

Update (2026-09-03)

Six weeks after launch, I haven’t touched the base architecture once. The site’s gained 11 web tool pages, 5 content collections (products / services / testimonials / articles / now), full auth, and dual-channel payments — all feature code, zero migration, zero refactor. Astro 5’s scoped CSS actually saved me this round — the tool pages inject theme CSS via document.head.appendChild, and without the scoping that one line would have flattened the whole site’s body width.

— Lao Wei

键盘快捷键

先按 g 再按下面的键。? 打开这个面板。