back home

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.

  1. 01

    you

    Your browser asks for lawkitty.me.

  2. 02

    Cloudflare

    Cloudflare answers DNS, filters out the junk, and can hand back a cached copy straight from the edge.

  3. 03

    the tunnel

    Everything else rides an outbound Cloudflare Tunnel home. No open ports on my network.

  4. 04

    the homelab

    My own hardware runs the Node app and the Discord bot.

  5. 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

Want the numbers? See the live stats or the changelog.

your corner of discord Law's Corner A cozy corner to chat about software, Linux, projects, games, VRChat, and general internet nonsense. 22 members & counting Come say hi Join the server

thank you for being here

Support my work.

If you'd like to help me keep making things, you can find me here: