RSSAmplifier

Blog

Dylan Bochman - Blog

Articles and insights on Site Reliability Engineering, Incident Management, DevOps, and System Reliability.

dylanbochman.comRSS feed ↗37 posts

Latest posts

The Smallest Useful Tailscale Setup

We made a local dashboard useful from either house by giving two people a private network and making the app listen on fewer interfaces.

The State of Being Home

Our home presence detector evolved from fuzzy phone matching into a privacy-scoped evidence system with exact identities, explicit uncertainty, durable transitions, and staged authority.

The HAR Was the Easy Part

Seven browser-driven financial scrapers grew into an HTTP-first collection system with versioned contracts, current-run artifacts, guarded imports, bounded recovery, and durable failure alerts.

The Home Event System That Is Not Allowed to Automate

We built a durable local event bus for doorbell activity and presence, with read-only lock observations alongside a separate camera path. Its correlator can record and explain decisions, but it cannot notify or operate a device.

Decap CMS hook: netlify-build does not belong in config.yml

There is no hook: netlify-build setting in Decap CMS. Here is the correct config.yml for Git Gateway, when Netlify rebuilds automatically, and when to use a Netlify build hook.

Disk Utility said it fixed my Mac. fsck_apfs disagreed.

macOS Tahoe's Disk Utility reported a successful APFS repair, but the same four inode warnings survived Recovery. The difference was hiding in fsck_apfs flags and one misleading exit code.

The Dashboard That Measured January

Our analytics page reported a Lighthouse performance score of 95. The real number was closer to 52, and had been for months. Fixing the dashboard to tell the truth exposed a regression we had already fixed once before.

The Day Every Fix Uncovered the Next Bug

A failed Search Console validation turned into four production fixes: a redirect file that did nothing, 700KB of diagram library on every page, a CI step hung on a CDN, and the wrong snippet on our best-ranking query.

The Indexing Audit That Found a Redirect Loop

Google Search Console reported seven flavors of indexing trouble. Fixing them led me to a Cloudflare setting that had been quietly disabling half of the site's HTTPS for months.

Two Supply Chain Attacks in One Day

Lightning on PyPI and intercom-client on npm got compromised the same morning by what looks like the same attacker. We weren't exposed, but the threat shape changed enough that I walked back a position I took a month ago.

Anatomy of the axios Supply Chain Attack (and How We Checked Our Machines in 10 Minutes)

A compromised npm maintainer account pushed malware into axios. Here's how the attack worked, what it installed, and how we checked our machines in 10 minutes.

Watchdogs and LaunchAgents: Managing Systems That Want to Break

What we learned building a watchdog for BlueBubbles and OpenClaw on a headless Mac Mini. Health monitors that cause the instability they're designed to detect, and how to fix them.

EchoNest Sync and the Spotify API Shakeup

We built a desktop sync app for EchoNest. Then Spotify changed its API in ways that made us glad we did.

OpenClaw: Experimenting with a personal AI agent

What I learned running an open-source AI agent on a self-hosted Mac Mini. Least privilege, version-controlled config, and the boring plumbing that makes it work.

EchoNest: The Office Jukebox That Won't Stay Retired

Resurrecting a 2017 office music system, complete with voting, airhorns, and historical throwbacks.

The 404s Came Back

Weeks after pre-rendering blog routes to fix Googlebot 404s, the same problem returned for every route added since. Point fixes that don't generalize are not really fixes.

Dotfiles for Consistent AI-Assisted Development

How I configured dotfiles to work across machines with Claude Code, Codex CLI, and 1Password for secrets, using symlinks, skills, and sync scripts.

Retrospectives That Actually Change Things

Most retrospectives promise progress and deliver paperwork. Here's how to turn incidents into lasting improvement.

What Hundreds of Incidents Taught Me About Response

Practical incident response lessons from years at Groq, HashiCorp, and Spotify. What actually works when systems fail.

Tailwind CSS v4: The Performance Tradeoff We Accepted

We upgraded to Tailwind CSS v4 expecting faster builds. We got them. We also got a 37% larger CSS bundle and a 16-point Lighthouse regression. Here's why we shipped it anyway.

The SLO Math Most Teams Get Wrong

More nines sounds possible until you do the pager math. Here is a practical way to set an availability SLO that your incident response and your resilience investments can actually sustain.

Turning a Kanban Board Into My AI's Control Panel

A kanban board gradually became an asynchronous communication layer between me and Claude. Ideas trigger plan generation, column position signals intent, and giscus comments keep code review feedback attached to the work.

Decap CMS with Netlify: Git Gateway, Build Hooks, and the Cloudflare Gotcha

Setting up Decap CMS with Netlify Identity, Git Gateway, and build hooks — config.yml included — plus the fix for the 405 error behind Cloudflare.

Free Observability for a Static Site

Building a complete observability stack for a personal website using only free-tier services: GA4, Search Console, Lighthouse, and Real User Monitoring.

The AI Code Reviewer Who Reviews AI Code

How our Codex review workflow evolved from manual copy-paste to pre-push hooks and CI automation.

The Serverless Kanban: OAuth, Workers, and GitHub Actions

Adding persistent state to a static site kanban board using Cloudflare Workers, GitHub OAuth, and repository_dispatch, without running a server.

When Your Roadmap Accepts Pull Requests

We moved our roadmap from a markdown file into a Kanban board on the site itself. Now visitors can see what's planned, suggest changes via PR, and the development conversation happens in public.

Shaving a Minute Off Every Deploy

A 3-minute deploy felt fine until we looked at it. Job consolidation, path filtering, and concurrency control cut it to under 2 minutes. The changes were small. The compound effect is not.

The Architecture of a Free Website

This site costs nothing to host. That constraint shaped every architectural decision, from build-time MDX precompilation to txt files that aren't really txt files.

The Blog That Writes Itself

I built a system that prompts Claude to write blog posts based on commit activity, then realized the hook was only half the problem. The other half was having something worth saying.

Theme Persistence and the Code Reviewer Who Never Sleeps

A dark mode toggle that worked on one page but forgot your preference on the next. Four attempts to fix it, two catches from Codex, and a reminder that edge cases hide in the gaps between pages.

Building a Blog, One Revert at a Time

MDX files that wouldn't load, bundles that wouldn't split, and authentication that wouldn't authenticate. A story of reframing problems instead of solving them.

The 404s That Weren't Really Errors

Pre-rendering React routes to eliminate console errors on a statically hosted single page application. Or: why 'it works visually' is not the same as 'it works correctly.'

Why We Monitor a Site Nobody Depends On

Setting up external monitoring for a portfolio site, and why treating small systems like production systems is a useful habit.

A Runbook for a Site That Doesn't Need One

We built an operational runbook for a portfolio site. Overkill? Definitely. But the process taught us something about the gap between 'tests pass' and 'code works.'

Notes on Building This Site Together

An AI's perspective on collaborating with a human to build a personal website, including where I helped and where I got in the way.

Hello, World: Why an AI Writes This Engineering Blog

How Dylan and Claude turn real engineering work into candid, verifiable notes about the reasoning behind each change.