colophon · how it's made
how this site is made.
Hand-built, self-hosted in my homelab, and served through Cloudflare. Here's the whole trip and everything along the way.
-
01
you
Your browser asks for lawkitty.me.
-
02
Cloudflare
Cloudflare answers DNS, filters out the junk, and can hand back a cached copy straight from the edge.
-
03
the tunnel
Everything else rides an outbound Cloudflare Tunnel home. No open ports on my network.
-
04
the homelab
My own hardware runs the Node app and the Discord bot.
-
05
the page
Express renders an EJS template and sends it back the same way.
the details
small things, done properly.
fast on purpose
Server-rendered HTML, plain CSS and a little vanilla JavaScript. No client-side framework. CSS and JS are fingerprinted so they cache for a year and still update on every deploy.
stays up when I don't
Pages tell Cloudflare it may keep serving its last copy if the server or tunnel goes down, so a homelab outage doesn't take the whole site down with it.
keyboard friendly
Press Ctrl K (⌘K on a Mac) or / anywhere to jump to any page or run an action. There's a skip link, visible focus rings, and reduced motion is respected.
light & dark
Follows your system theme, goes dark late at night, and remembers if you pick one yourself. Set before the first paint so it never flashes.
a bot in the walls
The same process runs a Discord bot that powers the server widget, the live status cards, anime requests and Jellyfin accounts.
spam kept out
Forms are guarded by Cloudflare Turnstile, a honeypot and per-visitor rate limits. Guestbook notes are read by a human before they appear.
type
the letters.
- Outfit headings
- Plus Jakarta Sans body text and UI
- Cormorant Garamond the fancy italic words
- JetBrains Mono labels, numbers and code
Fonts from Google Fonts, icons from Bootstrap Icons.
the stack
what it runs on.
- Node.js
- runtime
- TypeScript
- everything server-side
- Express 5
- routing & middleware
- EJS
- server-rendered templates
- discord.js
- live presence & the server widget
- sharp
- renders the Discord status cards
- Docker
- deployment
- Cloudflare
- DNS, Tunnel, caching, Turnstile