All case studies

Web Development case study

Content Studio

Built for Mindcob. An internal production tool that moves every piece of work from brief through two review gates to design, development and publishing.

Content Studio interface
The Problem

What was actually broken

Mindcob produce content at volume, and the work passes through four sets of hands: whoever writes it, two people who review it, a designer, and sometimes a developer. Before this tool that pipeline lived in a spreadsheet with a chat thread running alongside it.

That arrangement fails in a specific way. The spreadsheet tells you where something is, but not how it got there, and never who decided. Somebody marks a row approved. A week later the piece comes back with problems and nobody can reconstruct which reviewer signed it off, what they were shown, or whether the writer ever saw the note. The chat thread holds the answer somewhere, and it is faster to redo the work than to find it.

The second problem was routing. Four roles need four different views. A writer opening the tool should see their queue, not the whole board. A designer should see what has cleared review, not what is still being argued over. Build one screen for everyone and every role learns to ignore most of it.

Our Approach

The decision that shaped everything else

Model the pipeline as states, not as a column somebody drags

Work moves through an explicit set of statuses: assigned, in progress, sent for improvement, reviewed, ready for design, designing, ready for development, developing, ready to post, posted. Each transition is a permitted move from one state to another rather than a free edit, so a piece cannot arrive at published without having passed the gates in between.

Two reviewers, and the gate needs both

Approval is not one signature. The workflow records each reviewer separately and only releases the piece to design when both have cleared it. Either can send it back with an issue attached, which returns it to the writer with the note bound to the work rather than floating in a chat thread. That single decision is most of what separated this from the spreadsheet.

Every move is recorded, so the audit trail is a side effect

A status history row is written on each transition: what changed, who changed it, when. Nobody has to remember to log anything, because logging is not a separate action. When a piece comes back with problems, the question of who approved it and what they were shown has an answer in the tool.

Four roles, four front doors

Role-based middleware routes each person into their own workspace on sign-in. Admins and managers get the board, assignment and team management. Writers get their queue. Reviewers get what is waiting on them. Designers and developers get what has cleared the gates. Nobody is asked to filter a shared view down to their own work.

The Build

What we shipped, and what fought back

Next.js 15 and Prisma over PostgreSQL

The App Router serves both the interface and the API, with around thirty route handlers behind it. Prisma models the pipeline: tasks, projects and members, review issues and approvals, status history, uploads, comments, notifications and the per-workspace chat. Content types and status settings are rows rather than constants, so the team can add a content type without a deploy.

Sessions in an httpOnly cookie, permissions in middleware

Authentication is a JWT in an httpOnly cookie with bcrypt-hashed passwords, and middleware enforces the role check before a page renders rather than after. A writer who types an admin URL is redirected, not shown a screen that fails quietly once it loads.

Files attached to the work, not to a thread

Designers and developers upload finished assets against the task itself, so the deliverable and its approval history live in the same record. Notifications fire on the transitions that need somebody to act, rather than on everything.

The Result

The numbers it holds

Content Studio runs Mindcob's production pipeline end to end, from assignment through both review gates to design, development and publishing.

The thing worth taking from it is how little of the value came from the interface. The board is unremarkable. What made it usable was deciding that a status is a state machine rather than a label, that approval needs two named signatures, and that history should be written by the system rather than by the person who remembers to. Those three choices are what a spreadsheet cannot do, and they are the reason the spreadsheet stayed closed.

Built with
Next.js 15TypeScriptPrismaPostgreSQLTailwind CSSRadix UIJWT

Internal tools are most of what we build. If your team is running a process through a spreadsheet and a chat thread, that work sits under our Next.js web development service, where the scope, timeline and starting price are published before you talk to anyone.

Next case study

Fiona

Tell us what’s slowing you down.

Fixed scope, quoted before kickoff, four to eight weeks to production. You talk to the engineer who writes your code.

Start a project