This document explains how to record a high-quality demo GIF/video for VisionFlow Studio.
Before recording, verify the system is in canonical state:
# Reset DB to seeded canonical state
pnpm seed:db -- --reset
# Run Phase 23 full E2E proof
pnpm meta:harness:phase23Expected result: ALL HARNESSES PASSED (DB + API + Playwright)
Tools recommended:
- Windows: ScreenToGif (recommended — free, lightweight)
- macOS: LICEcap or built-in Screen Recording
- Cross-platform: LICEcap
Display settings:
- Resolution: 1280×720 or 1920×1080
- Frame rate: 15 FPS (sufficient for UI animations)
- Output: GIF or WebM, max 5MB
Recording area:
- Capture only the browser window, not the full desktop
- Leave 10px padding on all sides
- Remove browser bookmarks bar
Record the following 9-step flow. Target duration: 45–60 seconds.
A full manual walkthrough is available in DEMO-CHECKLIST.md.
Open VisionFlow Studio at http://localhost:5173. Show all 8 navigation sections.
Point out the ReadinessStrip — it reads real backend state from /api/health/runtime/status,
not mock data. Shows: Database ready, Queue ready, CV Worker configured.
Navigate to Media tab. Upload a sample image. Show:
- Real-time upload progress bar
- SHA-256 dedupe indicator
- Thumbnail generated by CV worker (real Pillow → WebP)
- Asset table with dimensions extracted by
sharp
Navigate to Versions tab. Show:
- Canonical LOCKED dataset version:
parking_v3 - Split distribution: TRAIN / VALID / TEST
- Locked versions show a lock indicator
- Image dimensions from real
sharpextraction
Navigate to Annotate tab. Show:
- Bounding boxes for car / van / truck on
north-gate-frame-1482.jpg - Color-coded labels (green = ground truth)
- Label selector dropdown
- Locked dataset rejects annotation mutations (enforced by API)
Navigate to Pipeline tab. Show:
- Visual pipeline graph: Input → Resize → Detector → NMS → Output
- YOLOv8n detector node config: 640×640, confidence 0.25, NMS 0.45
- Pipeline validation passing
Navigate to Jobs tab. Show:
- Canonical SUCCEEDED job:
job_2026_04_28_2036 - Job metadata: dataset version, pipeline, model, progress log
- 3 real predictions with label, confidence, and bounding box geometry
- Predictions persisted in PostgreSQL via NestJS API
In the Jobs panel, show:
- Evaluation metrics: Precision, Recall, F1, Mean IoU (all 1.0 for perfect match)
- Per-class breakdown: car, van, truck — each with TP=1, FP=0, FN=0
- Reports persisted with deterministic
inputHashandmetricsHash - Run
pnpm harness:phase22ato see the hash verification
Navigate to Replay tab. Show:
- BBox morph animation between frames
- Ground truth / prediction toggle
- Playback controls
Navigate to Diff tab. Show:
- Version comparison interface
- IoU-based added/removed/changed annotation detection
-
Optimize the GIF at ezgif.com/optimize:
- Reduce colors to 128 or 64
- Set lossy compression to 10–20
- Target: < 3MB
-
Trim precisely using ezgif.com/crop if needed
-
Save as WebM if GIF size is problematic (better compression at same quality)
-
Place the file:
docs/demo/demo.gif ← GIF format # or docs/demo/demo.mp4 ← MP4 format (if small enough) -
Update README.md reference if using a different path
# Full Phase 23 proof (DB + API + Playwright)
pnpm meta:harness:phase23
# Phase 22A: 18-point fixture infrastructure
pnpm harness:phase22a
# Phase 22B: 8-point API production path
pnpm meta:harness:phase22b -- --strict --with-api
# Playwright production-path smoke (11 tests)
cd apps/web && pnpm exec playwright test e2e/production-path.spec.ts
# Playwright full vertical slice (19 tests)
cd apps/web && pnpm exec playwright test e2e/full-vertical-slice.spec.ts
# API smoke
curl http://localhost:3000/api/health
curl http://localhost:3000/api/health/runtime/status
curl http://localhost:3000/api/projects/proj_parking_lot/datasets
curl "http://localhost:3000/api/projects/proj_parking_lot/dataset-versions/dataset_proj_parking_lot_parking_v3/export/coco"If recording a GIF is not possible, use high-quality static screenshots:
-
Take screenshots at each step above
-
Use Cloud Convert to create an animated GIF
-
Or embed individual images in the README using markdown:
## Demo ### Media Upload  ### Dataset Versioning  ### Annotation  ### Pipeline Builder  ### Evaluation Results 
- Practice first — Run through the flow 2–3 times before recording
- Clean state — Reset browser cache and localStorage before recording
- No audio — Keep the demo silent
- No cursor trail — Disable cursor effects
- Consistent speed — Use the same pacing throughout
- End cleanly — Let the final screen sit for 1–2 seconds before stopping