Authentication Basics You Should Not Invent
Every few years a team invents a new way to store sessions in localStorage, roll their own JWT crypto, or hash passwords with SHA-256 because “we don’t need bcrypt for…
TypeScript Types That Earn Their Keep
TypeScript is not a personality and it is not a substitute for tests. It is a way to make illegal states harder to represent and to make refactors cheaper. Teams…
Logging That Helps at 2am Instead of Drowning You
At 2 a.m. you do not want a novel. You want to know which request failed, which user, which action, and whether it is the database, the payment provider, or…
How to Debug Production When You Can’t Reproduce It Locally
It happens on one customer’s account, or only after 11 p.m., or only on iOS Safari, or only when the cart has a coupon from 2019. You cannot reproduce it…
Docker Compose for Developers Who Needed It Yesterday
You cloned the repo. The README says docker compose up. You have never liked Docker. Postgres fails because the port is taken. The API cannot see the database because you…
Error Handling That Doesn’t Leave Users Stuck
The button spins. Then it stops. Nothing happens. The user clicks again. Now they have two orders, or none, and a support ticket that says “your site is broken.” The…
SQL Indexes for People Who Only Open Postgres When It Is Slow
The page is slow. Someone says “add an index.” You add an index on users.email because that column is in the query. The page is still slow. The query was…
How to Design REST APIs Frontend Teams Don’t Hate
Frontend developers do not hate REST. They hate guessing. They hate a list endpoint that returns a different shape than the detail endpoint. They hate 201 with an empty body…
Stop Copying useEffect Patterns That Fight React
useEffect is the hook people reach for when they do not know where the code belongs. Data fetch, syncing to a document title, resetting state when a prop changes, subscribing…
How to Write a Pull Request That Gets Reviewed
A pull request sits for two days. Then someone leaves “nits” on naming and disappears. Or they approve without reading because the diff is 1,800 lines and standup is in…