Guide

Rapid prototyping description, two meanings in one phrase

Most guides on this topic answer one question: what is rapid prototyping. That is the textbook version. The 2026 version is different. When somebody types a sentence into a prompt box and a Vite + React app appears, that sentence is also the rapid prototyping description. This page treats both definitions, then shows exactly what every clause in your sentence becomes inside the sandbox.

m
mk0r engineering
10 min
4.9from Builders who arrived here typing one sentence at a time
One-sentence default system prompt in src/core/e2b.ts
Two CLAUDE.md files shape every prototype you describe
Every description turn is one real git commit in /app

The two meanings, in order

The phrase “rapid prototyping description” has been anchored to manufacturing for decades. Formlabs, Autodesk, TWI, and most engineering references still define it as a family of techniques (SLA, FDM, CNC, selective laser sintering) for quickly fabricating a physical part from a CAD file. That meaning is alive and well if you are making injection-mold housings or a custom bracket.

The second meaning is newer. Design-process guides on Figma, Miro, and ProductPlan reshape the phrase around three verbs: prototype, test, refine. A rapid prototyping description in that world is a short account of the loop and how fast it goes.

A third meaning shows up when the prototype is software and the medium is a prompt box. The “description” is the sentence you type. That sentence is load-bearing: it is the spec, the brief, and the input to a code generator all at once. Everything below is about that third meaning, because nobody else on this page of results is going to spell out what the sentence turns into.

A dashboard for my business metrics
Connect my apps with automated workflows
An AI assistant that sends daily reports
A habit tracker for people who share a kitchen
An expense splitter, brutally utilitarian
A study-card app for med students
A recipe scaler that refuses to suggest substitutions
A lead capture form with a 7-day streak counter
An admin panel for a one-person Shopify store
0System-prompt sentence
0CLAUDE.md files shipped with every VM
0Git commit per description turn
0Dev server port checked via Playwright

The anchor fact: the system prompt is one sentence long

Reasonable people assume the agent behind a prompt-to-app tool carries a thousand-word instruction block. In the mk0r codebase it does not. The default system prompt for the app-building agent is one sentence, declared at src/core/e2b.ts:148 as DEFAULT_APP_BUILDER_SYSTEM_PROMPT. The actual string, copied straight from the source tree:

src/core/e2b.ts

Everything that shapes the output of your description, the tone, the color palette, the anti-patterns, the testing loop, the memory behavior, lives in two CLAUDE.md files shipped into the VM image: /root/.claude/CLAUDE.md for global behavior and /app/CLAUDE.md for project specifics. Your sentence is read on top of that context, not on top of nothing.

The anatomy of a description that compiles

After reading thousands of first-turn prompts, a pattern repeats. Descriptions that produce something usable contain four load-bearing elements. Descriptions that produce the generic centered card are missing at least one.

The subject

The app genre. 'Habit tracker,' 'expense splitter,' 'admin panel.' Without this, the agent has to guess what components to reach for.

The state

The data the app actually owns: a list, a streak, a ledger, a cart. State is what makes it an app instead of a page.

The user

Who uses it and under what conditions. 'Two roommates,' 'one-person Shopify store,' 'med students during rotations.'

The twist

The detail that forces a design decision. Tone, taboo, constraint. 'Brutally utilitarian.' 'Refuses to suggest substitutions.' This is what moves the output past the generic centered card.

The scope boundary

What the prototype does NOT need to do. Auth, billing, and multi-tenancy are easy to skip on turn one. Naming the boundary keeps the first commit small enough to iterate on.

What the agent does when your sentence lands

From the moment the first character of your description is typed to the moment a git commit lands, a specific chain fires. This is not an abstract pipeline. These are real endpoints in the product.

Description in, prototype out

Typed description
localStorage session key
Optional screenshot
E2B sandbox
Files in /app/src
git commit on historyStack
Preview URL on port 5173

The hub is one warm E2B sandbox. It claims a session, reads the system prompt, reads the two CLAUDE.md files, reads your description, writes files into /app/src, and either hands back a working preview or opens Chromium through Playwright MCP to verify its own output before telling you it is done.

