Blog
Notes on software architecture, engineering leadership, and building systems that stay boring in the best way.
-
The Missing Layer Between AI Sessions: ADEs and Beyond
AI agents moved the bottleneck from writing code to tracking the work they do on our behalf. Building a weekend app to manage that started as modelling terminal state and turned into modelling my own SDLC.
-
Gating The Quiet Decay of Healthy Domains
Why quality gates should help engineers think, not just comply — and how coupling and cohesion metrics in CI catch structural drift inside a domain.
-
Measuring What Matters: Using LLMs to Understand Your Change Failure Rate
How we classified 3,500 pull requests with LLMs to trace bugs to root causes, and found configuration was a far bigger driver of failures than expected.
-
Dataloaders with @nestjs/graphql in a Federated Setup
A complete end-to-end implementation of dataloaders inside the NestJS lifecycle, including the federated call chain from router to @ResolveReference.
-
Scaling Node Applications: Playing Defense
Node is single-threaded by design. Two rules, the metrics that matter, and real cases of scaling IO-bound and CPU-spikey services defensively.
-
Optimizing Engineering Documents for the Reader
Filing everything under RFC makes readers do the sorting. How to match document type to reader intent so engineering writing actually gets acted on.
-
The Hidden Cost of BFFs: Why We're Moving Beyond the Backend-For-Frontend Pattern
Why we are deprecating the Backend-for-Frontend layer in favour of a 2.5-tier architecture: frontend apps, a federated GraphQL router, and domain services.