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:

  1. 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.
  2. 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.md that spells out the rules.
  3. 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