· 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(),
}),
});
Links
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.