Chapter 1 of 15

The Demo Was Not the Product

Screenshot-to-code was an impressive first response, not a finished piece of software. This was the point where I realised the impressive part of the product and the durable part of the product were not the same thing. The first result created interest, but the second request exposed whether I had actually built a system or just a very good demo.

  • What screenshot-to-code did well
  • Why generated code alone was insufficient
  • The difference between impressive output and completed work

The situation

A prompt or screenshot produced a working page in seconds, and early users were visibly impressed by the first result. In The Demo Was Not the Product, I wanted to capture the real operating situation rather than describe the problem in abstract terms. What mattered to me was the moment the existing approach stopped being sufficient in normal use, because that was usually the point where the next architectural requirement became obvious.

The naive solution

Ship the generator as the product: better prompts, more variants, nicer output, and call it done. The naive option was attractive precisely because it was faster and easier to explain. I could have pushed further in that direction and probably improved the demo, but it would have optimised the visible symptom rather than the underlying system constraint.

The hidden constraint

Every real request that followed the first one - "now add a form", "why did this break", "where did my project go" - had nowhere to live once the response left the chat window. This constraint was easy to miss early because it did not show up in the first successful run. It appeared once the workflow had to survive repetition, failure, another user, another provider, or a return visit, which is why I now look for these second-order requirements much earlier.

The decision

Treat the generated result as the start of a software lifecycle, not the end of a prompt-response cycle. I treated this as an architectural or product decision rather than a prompt tweak. The aim was to create a boundary I could reason about later, instead of relying on model behaviour to remain consistent as providers, templates, and user requests changed.

The implementation

Reframed the roadmap around what happens after generation: persistence, file structure, dependency installs, runtime errors, validation, deployment, collaboration. I also tried to make the implementation concrete enough that the decision could be inspected in code and runtime behaviour. That meant explicit state, explicit policy, and observable transitions rather than a collection of hidden assumptions spread across prompts and handlers.

The tradeoff

Slower time-to-wow for a single page, in exchange for a product that survives a second and third request. I did not treat the decision as free. In most cases I was deliberately accepting more engineering, state management, or operational complexity in exchange for a smaller failure surface and a product that could survive realistic use.

The evidence

User sessions that previously ended at the first generated screenshot began continuing into edits, re-runs, and saved projects. I use this evidence as a practical signal, not as a claim that the architecture is universally correct. The useful question was whether the new design changed what the system could reliably do under the conditions that had previously broken it.

The reusable lesson

If your AI feature only has to work once per session, you have a demo. If it has to survive iteration, you have a product problem. The part I would carry into another build is the decision rule behind the implementation, not the exact technology choice. Vendors and frameworks will change; the underlying question about state, control, isolation, feedback, or user trust is much more reusable.

The consultant's questions

  • What does the user need to do the moment after they see the first good result?
  • Can this workflow survive a second request without starting over?
  • What assumption in this part of the system would become dangerous if usage or tenant count increased?
  • What evidence would tell me this decision needs to be revisited rather than defended indefinitely?