Writing
Notes on engineering, leadership, and the craft.
Series

Building a Slack Engineering Agent
How a multi-tenant Slack agent turns an @-mention into a pull request: the end-to-end path, the Postgres-backed task queue, the single policy gate that keeps an autonomous agent safe, and the ports-and-adapters spine that holds it together.

A Home for AI Artifacts
The internal platform where the team publishes AI-generated artifacts to durable, authenticated URLs instead of external services: what it does, how it's built on one small box, and the serverless start we walked back.

A spare MacBook as a home server
How I turned a spare MacBook into the most useful infrastructure I own: how I reach it with no public address, the background jobs that run my week, the media stack and what I deleted, one dashboard that makes it usable, and the local model, monitoring, and backups that let me trust it.

Building a school-assignment assistant for my daughter
Building a private school-assignment assistant for one child: scraping a portal with no API, an LLM that learns to discard, cached summaries, a small agent, and knowing what it costs.

Building Press
How I built Press, the editorial engine that writes from my work. One boundary of the system per part.
Posts

Measuring Performance Work Before Declaring Victory
Jun 2026·Slow PRs need proof. Use Sentry traces, pg_stat_statements, dashboards, and sampling controls to measure real performance wins.

When Project Risk Is an Accountability System, Not a Staffing Problem
Jun 2026·Project risk accountability fails when ownership, readiness, and escalation are invisible. Use ledgers and gates before adding staff.

When Agents Can Write Their Own Skills, Retrieval Becomes the Product Boundary
Jun 2026·Wrong skill retrieval makes agent skill persistence risky. Treat skills as gated, versioned product surface with evals and tool limits.

Delete All GitHub Forks at Once
Jun 2026·Delete all your GitHub forks with the gh CLI: grant the delete_repo scope, list every fork with gh repo list --fork, and pipe them to gh repo delete --yes.

When Health Data Freshness Became a Pipeline Problem
Jun 2026·Health data freshness depends on device capture, API ingest, caching, and display timestamps, not just widget refresh speed.

When Claude Became a Shortcut Before the Problem Was Understood
Jun 2026·Claude in Chrome can mask delivery gaps unless ownership, access, and evidence are proven before an LLM starts building.

Turning UPI Transactions Into Savings Signals
Jun 2026·UPI transaction analysis fails when alerts stay messy. Build a read model that normalizes payees, detects recurrence, and exposes evidence.

Go as a primary language for solo practitioner tooling
Jun 2026·Dependency drift broke a tiny service. Go for solo tools keeps unattended jobs easier to deploy, debug, and maintain.

Ports and Adapters, Earned Not Cargo-Culted
Jun 2026·Ports and adapters architecture can rot into ceremony. Use two adapters, typed errors, DTOs, and parity tests to keep seams useful.

One Policy Gate for an Autonomous Agent
Jun 2026·Letting an LLM open PRs is risky. Autonomous agent guardrails need one beforeToolCall gate, a per-project allowlist, and audit logs.