I love simple things more than complex ones. This site is a folder of Markdown and HTML files, one build script, and a web server. No framework, no backend, no database. Here is the whole setup.
How I write
A post starts with an idea, or with an old note that deserves a second life. I write down the structure first: the point, the sections, what each one has to show. Then I generate the SVGs that explain it, and only then put it all together as a page.
A post is a document
A blog post is text with a few pictures, and the browser already knows how to show that. So every page here is plain HTML, built once and served as a file. It opens immediately, it reads fine with JavaScript off, and a file I write today will still open in ten years.
Frameworks earn their place in applications: shared state, auth, live data. A blog has none of that. The longer version is in Frameworks are overkill. HTML is enough.
The build
One Node script, about 1,200 lines with its helpers, turns content/ into dist/:
- Markdown through markdown-it, with code highlighted by Shiki at build time
- Images resized and converted to WebP by Sharp
- Canonical URLs and Open Graph tags on every page
- RSS, a sitemap,
robots.txt, andllms.txt - A search index for MiniSearch
Six direct dependencies, 87 packages in total. A full build takes about two and a half seconds. In dev mode a watcher rebuilds on every save.
One-off pages
Most posts are Markdown. When a post needs more, like a decision tree or an animated figure, it gets its own HTML, CSS, and script next to the text. That code loads on that page only. No component library, no shared runtime.
The visuals
The drawings, like the desk above, are in the spirit of Making Software. Each one is an SVG generated from a small 3D scene in plain JavaScript: boxes and cylinders, projected to isometric line art and painted back to front. No libraries and no image files. The same few hundred lines of shared code draw every scene, so the drawings look like one set, follow the light and dark theme, and animate only while you can see them.
The style lives in a written guide: the camera angle, the line widths, what the accent color is for. An agent drafts a scene from a description and the guide, and I adjust it until it looks right.
An agent does the boring part
A custom layout used to cost a day. Now I describe the page, an agent drafts the HTML and CSS, and I edit the result. The repo keeps notes for agents, so the next page matches the last one.
What the browser gets
A typical post is about 8 KB of HTML, under 3 KB over the wire, plus 15 KB of shared CSS. Two scripts add the theme toggle and search. Without them the page still reads fine.
That’s the whole thing. When it stops being enough, I’ll add what’s missing. So far it hasn’t.