Skip to main content

Notes from shipping code

Deep-dives on the problems I've debugged, the patterns I've extracted, and the decisions I'd make differently next time.

Posts
Three stacked wooden blocks on a light surface

Three tiers of Claude Code in CI

Read-only review, constrained auto-fix, and interactive @claude. Each tier has its own trigger, scope, and loop guard.

3 min read
Industrial pipes and valves in a mechanical room

Pooling Playwright browsers across FastAPI scans

A persistent Chromium instance with idle-timeout shutdown eliminates per-scan browser launch while isolating cookies via fresh contexts.

2 min read
A row of stamped-red boarding passes lined up on a counter

Eight Failed Deploys to Ship FastAPI + Playwright on Railway

Eight red deploys in a row shipping a Python audit service to Railway: uv grabbing Python 3.14, /root perms, Playwright browser paths, and a glob that broke.

4 min read
Two pairs of almost-identical shoes resting side by side on a bench

The Parity Harness That Caught a Silently Broken Service

I wrote a parity harness to de-risk a Node to Python scan service port. It caught the existing Node service silently returning perf=0 on every URL.

3 min read
Stage curtains half-drawn over an empty rehearsal space

asyncio.gather Is Not Enough for a Sync Client

A job poller stuck at 48 seconds. asyncio.gather did nothing. Batching plus asyncio.to_thread cut it to 8 seconds without a new library.

3 min read
A steel padlock on a weathered green door

Hardening an Admin Login: IPs, Timing, and a JWT Cookie

Spoofed x-forwarded-for, timing-leaky password checks, and a password gate per dashboard. Four small fixes that turn a toy login into a real one.

4 min read
Two different tools resting on the same workbench

Running a uv Python Workspace Inside an Nx Monorepo

Adding a FastAPI service to a pnpm-based Nx monorepo without teaching Nx to understand Python: uv workspace, Docker from root, dedicated CI job.

3 min read
A clean architectural doorway dividing two rooms

A (public) Route Group So Admin Pages Render Bare

Lifting Nav and Footer into a Next.js route group so every /tools/admin route inherits none of the public chrome, and the one broken 404 that followed.

2 min read
Organized tools hanging on a workshop pegboard

Three Tools I Add to Every Monorepo Now

Knip finds dead code, Renovate updates dependencies with cooldowns, and size-limit tracks bundle cost. Each took under an hour to configure for Nx.

3 min read
A ruler and measuring tools on a wooden surface

Turning a Prose Style Guide into Zod Build Checks

Character limits, canonical tags, and em dash rules encoded as a Zod discriminated union. The script caught a duplicate cover image on its first run.

3 min read
Checklist with green checkmarks on a clipboard

Replacing CSS Class Assertions with ARIA in Storybook

CSS classes break when Tailwind configs change. ARIA attributes are the semantic contract. Six rules for interaction tests that survive refactors.

2 min read
Colorful tags and labels sorted into rows

Client-Side Tag Filtering Without Losing SEO URLs

One component renders Link for crawlable tag pages or button for instant client filtering. The same TagChipStrip serves both without duplicating code.

2 min read