Hello, world (again)
This site is now an Astro blog that both humans and coding agents can write to. Here is how it is put together.
For a few years this domain was a single hand-written HTML page: a CV with a news table and a list of projects. It worked, but every edit meant touching raw HTML, and there was nowhere to write anything longer than a bullet point.
This is the first post on the rebuilt site. The goals of the rebuild were simple:
- Content is files. Every post, news item, project and job is a Markdown or YAML file with a validated schema. If a field is missing or malformed, the build fails instead of shipping a broken page.
- Agents and humans use the same path. A coding agent writes a post the same way I do: create a folder, write Markdown, run the checks, open a pull request. The repository has an
AGENTS.mdthat spells out the rules. - Boring infrastructure. Astro for the build, Vercel for hosting and preview deployments, S3 behind CloudFront for large media, Waline for comments.
What changed for readers
- There is a blog now, with tags and an RSS feed.
- There is a guestbook if you want to say hi.
- The portfolio content is the same, just rendered from data instead of hard-coded.
A quick test of the markdown pipeline
Code blocks are highlighted at build time, so no JavaScript ships for them:
export function mediaUrl(src: string): string {
const base = import.meta.env.PUBLIC_MEDIA_BASE_URL;
if (!base || !src.startsWith('/media/')) return src;
return base.replace(/\/$/, '') + src;
}
Tables and quotes work as you would expect.
| Piece | Tool |
|---|---|
| Build | Astro |
| Hosting | Vercel |
| Media | S3 + CloudFront |
| Comments | Waline |
The best blog setup is the one that gets out of the way when you actually have something to say.
More soon.
Comments