Hello, World!
After 20 years of blogging across various platforms, I’ve come full circle: back to static files, Markdown, and a deploy pipeline I actually understand.
Why move?
Substack was fine. But “fine” isn’t what I’m after. I wanted:
- Markdown files in a git repo — version-controlled prose
- No vendor lock-in — my words, my infrastructure
- RSS-first distribution — because RSS never died, you just stopped using it
- Simplicity — a blog should be a function from Markdown to HTML
The pain points
Every hosted platform eventually adds friction. You start tweaking their editor instead of writing. You worry about export formats. You realize your content lives on someone else’s servers, behind someone else’s API.
The stack
This site is built with Astro, styled with Tailwind CSS, and deployed on Railway. Newsletter delivery is handled by Buttondown, which picks up new posts via RSS.
No JavaScript frameworks. No client-side hydration. Just HTML and CSS, the way the web intended.
Why Astro?
Astro ships zero JavaScript by default. Content collections give you type-safe Markdown handling. The build output is plain static files — perfect for serving from anywhere.
Why not Hugo, Jekyll, or 11ty?
I’ve used them all. Astro’s TypeScript-native approach and component model felt like the right fit for 2025. Plus, the content collection API is genuinely pleasant.
Design choices
A few principles guided the design:
- Monospace headings — channeling the terminal aesthetic
- Minimal chrome — no sidebar, no clutter, content is king
- Dark mode — because reading at 2am is a lifestyle
- Full RSS content — no excerpts, no click-through required
The best blog engine is the one that gets out of your way.
Code highlighting
Shiki handles syntax highlighting at build time. Here’s a taste:
def hello():
print("Welcome to the new blog.")
if __name__ == "__main__":
hello()
And some TypeScript for good measure:
const posts = await getCollection("blog");
const sorted = posts.sort(
(a, b) => b.data.date.valueOf() - a.data.date.valueOf()
);
What’s next
More writing about Python, open source, infrastructure, and the occasional rant about software complexity.
Subscribe via RSS or the newsletter form below. See you around.