A research workspace whose editor had grown into a tangle of special cases. I rebuilt it around a single block model and cut the time it takes to get a first document written.
Role
Design + frontend
Year
2025
Stack
Next.js · TypeScript · Tiptap · Postgres
Every new content type had been bolted on as its own code path. Nine of them existed. Adding a tenth meant touching the editor, the serialiser, the print stylesheet, and three test suites — so nobody added one.
Modelled every content type as one block primitive with typed attributes, replacing nine bespoke paths.
Moved formatting state into the document rather than component state, which made undo and collaboration behave predictably.
Built the empty state as a guided first document instead of a blank page with a tooltip.
Adding a content type is now one schema entry and one renderer. Time-to-first-document halved, and the support queue lost its single most common ticket.