About this site

How this site is built.

The stack, the design system, and the pipeline that publishes the posts. No secrets, no mystery. Full credits at the bottom.


The stack

Astro 7, static output. No client-side framework. Plain CSS with a set of custom properties as the design system. Node 22, pinned in the repo.

Content is markdown files with frontmatter. Posts live in src/content/blog. RSS and sitemap are generated at build time.

Where it runs

GitHub is the publish target. Cloudflare Pages builds and serves it.

A Gitea repo in my homelab is the backup. A preview runs on the homelab at website.home.itsjustchr.is before anything goes public.

The contact form

Static sites cannot do forms. A Pages Function handles POST /api/contact. It validates the input, catches bots with a honeypot, and delivers the message via Resend.

No mailto: link anywhere on the site. Spam magnets stay off this page.

The design system

Early-90s Nintendo. Cream background, red/yellow/green/blue, 3px black borders, hard offset shadows. The whole look is a small set of rules applied everywhere — the same border width, the same shadow offset, the same palette.

Press Start 2P handles the labels and buttons. It is self-hosted via @fontsource, so the site does not depend on a font CDN. Body text stays a normal readable font — pixel fonts at body size are unreadable.

The publishing pipeline

The posts mostly publish themselves. Not the words — the process.

Every draft has draft: true in the frontmatter. That makes it invisible everywhere — the index, the RSS feed, the post URL. Nothing ships by accident.

An AI agent (Hermes, running in my homelab) writes the drafts in my voice. There is a style guide in the repo so the writing stays consistent. I review in chat, then one command publishes: flip the flag, stamp the date, commit, push. Cloudflare Pages rebuilds.

Scheduled posts have a date in the frontmatter. A cron job publishes them when the date arrives and stays silent when nothing is due.

The failures

Two good ones so far. A scoped-styles bug that made the whole site render unstyled — the fix was one attribute. And a deploy script that left stale pages behind because tar overlays instead of deleting.

Both are fixed. Both are the kind of thing worth writing down.

Thanks

Credit where it's due.

Nothing here is made from nothing. These are the tools, and the people behind the tools, that make this site work.

Source

The code lives on GitHub. It may be private for now. Ask nicely.

New posts appear in the RSS feed.

Colophon

Built in the homelab. Written by Chris, typed out by an agent, reviewed by a human (also Chris).