How this site is built
A static Astro site, posts written as Markdown, and Cloudflare Pages deploying every push. No database, no CMS, nothing to patch.
This site is deliberately boring infrastructure. I spend my days on systems that have to stay online, so the place I write about them should need no attention at all.
The stack
- Astro renders every page to static HTML at build time. The homepage, this blog and the RSS feed are all plain files by the time they reach you.
- Markdown for posts. Each post is one file in
src/content/blog/, with a few lines of front matter for the title, date, description and tags. - Cloudflare Pages builds and serves it. The domain lives on Cloudflare too, so DNS, TLS and hosting sit in one place.
- GitHub holds the source. Pushing to
mainis the only publish button.
Writing a post
A post is a file like this:
---
title: Notes on running agents behind NAT
description: What it takes to keep a local agent reachable from anywhere.
date: 2026-11-02
tags: [mercury, networking]
---
The body goes here, in plain Markdown.
Set draft: true in the front matter to keep a post off the live site while it’s in progress. Drafts still show up locally with npm run dev.
What happens on push
- GitHub tells Cloudflare Pages about the new commit.
- Pages runs
npm run build, which turns every Markdown file into a page, refreshes the sitemap, the RSS feed and/llms.txt. - The new build goes live on shehzen.com within a minute or two. Pushes to any other branch get their own preview URL first.
That’s the whole system. If something here breaks, it will be because I broke it in a commit, and the previous deploy is one click away.