Skip to main content
Generative UI

Reduce prototype creation

A creative tool that turns a prompt into a runnable prototype in the thread, so a designer can feel a flow before committing to build anything.

Product Design · Generative UI · Frontend Engineering · 2026

https://generative-ui-psi.vercel.app/

Prototyping one flow costs more than the question is worth

Most design questions are small. Does this list feel right to tick through? Is three steps too many? In the AI tools designers already have, answering one of those means scaffolding a whole project to see a single screen move, or generating an image of it, and an image cannot tell you how the thing feels under your thumb. Either way the cost of asking is higher than the cost of guessing, so people guess.

The shortest distance between a prompt and something you can operate

I wanted the answer to arrive in one move. Open the tool, say what you want in plain language, get something running. No repository, no install, nothing to tear down afterwards. The blank state carries six starting points for the same reason a good brief does: the hardest part of asking is the first sentence, so the tool offers one. What comes back is not a picture of a prototype. It is the prototype, running in the thread inside a phone frame, ready to be tapped where it lands. Ask again and the next one arrives underneath, so a session reads as a series of attempts rather than one artefact you keep overwriting.

The empty thread: What can I help with, above six starting prompts such as build a task list I can tick off and build a three step onboarding flow
Generated prototypes sitting inline in the conversation feed, each one runnable where it sits
The chat screen: a request and its generated prototype held together in a single thread

Built against real prompts, not a spec

I wrote the stack with Claude Code, wired to Anthropic's Sonnet and Haiku models, and judged every change against an actual generated reply rather than a design file. The editor and the running thread stayed side by side throughout. That is also why the problems in this study are the ones the tool ran into rather than the ones I predicted.

One minute is still a very long time

Generation got fast. It did not get comfortable. Even at around a minute, that minute is dead air, and dead air in a creative tool fills up with doubt: whether it heard you, whether it is working, whether starting over would be quicker. The send control turning into a stop control was the only thing on screen that changed. The speed problem had become a waiting problem, and shaving seconds would not have fixed it.

The composer in two states: the idle send control, and the stop control shown while a reply is generating

What a wait is allowed to be

Before trying anything I went back to the established response-time thresholds and the patterns used for long-running AI tasks. The guidance is consistent. Acknowledge the action immediately. Show that work is continuing. Say what is happening in plain language. Keep recovery within reach. The longer the wait, the more specific the feedback has to become, which rules out a spinner: a spinner is the same sentence no matter how long it is said for.

Three ways to fill the wait

The first attempt is not in the recordings below, because measurement killed it. I streamed the generated source into the card while it was being written, on the reasoning that code is the honest thing to show while code is being written. The API does not deliver it that way. It sends the whole tool call in one burst near the end, so on a seventy second turn the first real code landed at sixty nine seconds: an empty pane for the entire wait, then full for two. After that I built the waiting state three more ways and watched each over a full generation rather than as a static frame. A minute is long enough that anything repetitive turns into wallpaper, and long enough that anything busy turns into noise.

Option 1: shimmering text that keeps updating
Option 2: a skeleton holding the card's shape
Option 3: an ASCII torus turning on a phone mockup

Text and motion answer different questions

Neither half carried it alone. The motion says it is still happening; the text says what is happening. What shipped runs both: inside the frame a torus turns above a single shimmering line naming the file being written, and it stays blank until there is something true to put in it. Outside the frame the turn keeps a trace, each finished step collapsed with the time it actually took. Thinking, choosing the screens, wrote App.tsx in fourteen seconds. Nothing in it is invented; every label and duration is measured. Once both were on screen the same minute stopped reading as a stall, because a wait you can watch is a different length from a wait you cannot.

The waiting state as shipped: a phone mockup beside a running list of named steps, each with the time it took
The status line in two phases: thinking, and choosing the screens

Then point at it and change it

Generating the right thing first time is not the interesting case. The interesting case is the one where it is nearly right. Open a prototype at full size and it has a second mode. Preview lets you use the screen normally; Ask switches the same running screen to element picking and docks a composer beside it. The two are exclusive on purpose, so a click never both operates the prototype and selects a target. What travels with the request is the element's semantic path rather than a coordinate, so the model is told you mean that list row inside that list, and with nothing picked the same sentence applies to the whole screen. The amendment is written back over the existing result instead of arriving as a new turn, which keeps the thread a record of what you asked for rather than a log of corrections, and an interrupted or failed edit puts the previous version back.

A prototype open at full size with the ask panel beside it, explaining that you hover the prototype and pick the element you want to change
The ask panel with a selected element held as a chip above the field, ready for a description of the change

Take the code, keep the thread

A prototype that only exists in the tool is a demo. Every result copies out as React from where it sits, so the thing you just felt is the thing you hand over. The threads stay in the sidebar under the prompt that made them, which is what turns a session into a record of what you tried rather than a single surviving file.

The sidebar holding thread history, and the same sidebar empty

but wait, what if its not the "happy path"?

A generative tool spends a real share of its time not succeeding, so the failures had to be designed rather than left to an error boundary. A failed reply stays in the thread as a turn of its own, in its place in the conversation, with the request still above it. Nothing is thrown away and nothing has to be typed again.

A failed reply held in place as a turn in the thread rather than thrown as an error
  • Generation can fail

    The model might time out, return nothing, or lose the connection halfway through. The interface needs to explain what happened without making the user start the conversation again.

  • The result can be broken

    A prototype can finish generating and still fail at runtime, render an incomplete interface, or ignore part of the prompt. A finished state is not always a successful state.

  • The user can lose their progress

    A refresh, closed tab, or interrupted session can erase the context behind the result. Recovery has to preserve the thread and make the next action clear.

What I would keep from it

  • Speed and patience are different problems

    I spent the first half of the build making generation faster and the second half making the same duration bearable. The second half moved the tool further. Once a wait is honest about what it is doing, it stops being measured in seconds.

  • Nearly right is the normal case

    Designing only for the reply that lands perfectly leaves the user with one move: ask again and hope. Letting them point at the part that is wrong turns a rejected result into a starting point, and it is the feature I would build first next time.

  • A prototype has to be operable to be worth anything

    The whole project rests on the difference between seeing a flow and using one. Everything that survived the build (running in the thread, opening at full size, copying out as React) exists to protect that difference.

Next project

Custom Cms for artza website

Artza CMS — the production editor, its fields, and the publish flow in a layered composition
WhatsApp