Blog
-
Building a Live PM2.5 Monitor: ESP32 → MQTT → Cloudflare
A live air-quality dashboard that shows PM2.5 from the sensor nearest you — an ESP32 + PMS7003 publishing retained MQTT, a browser that streams readings directly from the broker, and a static Nuxt bundle on Cloudflare that has no server at all. Here's the whole shape, and every footgun.
-
Replacing the Campus Pi With a MikroTik RB750Gr3
The Pi 4 worked, but a dedicated router is cleaner. Moving the campus FortiGate auto-login stack from Raspberry Pi + bash/systemd to a MikroTik RB750Gr3 running RouterOS 6 — and every footgun along the way.
-
Turning a Pi 4 Into a Stealth Wi-Fi Router
A full day of building a Wi-Fi router on a Raspberry Pi 4 — hostapd, AdGuard Home with DNS-over-HTTPS, captive portal auto-login, and finally bypassing FortiGate App Control with AmneziaWG. Every layer, every failure, every recovery.
-
Concert Ticket Split
Double-entry bookkeeping breakdown of a group concert ticket split. Password required.
-
DevLog #2 — A PDF Dialog and the Mobile Iframe Problem
Three days after the first session — adding English test scores, building a reusable Dialog component, and discovering that mobile browsers lie about PDF support.
-
DevLog #1 — How I Used Claude to Build This Site
A behind-the-scenes look at one full day building with Claude Code — from observability config to a full blog with Keystatic CMS, and every bug in between.