Writing
Notes on engineering, leadership, and the craft.
Posts · Page 3 of 4

Building a self-hosted media stack (and what I deleted)
Jun 2026·Running a self-hosted media stack is more integration work than install. Here is how I wired Jellyfin, Sonarr, Radarr and friends, and what I deleted.

Running background jobs on macOS with launchd
Jun 2026·How to run launchd scheduled jobs on macOS: plist patterns, Full Disk Access pitfalls, and the C launcher trick that survives every redeploy.

How I reach a home server with no public address
Jun 2026·No open ports, no public IP, but real hostnames and a trusted TLS cert. Here is how Tailscale, DNS-01, and Caddy make it work.

Why my home server runs on a spare MacBook
Jun 2026·Running a MacBook home server on spare Apple Silicon? See how Tailscale, Caddy, and OrbStack power 25 self-hosted services with no public IP.

When Bot Mitigation Is Just Observation: Hardening Meridian Without Bot Management
Jun 2026·Bot mitigation without Cloudflare Bot Management signals? Learn how to harden Cloudflare WAF with scoped rules, auth carve-outs, and rolling telemetry.

Tracking what the LLM costs in a one-person app
Jun 2026·Slow token leaks hit harder than one big call. Learn how a single wrapper and use-case tags make tracking LLM API costs a query, not a monthly surprise.

Ask the app: a Q&A agent over a kid's school year
Jun 2026·How I built a bounded LLM agent to answer open-ended questions over a child's school year, with three SQL tools and a hard four-iteration ceiling.

Parent-friendly summaries without paying the LLM twice
Jun 2026·Regenerating LLM summaries on every page load wastes money and time. Learn how a derived cache key makes LLM summary caching effortless.

Teaching an LLM to ignore the recap and surface the homework
Jun 2026·Teacher notes are mostly recap, not actions. Learn how to prompt an LLM to extract action items only and ignore past events.

Scraping a school portal with no API: dropping the browser for raw HTTP
Jun 2026·Scraping a school portal with no public API: why I dropped Playwright for Node's built-in https module, a plain cookie jar, and regex parsing.