A big cleanup day for this blog

Cover image for a big cleanup day for this blog.
April 11, 2026

A big cleanup day for this blog

Today was one of those satisfying maintenance days where a lot of loose ends finally got tied together. Looking at the commit history, the main theme was simple: make the blog easier to own.

The biggest change: content is now local Markdown

The day started with a one-off export script to pull posts and the About page out of Sanity and turn them into Markdown files. That let me move the content into content/posts and content/pages, copy the related images into public/images/blog, and introduce local helpers to parse frontmatter and render Markdown.

This is the kind of change that does not feel flashy on the frontend, but it simplifies the project a lot. The content now lives in the same repository as the code, which means fewer moving parts, fewer external dependencies, and a workflow that should be easier to understand six months from now.

The second step was removing the temporary bridge

Once the export was done, I removed the Sanity integration itself. That included the old studio files, the Sanity schemas, the environment variables that were no longer needed, and the export script once it had served its purpose.

I also updated the README so the daily workflow now reflects reality: write Markdown, drop images into the matching folder, run the site locally, and build before publishing.

I also tightened the Markdown pipeline

A few follow-up commits were about utils/markdown.tsx. Nothing dramatic from the outside, but these are the kinds of small refactors that keep a content-heavy project from turning into a mess. I cleaned up imports, improved error handling, and made a few formatting changes so the file is easier to read the next time I touch it.

There was also a tiny documentation cleanup in the README, removing a note that was no longer relevant for the About page frontmatter.

General cleanup and tooling work

The last commit was a grab bag in the best sense. I removed leftover Phaser assets and files that no longer belonged in this repository, adjusted TypeScript and Next.js configuration for better compatibility, and moved the linting setup to a dedicated ESLint flat config.

I also made a few small page and styling touch-ups around the site, which is often the reality after a structural migration like this. Once the foundation changes, a few edges need sanding.

I also reworked the article listing layout

After the structural cleanup, I spent some time on the part readers actually hit first: the article cards on the home page and category pages.

The listing now uses a more compact card format with a landscape cover image, the title placed below the image, a short date-and-excerpt line, and a clear call-to-action button. On larger screens, the content area now takes a wider share of the page and packs as many cards per row as the available space allows while keeping the cards centered.

I also increased the number of articles shown by default so the main listing pages feel less sparse. It is a small change compared with the content migration, but it makes the site feel much more complete when landing on it.

And yes, there is also a new article

On top of the infrastructure work, I published a new post about mobile productivity. So today was not only about maintenance. It also produced something reader-facing, which is usually the nicest way to end a cleanup session.

Final thoughts

The net result is a blog that feels lighter. The content pipeline is simpler, the repository has less legacy baggage, and publishing should now be more straightforward. I like these kinds of days because they do not always create flashy new features, but they reduce friction everywhere else.

That is usually a pretty good trade.