Every turn is one git commit. No exceptions.

The reason a prototype description can be followed by another description without losing state is version control. After your first sentence produces files, the server runs commitTurn which shells out git add -A, then git commit -q -m '<turn message>' , then git rev-parse HEAD, pushes the resulting SHA onto historyStack in your session document, and moves activeIndex forward by one. Your second description becomes the next commit. Undo walks the stack backward.

src/core/e2b.ts

Two descriptions, same subject, different output

To make this concrete, here is the same subject phrased twice. Both are legal prompts. Only one carries a twist.

FeatureWithout a twistWith a twist
The sentenceAn expense splitterAn expense splitter, brutally utilitarian, for two roommates who already fight about money
Color paletteDefault teal accent, centered hero, rounded cardsMonochrome, high contrast, amounts in a large sans serif
Empty state copy'No items. Add one to get started.''No debts yet. Enjoy the peace.'
Primary componentA list with an add buttonA ledger with a running balance and who owes whom
First-commit sizeOne component, about 60 lines, looks like any demoTwo components, one util, about 120 lines

Both descriptions compile. The twist is not about word count; it is about whether one sentence forces a design decision the defaults cannot make.

What the guardrails rewrite behind your back

The global /root/.claude/CLAUDE.md is not a neutral manual. It explicitly forbids certain aesthetic patterns. Even if your description is neutral, the prototype will still follow these rules.

anti-patterns baked into every prototype

  • No decorative icons on feature cards or list items
  • No purple or indigo gradients on white backgrounds
  • No generic centered hero with a gradient button
  • No uniform rounded cards in a symmetric grid
  • No Inter, Roboto, Arial, or system fonts as the default
  • No exclamation points in any generated copy
  • No Lorem Ipsum or placeholder images left in place
  • No 'streamline,' 'optimize,' 'seamless' marketing filler

What you actually type, mapped to what actually happens

Five steps, in the order they happen on the server. If you only remember the shape, remember this.

1

Your sentence lands in the composer

The input box label reads 'Describe your app or ask for changes…' Your sentence is the first user turn on a brand-new thread bound to the session UUID in your localStorage.

2

A warm sandbox is claimed

A Firestore transaction pops an entry from vm_pool, re-initializes the ACP bridge, and returns an acpUrl. You did not pay boot cost because the landing page fired /api/vm/prewarm on mount.

3

The agent reads the context stack

System prompt from src/core/e2b.ts:148. Global CLAUDE.md. Project CLAUDE.md. Then your description. The first three are fixed; only the last one changes each turn.

4

Files are written into /app/src

Usually App.tsx plus one or two feature components. The agent also imports the new components into App.tsx because otherwise they never render, which the project CLAUDE.md is emphatic about.

5

commitTurn seals the turn

git add -A, git commit, git rev-parse HEAD. The SHA is appended to historyStack. Your description is now a point in time you can rewind to.

Inside the sandbox, when a description lands

An abridged view. This is what the commands and events look like from inside the VM for a one-line description of a habit tracker.

sandbox / bash

The three-number definition of “rapid”

The word in the phrase that has to stay honest is “rapid.” These are the numbers that decide whether a description-to-prototype flow earns it.

0
Sentence in DEFAULT_APP_BUILDER_SYSTEM_PROMPT
0s
Pre-baked template cold boot
0
Real git commit appended per description turn

A working template, if you want one

If you are staring at a blank prompt box, this shape produces consistently better outputs than one-word genre prompts. It is not magic. It just fills in the four load-bearing slots before the agent has to guess.

description-template.txt

Example filled in: “An expense splitter, for two roommates who just moved in together, that tracks a running ledger and who owes whom, with a brutally utilitarian feel. Skip login and multi-household support.” One sentence in, one component tree out, one git commit on historyStack. Iterate with the next sentence.

Where the textbook definition still belongs

None of the above erases the original meaning. If you are fabricating a physical part, the rapid prototyping description you want is the Formlabs or TWI one: a survey of SLA, FDM, SLS, CNC, material properties, and lead times. If you are documenting a UX process, the Figma or Miro definition is the right shape: the prototype-test-refine loop with annotations for fidelity and intent.

