There's an old idea that the best writing is invisible. The reader shouldn't notice the prose — they should only notice the thought. Simplicity is hard to achieve because it requires you to know what to leave out.
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.
This template is an experiment in that direction. One HTML file. No dependencies. You open it, change the text, and you have a blog.
Why start with nothing?
Every framework you add is a decision you're borrowing from someone else. Sometimes that's the right call — you don't need to rewrite a router or a bundler. But for a personal blog, the complexity tax is real. You spend more time configuring tools than writing words.
The alternative is radical simplicity. HTML for structure. CSS for style. Markdown files for content. A small script to glue them together. That's it.
What you actually need
A blog needs three things:
- A list of posts — titles, dates, maybe a short description
- Individual post pages — the actual content, readable and well-typeset
- Navigation — a way to move between the list and the posts
Everything else is optional. Tags, search, comments, analytics, dark mode toggles — they're nice, but they're not the blog. The blog is the writing.
The build step
If you're writing in Markdown (and you should — it gets out of your way), you need something to convert .md files to HTML. This can be as simple as a 50-line Node script:
read markdown files → parse frontmatter → convert to HTML → wrap in template → write to disk
No hot module replacement. No virtual DOM. No tree shaking. Just files in, files out.
Here's the core of that script in Python:
from pathlib import Path
from markdown import markdown
for path in sorted(Path("posts").glob("*.md")):
html = markdown(path.read_text(), extensions=["fenced_code"])
out = Path("dist/posts") / path.stem / "index.html"
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(html)
Read markdown, convert, write. Everything else — templates, CSS, routing — is just string concatenation.
The result
What you get is a site that loads instantly, works without JavaScript, looks good on every device, and costs nothing to host. The entire thing fits in a single directory you can understand by reading it.
That's not a limitation. That's the point.