Internal Tooling

MVP Factory

A Proposal In, A Live Demo URL Out

Internal prototype — no customer

An internal prototype that reads a project brief into a structured spec, fills a pre-built scaffold with the variable parts using a local model, boots it behind a tunnel and returns a live URL.

Industry
Internal / BrainGenz
Location
Internal
The problem

Responding to a project brief with a working demo rather than a written proposal takes about an hour of manual work each time, which means it only happens for the briefs someone has time for.

  • Building a bespoke demo per brief takes roughly an hour end to end
  • A local 31B model cannot reliably write a full application from scratch
  • An MVP that fails to compile is worse than no demo
  • Each demo needs a public URL without standing up new infrastructure
  • Unvalidated model output corrupts the generated project silently
What we built

A control plane that extracts a structured spec from the brief, picks a pre-built scaffold, fills only its placeholders with schema-validated model output, boots it and returns a public URL.

  • Parse the brief into a small JSON spec describing brand, user and use case
  • Select from a scaffold library with a confidence score, defaulting to the most general option when unsure
  • Fill only placeholders rather than generating application structure
  • Validate every model response against a schema and retry on failure
  • Boot frontend and backend on unique ports and expose them through a tunnel
  • Poll a health endpoint before returning the URL

How it was built

The honest constraint was stated up front

The original ask was full application generation from a brief. A 31B model running locally cannot reliably write a Next.js and TypeScript app from scratch: it produces broken imports, missing components and type errors, and the deployed result fails to compile a large share of the time. Even much larger models struggle without heavy guardrails.

So the design does not ask it to. Two or three clean scaffolds are pre-built, and the model fills only the variable parts: form labels, the system prompt, colour tokens, the output shape, sample data. The result looks generated and is a clean template with informed inserts. That is the only version that boots reliably, and stating the limit was the point at which the project became buildable.

Every model output is schema-validated

The brief becomes a small JSON spec, then a scaffold is chosen with a confidence score, defaulting to the most general option when the model is unsure. Each placeholder fill is validated against a schema, so a bad response is retried rather than allowed to corrupt the build.

Where it stands

A prototype with a single intended user and no customers. Adding a scaffold to the library is roughly an hour or two of work rather than a redesign, which was the main thing the architecture was chosen to protect.

Before
  • Each demo hand-built in about an hour
  • Demos only produced for some briefs
After
  • Scaffold-and-fill pipeline replaces full generation
  • Schema validation prevents malformed builds
  • Prototype only, with no customers
Stack
Control Plane
PythonFastAPISchema validation with retry
Models
Local Gemma 31BStructured output prompting
Scaffolds
Next.jsFastAPITemplate placeholders
Delivery
Cloudflare TunnelHealth-check pollingPer-MVP registry