Design systems with Tailwind: lessons from real-world products
Tokens, primitives, and the discipline it takes to keep a Tailwind codebase from devolving into utility-class soup.
Tailwind makes it ridiculously fast to ship UI. It also makes it ridiculously easy to ship inconsistent UI. The fix is not to abandon utilities — it's to put a thin layer of design intent on top of them.
Tokens as the source of truth
Define tokens for color, spacing and radius in your config. If a value isn't in there, it shouldn't be on the page.
Primitives over snippets
A Button with three variants beats fifty hand-rolled buttons. Same for Card, Input and Badge. Pair this with shadcn-style copy-in components and you get the best of both worlds.
Tagged
Keep reading
All posts →Shipping SSR on Next.js: how I cut page loads by 35%
A pragmatic walk-through of the rendering, caching and image strategies behind a real CMS revamp — including the trade-offs nobody talks about.
Docker + Azure DevOps: a CI/CD recipe that halves release time
The exact pipeline structure, caching tricks and image layering rules that took our deploys from 18 minutes to under 9.
Build log: shipping a real-time video app with WebRTC & Socket.io
What I learned wiring up signaling, ICE servers and connection recovery for MeetSpace — the unsexy parts of real-time.