How this blog is built
The whole site is Astro with content collections. Every
post is a Markdown file whose frontmatter is type-checked against a Zod schema,
so a typo’d category or a missing pubDate fails the build instead of shipping
broken.
Categories for free
The schema pins category to a known set of values. A helper walks every
published post, counts categories, and feeds both the navigation and the
/categories/[category] pages. Adding a post in a new category means editing one
list and writing the file — nothing else.
Drafts
Set draft: true in frontmatter and the post stays visible in astro dev but is
stripped from production builds. Good enough for work-in-progress without a
separate branch.
Deploy
Pushing to main triggers a Forgejo Action that runs astro build and ships the
static output to Cloudflare Pages with Wrangler. No servers to babysit.