Mar 18, 2026

Why I Rebuilt My Portfolio CMS Three Times

Lessons from throwing away two working admin portals

architecturenextjs
Whiteboard sketch of three different admin sidebar layouts side by side

Attempt one: too much abstraction, too early

The first version had a generic content-block system before there was a second content type to justify it. Every feature needed to route through an abstraction that only ever had one real caller.

Attempt two: the framework fought back

The second attempt tried to bolt an admin portal onto a stack that was never meant to host one. Every auth check needed a workaround, and role enforcement lived in three different places.

What stuck the third time

Single Next.js app, Server Components by default, a server-only data layer, and role checks on every mutation instead of just hidden buttons. Nothing clever — just consistent.

- Write the schema before the UI, even for a 48-hour window. - Server-side role guards on every route handler, not just the ones that felt risky. - Cut scope in a documented order instead of improvising under deadline pressure.

None of the three versions were wasted time, exactly — but I'd rather have written this decision down the first time.