Why Your 'Fast' Page Still Feels Slow
A page can score well on paper and still feel janky — content jumping, fonts flashing, the hero image loading last. A few habits fix most of it.
Notes on building for the web — React, Next.js, TypeScript, system design & performance.
A page can score well on paper and still feel janky — content jumping, fonts flashing, the hero image loading last. A few habits fix most of it.
Most TypeScript tutorials describe data you have. The bigger win is using types to forbid states you don't want — via discriminated unions and satisfies.
async/await made async code look normal, which is why the bugs got sneakier. Four mistakes that pass review because they look right — and how to catch them.
The WebSocket demo works in five minutes — the problems start after: reconnection, auth, missed events & running more than one server. Notes from production.
Caching is sold as a performance win, paid for in staleness bugs. Which reads are worth caching, how to invalidate honestly & when a cache isn't worth it.
The hardest backend bug isn't a failed request — it's one that succeeds but times out, so the client retries. Idempotency keys and safe-to-repeat writes.
useEffect is React's most misused hook. A field guide to effects that are just syncing computable state or misplaced logic — and the few that should stay.
At a few screens, copy-paste is fine. At eighty, it kills you. The resource abstraction that held an 80-module admin platform together — and its escape hatches.
How to make a page composable from configuration — toggle and reorder sections without touching JSX — using a typed registry and the App Router.
After enough pull requests and mentoring, the lessons stopped being about syntax — what review actually optimizes for & why the best comments are questions.
An app that talks to two services can leak that split into every component. A shared data layer keeps the UI from ever knowing there's more than one backend.