Notes
A log of what I'm building, planning, and thinking about. Short and timestamped.
CSS :has() finally landed everywhere
Spent the morning ripping out a JS-driven 'parent has invalid child' pattern and replacing it with `form:has(:invalid)`. Three components got simpler.
Stripe webhooks: trust signatures, not IPs
An IP allow-list felt safer until the on-call woke up at 3am because Stripe rotated a range. Signature verification is the answer.
Switching from pnpm to bun for side projects
Install times are a step change. Tooling is rough at the edges but for greenfield prototypes the speed wins.
DDIA chapter 5: replication
Leader-based replication is everywhere I look once you know what it is. The Postgres logical replication chapter clicked after this.
Conditional types: a small breakthrough
Finally internalised distributive conditional types. `T extends U ? X : Y` over a union maps element-wise. Wrote a tiny helper to make it stick.
Rust ownership clicked today
The trick was stopping translating from JS. Borrowing isn't a workaround for GC — it's a different shape of program. Drew it out on paper.
Healthcare forms are their own thing
Half the complexity is conditional logic; the other half is what people *don't* type. Empty states carry diagnostic meaning. Designed accordingly.
Vim motions in VS Code: worth it
Three weeks of being slower. Then suddenly faster. The mental cost of context-switching to the mouse adds up more than I realised.
Aussie rules in JSON
Modelling a footy match as a typed event stream over a Saturday afternoon. Useless. Delightful. Recommended.
Local-first with electric-sql
The mental model — your database is the network — takes a beat. Then it's hard to go back. Replaying a flaky train commute felt like magic.