(blog)

Writing

Deep, practical writing on shadcn/ui, Tailwind CSS, React Server Components, and shipping production UI faster.

A Landing Page in Ten Blocks

Not a listicle. This is the anatomy of a complete SaaS landing page built from ten registry blocks: the narrative arc that orders them, the rhythm rules that make them feel like one page, and every section rendered live as we go.

9 min readshadcnlanding-pagedesign

Container Queries Make Section Components Honest

Viewport breakpoints answer the wrong question: they tell a component how wide the screen is, not how much room it actually has. Here's the full container queries workflow in Tailwind v4, the containment gotchas nobody mentions, and a rule for when md: is still correct.

7 min readtailwindcsscontainer-queries

Where the use client Boundary Actually Goes

Most React Server Components advice stops at 'add use client when you need hooks.' That's how entire pages end up client-rendered by accident. Here's the real mental model: two module graphs, one serialization line, and a set of rules for keeping UI sections server-first.

10 min readreactserver-componentsnextjs

Why the Copy-Paste Component Model Beats the Library

shadcn/ui didn't win by shipping prettier buttons. It won by changing the unit of distribution from a package you depend on to source code you own. Here's the architecture underneath it, and the honest trade-offs.

9 min readshadcnarchitecturereact