Start here
Node.js40 MB an hour: the Node memory leak hiding behind setMaxListeners(0)
A postmortem of a slow leak in a Node ingest service: how two heap snapshots, one retainer chain and a silenced warning led us to the bug.
Read the storyA group engineering blog
Every post starts from a real symptom: a p95 that doubled, a pod that grew 40 MB an hour, a migration that locked a table. Then we show the commands, the output and the diff.
Start here
Node.jsA postmortem of a slow leak in a Node ingest service: how two heap snapshots, one retainer chain and a silenced warning led us to the bug.
Read the storyThree top-level folders, one dependency rule and pnpm filters for CI. The monorepo structure we keep coming back to, and what we stopped doing.
Width is time, height is call depth, colour means nothing. A practical guide to reading CPU flame graphs from Go's pprof, using a real regression we fixed.
ALTER TABLE ... RENAME COLUMN takes a millisecond and breaks every running pod. A step-by-step expand and contract rename in Postgres, with the trigger we use.
A date test that passed for months failed on a CI runner in Berlin. What we learned about DST, local midnight and testing code that reads the clock.
For most teams, feature flags are a Postgres table, a hashing function and a policy about expiry dates. Here is ours, and when we would pay for a product instead.
We added an index to fix a 1.2 second query and the plan did not change. Here is how EXPLAIN ANALYZE told us why, and the partial index that worked.