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.
- Astro the static site framework
- Cloudflare Pages builds and hosting
- Resend contact form delivery
- Gitea the homelab backup repo
- @fontsource self-hosted fonts
- Press Start 2P the pixel font (by CodeMan38)
- Hermes Agent the AI agent that publishes the posts
- Tailscale the network that ties the homelab together
- Home Assistant the home automation brain
- ESPHome the firmware for the ESP32 builds
- Proxmox the hypervisor everything runs on
- Nintendo the design inspiration