The version on this page is useful only when the prototype is software and the input is a prompt. In that narrow but growing case, the description is the spec, the CLAUDE.md guardrails are the house style, and the commit is the artifact you iterate against.

Want a human to review your first description?

Twenty minutes. Bring a sentence, leave with a prototype and the commit history to show your team.

Book a call

Frequently asked questions

What is a rapid prototyping description in 2026?

Two things. First, the general definition: a short written account of a prototyping approach, usually by now a one or two paragraph explainer. Second, and more often useful, the literal sentence you write into a prompt box before a working app appears. In mk0r, that sentence is the description, and it maps almost word for word onto files inside a Vite + React sandbox at /app. A good description names the app, names its users, names the state it tracks, and names one surprising detail that stops the output from looking generic.

Is rapid prototyping only about 3D printing?

Historically, yes. Formlabs, Autodesk, TWI, and most materials-science references still use the phrase to mean fabricating a physical part from a CAD file via SLA, FDM, or CNC. That meaning did not disappear. What changed is that software took the same word. A browser-tab runtime with an AI agent, a Vite dev server, and a Playwright checker is also rapid prototyping, and for software ideas it is often the one that matches the job.

What does the sandbox actually see when I type my description?

A very short system prompt and two CLAUDE.md files. The system prompt is stored in src/core/e2b.ts as DEFAULT_APP_BUILDER_SYSTEM_PROMPT and is one sentence long. Everything else that shapes behavior lives in /root/.claude/CLAUDE.md (global workflow, memory instructions, design guardrails) and /app/CLAUDE.md (project specifics like Tailwind v4 and dev server on 5173). Your description arrives as the first user turn. The agent reads the guardrails, plans the work, writes files into /app/src, and runs git commit.

What makes a prototype description work versus fail?

Three signals consistently change outputs: a subject, a state, and a twist. Subject is the app genre, something like 'habit tracker' or 'expense splitter.' State is the data the app owns: a list, a streak count, a ledger. The twist is the detail that forces a design decision, such as 'for people who share a kitchen with roommates they do not know well,' which changes copy, empty states, and color. Descriptions without a twist produce the generic centered-card layout the guardrails explicitly tell the agent to avoid.

Can I upload a screenshot instead of writing a description?

Yes. The landing page input accepts text or an image reference, per the copy in src/components/landing-content.tsx: 'Describe what you want in plain English, or upload a screenshot for reference.' An image works as a constraint rather than a full spec; the agent still wants a short description to clarify intent, target user, and scope. The best hybrid is one sentence plus one screenshot.

Where does my description end up inside the repo?

The session UUID from localStorage claims a warm sandbox. The agent reads your description, then writes into /app/src, usually App.tsx plus one or two feature components. commitTurn runs 'git add -A && git commit -q -m <turn message> && git rev-parse HEAD' and appends the new SHA to historyStack on your Firestore session doc. You can verify from inside the sandbox terminal with 'git log --oneline' and see one entry per turn all the way back to the initial scaffold commit from ensureSessionRepo.

How is this different from the classic 'prototype, test, refine' definition?

It is not different in spirit. The loop is the same. What changed is the cycle time and who runs each step. Classic prototyping has a human sketching, a human clicking through, a human writing notes. The runtime version fires the loop inside a single turn: you type the description, the agent writes the files, the agent navigates Chromium via Playwright MCP, it snapshots the a11y tree, and it either hands back a working preview or iterates on its own output before you see it. The refine step is still yours; the first three are compressed into the commit.

Do I need to be specific, or can I be vague?

Vague is fine on turn one if you want the agent to make the twist for you. The tradeoff is that vague prompts lead to average outputs, because the CLAUDE.md guardrails default to 'black and white minimal as the baseline.' Adding a tone word, a user group, or a single visual reference changes the entire composition. A description like 'an expense splitter, brutally utilitarian, for two people who already fight about money' produces something different from 'an expense splitter.' Same subject; different prototype.

Type one sentence. Watch it compile.

Subject, state, user, twist. The sandbox will do the rest, and the result will land on historyStack as a real commit you can rewind.

Open mk0r