Skip to content

Blog

Notes & engineering

Field notes on distributed systems, performance, and the occasional war story.

18 of 18 posts

Five-minute queries behind a sixty-second timeout: unwinding a cache cascade

A client-facing analytics dashboard cached its subqueries to stay fast, and that's precisely why it got slow — every write to a base table invalidated everything stacked above it. Fixing it meant preloading, splitting the fetch, and warming the cache before anyone asked.

Backend and distributed systems · 4 min

Rendering content whose shape nobody had decided yet

Microlearning's block types were never finalized, arrived constantly, and nested inside each other. The frontend had to render them before the designs existed — which makes skipping what you don't recognize the load-bearing decision, and gives it a failure mode worth knowing about.

Microlearning · Frontend · 5 min

The retention system we found while moving house

A data-residency migration turned into an audit of what the platform actually did — which surfaced a support tool already paid for, already installed, and doing a fraction of what it could. Wiring the learner journey into it as events lifted retention and completion by 12%.

Backend and distributed systems · 4 min

Latest

One fetch away from dynamic: what RSC actually decides for you

React Server Components make complete, crawlable HTML the default. They also make static-versus-dynamic rendering a consequence of where you put a fetch — decided silently, per route, with no error when you get it wrong.

1 Sep 2026 · Portfolio Platform · Frontend · 5 min

The canvas can't read your CSS: driving a live chart from React

A candlestick chart that server-renders, then updates over SSE, using a charting library that owns its own canvas imperatively. Three boundaries have to be crossed carefully, and the design tokens are only one of them.

29 Aug 2026 · Market (Ticker) · Frontend · 5 min

The topology that isn't there: what one box actually costs

This site runs every service on a single EC2 instance. That's the right call for its traffic — and it buys a specific, nameable set of problems that are worth stating rather than glossing.

28 Aug 2026 · Market (Ticker) · Infrastructure · 4 min

A box you can't log into: Terraform, SSM, and deploys without SSH

The security group on this site's instance opens exactly one port, and it isn't 22. What that forces — TLS-ALPN-01, SSM-driven deploys, an instance that boots empty — turns out to be a better shape than the one SSH would have allowed.

27 Aug 2026 · Market (Ticker) · Infrastructure · 4 min

If your correctness lives in SQL, mocking the database tests nothing

When the rules are enforced by constraints, unique indexes, and access checks in the query layer, a mocked database validates your mocks rather than what ships. A real Postgres as the merge gate — and coverage aimed at what matters instead of at a percentage.

11 Aug 2026 · Internal Admin Tool · Engineering practice · 4 min

Don't store what you can derive: expiry as computed state

Storing an "expired" status means a scheduled job, two sources of truth, and a window where the flag disagrees with reality. Deriving validity from dates you already have removes all three — and brings its own smaller set of problems worth naming.

31 Jul 2026 · Internal Admin Tool · Architecture · 4 min

No hard delete: a lifecycle you can walk back

Handing delete power to a non-engineering team means the safety of the system rests on nobody ever misclicking. Modelling cancellation as a reversible state transition changes what a mistake costs — and quietly removes delete's special-cased code path.

23 Jul 2026 · Internal Admin Tool · Architecture · 3 min

One database, one owner: why the product asks instead of reads

Customer Success configures contracts in an admin tool; the learner platform enforces them. Both could have read the same tables. Making the platform ask the admin server instead — over a request that never leaves the node — is what keeps authorization in one place.

14 Jul 2026 · Internal Admin Tool · Architecture · 4 min

The browser shouldn't hold your JWT: per-request auth in a BFF

A learner screen needs data from roughly eight internal services. Putting one gateway in front of them solves the fan-out — and then that gateway becomes the only sensible place for auth to live. The SPA holds an encrypted cookie; the JWT never leaves the server side.

16 Jun 2026 · Microlearning · Backend and distributed systems · 5 min

Taking engineers off the critical path for changing a word

Localized copy lived as per-locale rows in a database, and changing any of it needed an engineer and a content creator in the same room. Moving the source of truth into the tool designers already worked in turned a scheduled task into a publish button.

11 Jun 2026 · Engineering practice · 4 min