· Updated

How this site is built

Astro, Markdown, a YAML file, and Cloudflare Workers. No client-side JavaScript.

I wanted the simplest stack that would still feel good to write for. Here is what I landed on.

Astro

Every page is a static HTML file generated at build time by Astro. There is no client-side JavaScript: Astro only ships what you ask for, and I have not asked for any.

Posts live as Markdown files in a content collection with a typed schema, so a typo in frontmatter fails the build instead of silently breaking a page.

const posts = defineCollection({
  loader: glob({ base: './src/content/posts', pattern: '**/*.md' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    description: z.string(),
    draft: z.boolean().default(false),
    updated: z.coerce.date().optional(),
  }),
});

The links page is driven by a single YAML file. Each category has an id, a title, an optional description, and a list of links. Adding a link is a one-line edit.

Hosting

The build output is uploaded to Cloudflare Workers as static assets. There is no Worker script at all, just a small config that points at the dist folder and tells Cloudflare to serve the custom 404 page for unknown paths.

The whole thing deploys in a few seconds with a single command.

If you are curious, the source is on GitHub.