Flyback · Demo Prep

Make it ready
to show someone.

June 14, 2026  ·  16 commits  ·  ~9 hours

A full day hardening Flyback for real-world demo. Rewrote the start page as a narrative landing, built the voice narration kit, added geolocation opt-in, fixed accessibility, and made every rough edge demo-safe.

Jun 14 · 7am
Plat map hero
Start page background
Jun 14 · 8am
Narrative landing
Start page rewrite
Jun 14 · 9:30am
Voice narration
Studio kit + metadata strip
Jun 14 · 10:40am
Accessibility pass
Splash + About redesign
Jun 14 · 1:30pm
Geolocation + story
Medina origin + places
Jun 14 · 4:15pm
Demo hardening
Fragility fixes + UX

16 commits. Demo-ready.

Narrative start page

  • Full rewrite as story-driven landing
  • 1854 plat map as hero background
  • Clear path hierarchy: Explore → Studio → Sources
  • Accurate runtimes and research description

Voice narration kit

  • Studio voice mode for guided presentation
  • Internal build-note slides skipped automatically
  • Yellow metadata elements hidden in voice mode
  • Narration regenerated clean (no metadata artifacts)

Sources & Acknowledgments

  • New panel with dual entry points
  • Linked from start page and in-app
  • Credits local historical sources

Accessibility pass

  • Splash screen redesigned for readability
  • About panel layout overhauled
  • Mobile improvements across all panels
  • Share button clipboard fixed on HTTP dev server

Geolocation opt-in

  • Explicit opt-in prompt before any location request
  • Flight label: shows "Medina, OH → [destination]"
  • Medina origin story wired as the default start

Demo hardening

  • Fragility fixes: crash-prone paths identified + patched
  • StoryCard UX polish: tap targets, spacing, transitions
  • Pin toolbar removed (was confusing in demos)
  • Title and meta tags corrected
  • Project cleanup: stale files removed

The hard parts.

Voice narration regenerating with metadata artifacts

The studio voice deck was including internal build notes and yellow metadata markers in the narration output. These showed up as "[INTERNAL]" fragments when read aloud — obviously not demo-safe.

Two-step fix: first skipped internal slides via a filter, then stripped yellow metadata elements from the narration text pipeline. Regenerated clean narration after both fixes confirmed.

Share button clipboard failed on HTTP (dev server)

The navigator.clipboard API requires a secure context (HTTPS). On the local dev server over HTTP, the share button silently failed — no copy, no error shown to the user.

Added fallback to `document.execCommand('copy')` when clipboard API is unavailable. Added a visible "Copied!" confirmation so failure is never silent.

Revert: build-note slide skip broke voice mode

The first attempt at skipping internal slides filtered too aggressively — it also skipped slides that had internal metadata but were still meant to be shown in voice mode. Committed, then immediately reverted.

Rewrote the filter to check for an explicit `internal: true` flag on slides only, not any slide containing metadata elements.

Pin toolbar confused demo viewers

The map pin toolbar was visible by default and several demo viewers tried clicking it before understanding the core exploration flow. It created a "what does this do?" moment early in the demo.

Removed the pin toolbar from the default view. Pins are still functional but the toolbar no longer appears unless explicitly invoked.

🗺️

Plat map as visual anchor

Using the 1854 Montville plat map as the start page hero immediately communicates what Flyback is about without a word of explanation. The map IS the pitch. No stock photo needed.

🎙️

Narrative landing over feature list

Rewriting the start page as a story ("Here's what you're about to experience...") made first impressions dramatically better. People leaned in. Feature lists make people scan; stories make people read.

📍

Geolocation opt-in before request

Asking permission in plain English before triggering the browser geolocation prompt eliminated the "why is this asking for my location?" reaction. Two-step consent = no friction, no distrust.

🧹

Demo hardening as a dedicated session

Treating demo prep as its own session (not a hasty pre-demo patch) meant we could be systematic — go through every panel, every tap target, every edge case. The app that comes out of this session is qualitatively different from the one that went in.

1

Clipboard API requires HTTPS — always add a fallback

`navigator.clipboard` is only available in secure contexts. Any share/copy feature must fall back to `document.execCommand('copy')` and must show visible confirmation so failure is never silent.

2

Strip internal content before any narration pipeline

Content marked internal (build notes, metadata annotations) must be filtered at the source before being passed to any voice or export system. Filtering downstream is fragile and prone to leakage.

3

Ask for geolocation in plain English before the browser prompt

Never trigger `navigator.geolocation.getCurrentPosition` without first showing an explicit plain-language opt-in. The browser prompt alone is not sufficient explanation for a new user.

4

Schedule demo hardening as its own session

Do not demo-prep in the last 30 minutes before showing someone. It produces hasty patches and missed edge cases. A dedicated hardening session finds real problems — rushed prep hides them until the worst moment.

5

Use historical assets as start page heroes

For a local history / time-machine app, the most compelling hero image is always the real historical document — not stock photography. The 1854 plat map is more arresting than any Unsplash image.

16
Commits
6
Areas hardened
1
Revert
5
New rules
~9h
Duration

"Demo hardening isn't polish. It's respect for the person you're about to show something to."

— Zeb, June 14, 2026