A plain SPA for two internal tools, a PWA for a learner-facing product, and static generation with ISR for this site. Each was right, and the reasons had almost nothing to do with the merits of the technique.
2 Sep 2026 · Portfolio Platform · Frontend · 6 min
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
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
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
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
Ticker's indicator cache stored each indicator's latest value until a chart overlay needed the whole line. The change touched seven files — and was still cheap, because the new shape contained the old one.
26 Aug 2026 · Market (Ticker) · Backend and distributed systems · 4 min
How Ticker's streaming pipeline is put together, why building it to scale creates a single-reader problem, and why a Redis SET NX PX lease answers it instead of a consensus system.
25 Aug 2026 · Market (Ticker) · Backend and distributed systems · 5 min
How Ticker's aggregator turns a stream of ticks into OHLCV bars at five intervals at once, why it writes on every tick instead of on close, and what it takes to stay correct when the same tick can arrive twice.
24 Aug 2026 · Market (Ticker) · Architecture · 5 min
How CI authentication moved from long-lived access keys to short-lived OIDC tokens, how this site's deploy path uses that, and the subject-claim format that denied every request while looking entirely correct.
19 Aug 2026 · Portfolio Platform · Infrastructure · 4 min
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
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
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
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
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
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