v1 onboarding demo: scenario, narration, and rig (Option A — picom live compositing)
TL;DR. The v1 demo shows plain onboarding in ~20 seconds of real 2K screen capture: create your first page in Obsidian → the trip2g sync plugin pushes it automatically on save → the signed-in browser (parked with the real live_follow feature) jumps to the freshly published page by itself. No terminal, no CLI — the plugin and the product do everything on camera. Narrated MP4 docs/demo-video/v1-optA-live.mp4 (23.6 s, 2560×1440, ends on a GitHub CTA card) + silent README GIF docs/demo-video/v1-optA-live.gif (13 s, 1100 px, 0.18 MB). Reproducer: autoproducer/scripts/hero-v1/run-all.sh. Every product pixel is real (honesty rule from the launch kit); the only non-product visuals are the wallpaper and the closing CTA card.
The v1 story (plain onboarding)
Get a vault → it's already a site → create your first page (title + one line) → save → it's live. Richer beats (MCP, agents, two-way sync) are for later cuts.
Rig (all real, Xvfb :99, 2560×1440, dwm + picom)
| Piece | What it is |
|---|---|
| Server | memcli instance demo-v1: node cli/memcli/dist/memcli.js up --folder autoproducer/demo-vault --name demo-v1 --port 24181 --image trip2g:local --no-hub --no-seed (docker container trip2g-memory-demo-v1, web http://localhost:24181). The memcli CLI sync watcher is killed — the Obsidian plugin does the syncing. |
| Vault | /home/alexes/projects2/autoproducer/demo-vault/ — minimal, isolated: _index.md (home), _header.md (mounts the site chrome incl. live features), _config/publish-everything.md (a real type: frontmatter-patch note with include: ["**"] + { free: true } so every note is public). |
| Left window | Obsidian 1.12.7 (real AppImage, isolated XDG_CONFIG_HOME, dark theme, scale 1.5) with the demo vault and the real trip2g sync plugin 0.6.1 enabled, autoSyncOnSave: true. Core sync/publish plugins disabled (kills the red "Uninitialized" badge). |
| Right window | Chromium (scale 1.75) signed in once via memcli's HAT login URL, parked on http://localhost:24181/?#!live_follow=1 — the product's real live-follow ("cinema mode"). |
| Look | Option A, live compositing: floating windows with 48 px padding, picom (xrender; rounded corners 14 px + soft shadows), feh gradient wallpaper (#1b2733→#0d1117, ImageMagick-generated), dwm bar hidden (alt+b), cursor parked on the wallpaper. picom + feh run from autoproducer/vendor/{picom-root,feh-root} (extracted .debs — no sudo on this box). |
Why the browser is signed in (honesty note)
noteChanges (the SSE subscription behind live-reload/live-follow) rejects anonymous subscribers by design (internal/graph/note_changes_acl.go). The demo browser is the owner's browser, signed in via memcli's HAT link — exactly what memcli open produces for a real user. Anonymous visitors see the published page; the live-follow beat is an owner-session feature.
Narration (ElevenLabs eleven_multilingual_v2, voice parameterized; 20.16 s)
My site runs on trip2g. And it is just an Obsidian vault. Let me create the first page: a title, a line of text. Save. The plugin syncs it automatically — and the browser is already on the new page. Live on my own server, seconds after typing. That's trip2g. Your notes, published. It's open source — try it, and if you like it, star it on GitHub.
- English render (this cut): voice
tvApEij8Hu2VscOrlzzV. - Voice swap is ONE command:
VOICE_ID=<id> node autoproducer/scripts/hero-v1/vo.mjs .then rerunrun-all.sh(beats are timed against the newvo-align.jsonword timestamps — re-check the beat table if the pacing shifts). - Russian voice on file for a possible RU cut:
87ifZMBSxa6PWYnKMWiH(not rendered in v1).
Beat sheet (times = VO seconds; the audio is the clock)
| t (s) | VO says | On screen |
|---|---|---|
| 0–4.3 | "My site runs on trip2g. And it is just an Obsidian vault." | static scene: Obsidian (empty New tab) left, site home right |
| 4.6 | "create the first page" | Ctrl+N |
| 5.85 | "a title" | type My first page |
| 6.7 | "a line of text" | Enter, type This page went live the moment I saved it. |
| 7.95 | "Save." | Ctrl+S |
| ~10.5–11.5 | "the plugin syncs it automatically — and the browser is already on the new page" | product acts, not the script: plugin auto-push fires (debounce 2.5 s), Notice "Pushed 1 files to server", live_follow navigates the browser to /my_first_page |
| 12.2–16.9 | "Live on my own server… Your notes, published." | hold on the live page |
| 16.9–20.2 | CTA line | cross-fade to the end card (endcard.png: repo URL + star invite) |
Cuts
- Narrated MP4 (landing/social):
docs/demo-video/v1-optA-live.mp4— 2560×1440, 23.6 s, crf 17veryslow, AAC 160k, CTA end card. - README GIF (silent):
docs/demo-video/v1-optA-live.gif— VO ≈2→15 s (typing → save → push Notice → browser jumps), 12 fps, 1100 px, 0.18 MB (≤5 MB budget; ffmpeg palette — gifski is not apt-installable on this box). - Raw 2K capture:
docs/demo-video/v1-optA-live-raw.mkv; VO:docs/demo-video/v1-vo.mp3.
Reproduce
/home/alexes/projects2/autoproducer/scripts/hero-v1/run-all.sh /tmp/v1-out
One-time setup is documented in the script header (memcli up, plugin install into the vault, vendor picom/feh, Obsidian trust click, HAT sign-in, VO generation). Per-take the script: hides + content-scrambles the demo note server-side → deletes it locally → restarts Obsidian (pkill -f mount_obsidi — AppImage processes don't match the launcher path) → clears the plugin's localStorage sync-state via CDP (obs-reset.mjs) → re-arranges/verifies floating windows → CDP-navigates the browser (cdp-nav.mjs) → starts picom → records (record.mjs, VO-clocked beats) → encodes MP4+GIF.
Hard-won gotchas (for the next take)
- Electron windows mapped under running picom-xrender render black on this Xvfb — start picom after the apps.
- Obsidian is single-instance per config dir: "relaunching" while the old process lives just refocuses it; kill by
mount_obsidi(AppImage mount path), not the/usr/local/bin/obsidianlauncher path. - Plugin sync-state lives in Obsidian's localStorage, not
data.json; wiping the wholeLocal Storageleveldb also wipes vault trust (trust dialog returns). Clear just thesync-state/published-urlskeys via CDP and cycle the plugin. - Pushing content identical to the (hidden) server version is a no-op — the per-take reset must scramble the server-side note content, or the retake never publishes.
- A session-restored Chromium page carries a dead SSE subscription — always force a fresh load (CDP
Page.navigate), or live_follow silently never fires. xdotool searchreturns stale/hidden window ids — intersect with dwm's client list (dwm_get_state) before focusing; verify focus viagetactivewindowbefore typing a single key.- ImageMagick's
display -window rootsets a root pixmap picom can't bind (black band) — usefeh --bg-fill.
Known blemishes (accepted)
- The site renders in its default light theme next to dark Obsidian — reads as "editor vs published site".
- Obsidian shows its own window chrome/tabs — authentic.
- The click-ripple/smoothmove guidance is moot for this take: it is keyboard-only, the cursor sits parked on the wallpaper (parked via
smoothmove.pybefore the recording starts).