The problem
A builder product is one of the harder things to get right on the frontend, because you're not designing one interface — you're designing a system that lets users design their own. Every choice you give them is a choice you have to make render correctly, stay fast, and remain approachable to someone who is not a designer. Give too little flexibility and the tool feels limiting; give too much and users make a mess and blame the product.
On Portfolyio, the frontend had to make the act of building feel effortless — immediate feedback, sensible defaults, a preview that always matched reality — while making sure whatever a user created still loaded fast for their visitors.
The approach
I focused on the interaction quality of the builder itself: changes reflecting instantly, layouts staying predictable, and the interface guiding users toward good results without lecturing them. A big part of the work was the unglamorous state-handling — the loading, empty, and error states that decide whether a tool feels solid or flaky. Those details are invisible when they're right and glaring when they're wrong.
The second focus was performance under variety. Because users could assemble very different pages, I had to make sure the output stayed light regardless of what they built — treating image handling, and the amount of JavaScript shipped, as constraints rather than afterthoughts. That discipline is the same one I describe in building fast Next.js interfaces.
The stack
The work centred on a modern component-driven frontend — React and the surrounding ecosystem — building a responsive, interactive builder that talked to the platform's services. I kept components focused and reusable so the builder's many pieces stayed consistent, and paid close attention to keeping interactions smooth on mid-range devices, not just fast laptops.
What it taught me
Portfolyio sharpened my respect for the empty and in-between states of an interface. In a builder, users spend most of their time in the messy middle — half-finished, experimenting, undoing — and a tool that handles those moments gracefully feels trustworthy in a way that a pretty final screen never conveys on its own. Designing for the messy middle, not just the polished result, is a lesson I've carried into every interface since.