Screen-record demo videos and screenshot sets of the real product, filed by repo/flow and mirrored to Google Drive

Record

The engine films and photographs databayt products as they actually run — signup flows, onboarding wizards, block features — and files every asset into one organized library that mirrors to Google Drive. Say it in prose: "record video for school onboarding", "record admission", "re-record the stale blocks".

This is the product-truth archive. Generated marketing media never lands here — that is higgs + the showroom on the media page. To cut, caption or reframe a take into a reel, hand it to edit.

The library

Raw footage is filed under the same words as every other media asset — the flow name (<verb>-<entity>) that also names the shoot flow, the files on the CDN and the product manifest id. Raw takes sit in the flow's raw/ folder, beside its finished media:

~/media/<repo>/<flow>/raw/<flow>[-<part>]-<locale>.<ext>

hogwarts/add-student/raw/add-student-ar.mov
hogwarts/onboarding/raw/onboarding-otp-ar.mov
hogwarts/onboarding/raw/03-verify-ar.png        a still needs --part NN-<step>
  • Same name = replaced. A re-record overwrites the take and its manifest.json entry (repo, block, flow, url, repo sha at capture, date, note) — no -vN siblings.
  • No --flow: the URL slug stands in (scheme/host, locale prefix and /s/<subdomain> stripped).
  • The deliverable (ad cut or edit) goes to ~/media/<repo>/<flow>/<flow>-<locale>.mp4 and reaches the CDN with shoot/scripts/publish.mjs --flow <flow> as <flow>/video-<locale>, at cdn.databayt.org/hogwarts/<route>/<flow>-<locale>.<hash>.mp4 — the CDN mirrors the app's routes.
  • Mirror: My Drive → databayt → media (record.sh sync; the local library is the truth, Drive is the mirror)

The machinery

PieceWhere
Skill (the playbook).claude/skills/record/SKILL.md
Agent (the videographer).claude/agents/record.md
CLI (capture/file/sync/stale).claude/scripts/record.sh
Staleness nudge (SessionStart).claude/hooks/session-media-stale.sh
Spellrecord — The Pensieve, keywords
record.sh start intro    # begin a screen-recording segment
record.sh stop           # SIGINT + ffprobe verify — never plain kill
record.sh otp            # screenshot the Outlook desktop inbox (off camera)
record.sh assemble x     # concat segments into one .mov
record.sh file <src> --repo hogwarts --block onboarding --flow onboarding --url <real-url>
record.sh sync           # mirror to Google Drive
record.sh stale          # what needs a re-record

Flows behind logins and OTPs

Recording real flows means completing them — the engine handles the walls on its own:

  • Fresh identity per take: osmanabdout+<take>@hotmail.com (+ aliases deliver to the same inbox; reusing one collides with prod leftovers from prior takes)
  • Hotmail/Outlook codes: the signed-in Outlook desktop app, read off a screenshot — codes are 4 digits. AppleScript cannot read New Outlook's mailbox and the automation Chrome profile is logged out of web Outlook; the screenshot lane is the one that works
  • Gmail codes: the Gmail MCP reads them without any screen work
  • Anything else: the auth and credentials skills (Keychain identities)

Recording happens in segments — stop, fetch the code off camera, resume — so the inbox never appears in the footage.

Iterate

The library stays honest by construction: every asset records the repo sha it was captured at. When a block's source gains commits, the session-media-stale hook says so at session start, and record.sh stale lists exactly what drifted. Re-recording replaces the same name (no versions); fine-tune a video with an ffmpeg trim, a screenshot by recapturing the route.

One-time macOS permissions

GrantEnables
Screen recording (already granted)screencapture -v
Full Disk Access for the terminal appfast rsync into the Drive folder
"Control Finder" automation (or the above)the Finder copy sync lane

Sweeps are serial by design — one screen, one recorder — so there is deliberately no multi-agent fan-out here; the skill plans the shot list, then works it in order.