Why I Rebuilt My Portfolio CMS Three Times
Lessons from throwing away two working admin portals
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.