Skip to content
>km_

Writing

Short posts on what I'm shipping at work and on side projects — the bug that took two days, the choice between two tools, and the stuff I wish I'd known sooner.

Your three-attempt limit isn't a limit

Read the row, check the counter, increment it, save. Under concurrent requests every read sees the same value and the cap never fires — which makes a six-digit OTP brute-forceable.

4 min read
  • security
  • postgres
  • concurrency
  • postmortem
Hello

Why this blog exists and what to expect here.

1 min read
  • meta

Command palette

Search routes, copy contact info, or jump to a social profile