Technical
Frontend Architecture After a Year of Shipping: What I Keep Choosing
Eleven months of shipping frontends for clients and for myself. The architectural choices that earned repeated use are not the trendy ones. They are the ones that stayed understandable at month eleven.
Choice 1: Server Components as the Default Shape
Pages default to server components. Interactivity islands are client components. This split pushed most of my data access to the server, which simplified auth, reduced bundle size, and made SEO trivial. Next.js app router finally rewarded the pattern.
Choice 2: Tailwind Without a Component Library
I stopped adopting component libraries in 2025. Every library I tried added a layer I eventually fought. Tailwind plus a small in-repo components/ folder owned by me produced the UIs I wanted without the abstraction tax.
Choice 3: URL State Over Global State
Filters, sorts, pagination, selected items: all in the URL. Bookmarkable, shareable, refresh-safe. Global state libraries became unnecessary for 80 percent of my needs.
const sp = useSearchParams();
const sort = sp.get('sort') ?? 'recent';Choice 4: Forms with Server Actions
Server actions replaced my tRPC mutations and my fetch-based form handlers. Less boilerplate, first-class loading states, simpler error handling. I have not written a useState for a form field in months.
Choice 5: Colocation Over Folder-by-Type
Component, test, types, styles: all next to each other. Not in separate top-level folders. Finding and changing is instant. Deleting a feature is one folder rm.
Choice 6: One CSS Layer
All styling in Tailwind. No CSS modules, no styled-components, no vanilla-extract. One mental model. Trade-offs accepted. Team onboarding is faster.
Choice 7: Testing Only the Critical Paths
Form validation, auth flows, checkout, payment: exhaustive tests. Everything else: smoke tests via Playwright. Full coverage was a distraction. Critical path coverage is a strategy.
What I Stopped Choosing
Heavy state libraries. Micro-frontends. Component kitchen sinks. Every clever routing abstraction. Premature internationalization. Each of these added weight I later removed.
Reading
Lee Robinsons engineering posts and Dan Abramovs overreacted blog are still the best free frontend education. Read both monthly.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read