Interactive demo examples that stay in your repo
Practical interactive demo examples for builders: what to show, how to structure them, and how to ship them in code so your repo owns the source of truth.

Every interactive demo example looks sharp on the day you build it. Then you ship. A nav item moves, a modal gets reworded, a pricing screen changes shape, and the interactive demo examples you sent last week now show a product that no longer exists. That is not a cosmetic problem. It breaks trust with every viewer who clicks through after the release. The fix is not a better screen recorder. Build the demo as code, in your repo, so your agent can keep it current without a full recapture pass.
What strong interactive demo examples actually do
A demo that shows everything the product can do is a tour, not a demo. Strong interactive demo examples focus on one outcome the buyer needs to reach, the moment they understand what the product actually does for them. For a SaaS activation flow, that might be: the user connects their first data source and sees a populated dashboard. That's the aha moment. Everything before it is setup; everything after it is proof.
The one-job demo
Pick the single most valuable thing your product does for the buyer in the first session. Build the demo around reaching that moment. A project management tool does not need to show comments, integrations, and reporting in the same flow. It needs to show a task moving from backlog to done with one click. The moment the buyer feels the payoff is the moment the demo is over. Stop there.
The screenshot that proves the wrong thing
A polished screenshot walkthrough can still miss the point entirely. The problem is structural: the demo shows features in the order the product team thinks about them, not the order the buyer needs to feel them. Showing the settings screen before showing the output is the most common version of this. Research on SaaS onboarding patterns shows that time-to-value, how quickly a user reaches a meaningful outcome, is the metric that drives activation. A demo that front-loads configuration before payoff loses the buyer before the aha moment arrives.
The CTA has to match the story
A demo without a sharp end action is a nice walkthrough with nowhere to go. If the demo shows a workflow that ends in a signed contract, the CTA should be "start a trial" or "book a call", not "learn more." The CTA should name the next real step in the buying motion, not the next page on the marketing site.
Build the reusable blocks before you write the flow
Good interactive demo structure does not start with the screen recorder. It starts with the building blocks: the story spine, the chapter breaks, the annotations, and the personalization hooks. Get those right before you write the flow, and you can reuse them across variants without rebuilding from scratch.
Story, chapters, annotations, personalization
Story is the through-line, the single narrative the viewer follows from problem to resolution. Every screen either advances the story or it does not belong. Chapters are the named segments that let a viewer jump to the part they care about ("How it integrates" / "What the report looks like") without sitting through the whole flow. They are also the unit of maintenance. When one screen changes, you update one chapter, not the whole demo. Annotations are the callouts that explain what to notice and why it matters, not labels, but short context lines ("This pulls from your live data, not a sample"). Personalization is the layer that swaps company name, logo, or sandbox data per viewer without rebuilding the flow.
A folder structure a product engineer would actually keep
A code-owned demo lives in your repo like any other component. A clean structure looks like this:
Each chapter is its own file. Content is separate from layout. Variants extend the default without duplicating it. When the product ships a UI change, you touch the affected chapter file, not the whole demo.
Branding, lead capture, and the handoff point
Brand polish — logo, colors, typography — belongs in `brand-tokens.css`, one file, updated once, applied everywhere. Lead capture is a form component dropped into the flow at the point where the viewer has seen enough to be interested but has not yet committed, usually after the aha moment and before the CTA. The handoff point is the screen where the demo ends and the next step begins: a calendar link, a trial signup, a "talk to us" form. These three pieces make the demo feel shippable to a real buyer, not a prototype.
Pick the demo pattern that matches the product
The right interactive product demo pattern depends on two things: how complex the workflow is, and how often the UI changes. Get this wrong, and you waste build time on a pattern the product cannot sustain.
Founder-led SaaS and the fast-path demo
For a founder-led product with a tight, specific use case, the right pattern is short and direct: three to five screens, one clear aha moment, one CTA. No chapter navigation needed. The buyer is usually a single decision-maker who wants to see the core value quickly. Vercel's interactive demos for new framework features follow this pattern, one workflow, one outcome, done. The fast-path demo is also the easiest to maintain: fewer screens means fewer things to update when the product ships.
Complex workflows need chapter breaks
A multi-step B2B workflow, onboarding, data import, configuration, reporting, needs chapters and wayfinding so the buyer does not lose the thread in the mechanics. Each chapter should cover one discrete step and end with a visible output. PostHog's AI observability demos use this pattern well: each section shows one integration or one output, not the whole platform at once. The buyer can jump to the chapter relevant to their role without sitting through the full flow.
When HTML is worth it and when it is not
HTML-based demos re-render live UI. They look exactly like the product and can handle real interactions. Screenshot-based demos are faster to capture but show a frozen state. Hybrid approaches capture HTML for the interactive moments and screenshots for the stable ones.
The tradeoff is simple: if your UI changes every sprint, a screenshot-based demo becomes a recapture job after every release. HTML-clone demos handle text and data edits in place; structural layout changes still require re-cloning the affected screens. Code-owned demos re-render from the codebase via an agent prompt, so there is no recapture and no manual click-through. If your UI is stable and you ship rarely, screenshots are fine. If you ship weekly, the recapture cost adds up fast.
How to build interactive demo examples in code
The code-owned demo model is straightforward: the demo is authored beside the product, lives in the same repo, and gets updated the same way the product does, through your coding agent.
Start with the repo, not the recorder
The prompt-to-create loop works like this: describe the demo flow to your agent, or capture screens via a Chrome extension as a starting point, and the agent writes the demo as HTML and component code you own. The Vercel React Three Fiber build is a useful reference for what "interactive UI as code you own" looks like in practice. The artifact is a component, not a recording. Same principle applies to a product demo. The agent outputs code; you commit it; it lives next to the product.
The before-and-after when the UI changes
Say your onboarding flow adds a new step between account creation and the first data connection. On a screenshot tool, that means a new capture pass for every screen downstream of the change. On a code-owned demo, you describe the change to your agent, "add a step between account creation and the dashboard that shows the data source selector", and the agent updates the affected chapter file. The rest of the demo stays untouched because it is code with clear chapter boundaries, not a linear recording where every frame depends on the one before it.
What the agent updates and what stays manual
The agent can safely regenerate screen layout, copy, annotations, and sandbox data from a prompt. It can produce a new variant from the base demo with one instruction. What stays manual: the story order, which chapters come first; the CTA choice, what you are asking the viewer to do next; and the judgment calls about what to show and what to leave out. Those are product decisions, not code changes. The agent handles the execution; you handle the editorial.
Keep interactive demo examples current without re-recording
The maintenance problem with most demo tools is mechanical: the demo is a recording inside someone else's platform, so every product change that touches a visible screen requires a fresh capture pass.
What recapture costs on screenshot tools
On a screenshot-based tool, a UI change that affects three screens means recapturing those three screens, re-annotating them, re-testing the flow, and re-publishing. If the change touches a screen early in the flow, say the login screen or the main dashboard, every downstream screen may need to be re-sequenced. There is no in-place layout edit. The work scales linearly with the number of affected screens per release.
What one prompt can replace in a code-owned demo
On a code-owned demo, a UI change that affects three screens is a prompt: "Update chapters 01 and 02 to reflect the new nav structure. The data source selector moved from the sidebar to the top bar." The agent updates the affected files. The chapters that did not change do not get touched. No recapture, no re-annotation from scratch, no re-sequencing. The reduction in friction is proportional to how often you ship. Low-cadence teams feel it occasionally; weekly-shipping teams feel it every sprint.
Version control is the thing most demo tools skip
When the demo lives in your repo, it gets the same version control discipline as the product. You can review a demo change in a PR, roll back to the last known-good version if a chapter breaks, and maintain a clear source of truth for what the demo showed at any point in time. Most SaaS demo tools have no equivalent. The demo is a live artifact in their platform, and "what did this look like last Tuesday" is unanswerable. For teams that ship often and demo to investors or key accounts, that audit trail matters.
Measure the demo so you know where it loses people
A demo you cannot measure is a demo you cannot improve. The three signals that matter are clicks, completion, and activation.
Clicks tell you where interest starts
Click data shows which callout is earning attention and which step the viewer engaged with. If the annotation on chapter two gets three times the clicks of chapter three, chapter two is doing the work, and chapter three might be the wrong step in the flow, or the annotation is not landing. Use click data to find the moments of real interest, then make sure the story is building toward them.
Completion tells you where the story gets too long
Drop-off by chapter tells you where the demo loses people. A chapter with high drop-off is either too long, positioned wrong in the flow, or covering something the viewer does not care about yet. A dead step, one where the viewer neither clicks nor advances, is usually a screen that explains instead of shows. Cut it or move it later in the flow.
The metric that matters is the one tied to activation
Completion rate is a proxy. The metric that matters is whether the viewer took the next step: started a trial, booked a call, requested access. A demo with 40% completion and 20% CTA conversion is more valuable than one with 80% completion and 2% conversion. Connect the demo analytics to the next step in the buying motion and measure the handoff, not just the walkthrough.
Where to store product demo examples in your codebase
The folder structure that keeps the demo visible
The failure mode with repo-native demo examples is burying them somewhere only the person who created them knows about. A `/demos` folder at the repo root, or a `/demo` subfolder inside `/app`, keeps the asset visible to everyone who opens the project.
The structure should loosely mirror the product itself. If the product has an onboarding flow and a billing flow, the demo folder should have `onboarding.html` and `billing.html`, not `demo-v3-final-FINAL.html`.
What belongs in the demo folder and what does not
Versioned with the product:
- Demo HTML/component files
- Fixture data and seeded states (`seed-data.json`, `demo-user.json`)
- Copy files (`copy.md`) - headlines, CTA text, tooltip labels
- Brand assets used in the demo (logo, color tokens)
Generated on demand, not committed:
- Per-customer variant outputs
- Rendered screenshots or video exports
- AI voiceover audio files
That boundary matters because it keeps the demo folder small and easy to review. A reviewer looking at a PR that touches `/demo/onboarding.html` should be able to understand what changed in thirty seconds.
Generate the first product demo examples from a real flow
Start from the path buyers actually need to see
The most common mistake with interactive demo examples is starting from the feature list. Start from the moment that makes a buyer say, "I get it." For a billing tool, that might be the first invoice that appears automatically. For an onboarding tool, it might be the activation milestone.
Strip the path down to the minimum number of screens that carry that moment. Three to five screens is usually enough. A ten-screen tour teaches the viewer about the product; a four-screen demo proves the promise.
Use fixtures and seeded states instead of fake hand-waving
A believable demo does not need live data. It needs realistic data. That means data with the same shapes and constraints as the real app: real field names, plausible values, and states the app can actually reach.
Store fixture data in `demo/fixtures/seed-data.json` and reference it from the demo components. When the product's data model changes, the fixture file becomes the thing that breaks. That is exactly what you want, because it surfaces the mismatch before the demo ships.
Vercel's call summary agent template organizes its demo files in a `/demo-files` folder with realistic mock data. The same pattern applies here. Seeded states, not hand-waved placeholders.
Keep the CTA tied to the buyer's next step
The demo should end on one action. For a sales-led motion, that is "book a call." For PLG, it is "start your free trial." For onboarding, it is "complete setup." The CTA should match where the viewer is in the funnel, not where you want them to be.
Hard-code the CTA target in `copy.md` so it shows up in code review and is easy to swap per variant.
Review and test product demo examples before they ship
The trust check
Before a demo ships, four things have to be true: the UI matches the current product, the copy is accurate, the CTA works, and the flow still mirrors real product behavior. Check them in that order.
A quick review checklist:
- Open the demo and the live product side by side. Count mismatches.
- Read every label in the demo against the current product UI.
- Click the CTA. Does it go where it should?
- Walk the demo path against the real onboarding or activation flow. Does it still prove the same thing?
The failure you catch only in staging
Code-owned demo examples have one failure mode that screenshot tools do not: the demo can render correctly in local dev and break in staging if the fixture data references a field that the staging environment handles differently.
The fix is to run the demo against staging before every release, not just against local fixtures. A demo that looks fine in review and shows a broken state field to a prospect is worse than no demo.
How to keep the demo from becoming a guess
The demo drifts when nobody owns the update loop. Assign demo review to the same person who owns the release checklist. One line in the PR template - "Does this change affect the demo?" - is enough to catch most regressions before they ship.
Stripe's approach to customer-facing assets treats the customer portal as a product artifact with its own release discipline. The same mindset applies to demos: they are product artifacts, not marketing collateral, and they deserve the same review gate.
Match product demo examples to audience and release cadence
Sales, PLG, and onboarding want different cuts
One base demo can branch into three variants without rebuilding from scratch:
- Sales: full flow, branded with the prospect's logo, CTA is "book a call"
- PLG: shorter path, ends at the trial signup, no sales friction
- Onboarding: the activation moment only, CTA is "complete setup"
The base demo lives in `/demo/flows/onboarding.html`. Each variant is a prompt away: "produce a sales variant with Acme Corp branding and a Calendly CTA." The agent generates the variant file; the base stays unchanged.
Complex SaaS needs more structure than simple products
This format is worth the setup cost when the product ships frequently and the demo needs to stay current across multiple audiences. If the product ships once a quarter and has one buyer persona, a Supademo capture is probably the right call. The maintenance overhead of a code-owned demo will not pay off.
The threshold is simple: if you've re-recorded a demo more than twice in a quarter because the product changed, the repo-native model pays for itself.
Lead qualification should shape the CTA
The demo's final CTA is a filter as much as a conversion mechanism. A CTA that says "book a 30-minute call" filters for buyers who are ready to talk to sales. A CTA that says "start free" filters for self-serve buyers. A CTA that says "see the enterprise plan" filters for buyers with budget.
Match the CTA to the buyer you want to attract, and store it in `copy.md` so it is easy to swap per variant without touching the demo logic.
Where Inkly comes in
The structural problem this article keeps circling is that most demo tools make the demo a recording inside their platform. That means every UI change, every new customer, every variant is a rebuild, re-capture, re-annotate, re-publish. The tool that solves this is not a better screen recorder. It is one that makes the demo code you own, so your agent can update it the same way it updates the product.
Inkly is built on that premise. The demo is code that lives in your repo, authored through the three-prompt loop: prompt to create, prompt to update, prompt to produce a variant for the next customer. The Chrome extension gives you the same fast first capture as Supademo; the difference shows up the next time you ship. Instead of re-recording the affected screens, you re-prompt the agent against the existing demo code. The honest tradeoff: Inkly requires a coding agent (Cursor, Claude, Codex) and a repo workflow. If your team does not operate that way yet, the bring-your-own-agent path is extra setup. But if you already live in a repo and ship often, the demo that stays current with one prompt is the one worth building once.
FAQ
Q: What does a strong interactive demo example actually look like structurally, beyond just being polished?
One job, one story, clear chapters, annotations that explain what to notice, and a CTA that matches the buyer's next step. The structure is: problem -> aha moment -> proof -> action. Every screen either advances the story or gets cut. Polish is the last thing to add, not the first thing to optimize.
Q: Which demo pattern should I use for a founder-led SaaS product versus a more complex B2B workflow?
Founder-led SaaS: three to five screens, one aha moment, one CTA, no chapter navigation needed. The buyer is a single decision-maker who wants to see the core value fast. Complex B2B workflow: chapters with named segments, each covering one discrete step with a visible output. The chapter structure lets the buyer jump to the part relevant to their role and gives you a clean unit of maintenance when the product ships.
Q: How do I build an interactive demo that can be updated without re-recording the whole thing every time the product changes?
Build the demo as code in your repo, with chapters as separate files. When the product ships a UI change, describe the change to your coding agent and let it update the affected chapter file. The rest of the demo stays untouched. This is the core difference between a code-owned demo and a SaaS-locked recording: the recording has no boundaries, so every change potentially cascades; the code has chapter boundaries, so changes are scoped.
Q: What are the reusable building blocks of a good interactive demo: story, chapters, annotations, CTA, and personalization?
Story is the through-line, one narrative from problem to resolution. Chapters are named segments that let viewers jump and give you a clean unit of maintenance. Annotations are context callouts that explain what to notice, not just labels. The CTA names the next real step in the buying motion. Personalization swaps company-specific data, logo, name, sandbox data, per viewer without rebuilding the flow. All five belong in your demo structure before you write a single screen.
Q: How short should an interactive demo be, and how many steps is too many?
Long enough to reach the aha moment; short enough that nothing after it is filler. For most SaaS products, that is three to seven screens. The signal that the demo is too long is drop-off data: a chapter where viewers consistently stop is either covering something they do not care about yet or positioned wrong in the flow. There is no universal number. The right length is whatever it takes to reach the moment of genuine value, and no longer.
Conclusion
If the demo lives in code, it can change when the product changes. That is the whole premise. Pick one flow, the tightest one, the one that gets a buyer to the aha moment fastest. Break it into chapters. Build it in your repo this week. The screen recorder is not going anywhere, but the demo you will still trust after the next release is the one your agent can update from a prompt, not the one you have to recapture from scratch.
See how Inkly works: how the agent creates the demo and keeps it current after releases.
Ship your next demo before the meeting starts
Interactive demos built from your real product and kept current as you ship, done for you.





