Why I moved my blog to Keystatic
Until May 13, my blog posts lived on Hashnode. This website (isaacantwi.com) pulled them in through their GraphQL API. Then Hashnode put the API behind a paid plan, after months of getting hammered by scrapers and scammers. See their changelog here:
https://hashnode.com/changelog/2026-05-13-graphql-api-paid-access
I had three options.
- Pay for the API
- switch to another headless CMS (for example Sanity)
- Move the posts into the repo as markdown (.md) files
I had tinkered with markdown files before, but the writing experience was rough. I had to build my own editor and an API to load the posts. Not worth the effort for a portfolio.
Keystatic fixes that. I get an admin panel behind GitHub auth for writing and editing posts, and none of it is mine to maintain.

What Keystatic is (keystatic.com)
Keystatic is a content layer that lives inside your codebase. There is no server. There is no database. Posts are plain Markdown files in your git repo, and Keystatic gives you an editor in the browser to write them. When you save, it commits the file straight to GitHub.
For me, in practice, that means:
- Posts live next to the code that renders them, in
content/posts/. - Edits are commits. Version history is git history.
- Nothing else needs to be hosted.
- I can write from any device with a browser.
How it works on this site
keystatic.config.tsx describes the post schema (title, brief, cover image, tags, body) and tells Keystatic where to read and write files. lib/posts.ts uses Keystatic's local reader to load posts at build time and on revalidation, then hands them to the /writing page and the home feed.
The editor lives at /keystatic and is gated behind GitHub auth, so only I can publish. When I write a post in there, Keystatic pushes the .mdoc file and any images to the repo. Vercel sees the commit and rebuilds the site.
The good parts
No external API to worry about. If Hashnode goes down tomorrow or changes pricing again next year, nothing here breaks. The posts are also reviewable like any other code now, so I can branch, write a draft, sit on it, and merge when I am ready. Images live in public/images/posts/<slug>/ and get served from the same host as the site, which is one less network hop. And I own the files in a way that is hard to argue with: they sit on my laptop and in my GitHub account.
The not so good parts
I gave up Hashnode's reach. Their platform sends some incidental traffic to posts that show up well in feeds and search, and that is gone. Their editor is nicer than Keystatic's in a few places, especially around image handling. SEO on this domain starts from zero for these posts. Hashnode also had a built-in comment system. I have not added one here yet.
Overall
The migration took an afternoon. The site has one fewer moving part, and if Keystatic ever stops being the right tool, the posts are still Markdown files sitting in my repo, ready to go somewhere else. Worth the time so far.