Files
zooqueenandHanzo Dev 70b41673a3 frames: rebrand the fork to Hanzo Frames
Forked from HyperFrames (Apache-2.0), full history preserved.

Hosts are mapped explicitly and BEFORE the identifier rename, because
hyperframes.heygen.com is not decoration: 175 of its occurrences are $schema
identifiers that a validator dereferences. A blind rename would have left them
naming a host that never serves them. The schema files are in this repo under
docs/schema, so the mapped host is one we can actually serve -- that is the
condition that makes the rewrite safe, and serving them is a deploy task, not
an edit. docs/schema/hyperframes.json is renamed to frames.json to match the
identifier it is now published under.

api.heygen.com and the CLI auth against heygen.com are left UNRENAMED on
purpose. They are a dependency on HeyGen's SaaS, not a name of ours to take,
and the right move is to remove that integration rather than rebrand it.

LICENSE and CREDITS.md are untouched; NOTICE records the lineage.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 23:42:24 -07:00

2.1 KiB

format, message, arc, audience, voice
format message arc audience voice
1920x1080 Ship a launch video in an afternoon Hook → Problem → Solution → Proof → CTA indie devs on X Rachel — 5 lines from SCRIPT.md

Frame 1 — Hook

  • scene: Big type punches in on the beat
  • duration: 3s
  • poster: 2s
  • transition_in: cut
  • status: animated
  • voiceover: "Ship a launch video in an afternoon."
  • src: compositions/frames/01-hook.html

Open cold on the promise. Big type punches in on the beat: "Ship a launch video in an afternoon." This is the thesis — everything after pays it off.

Frame 2 — The problem

  • scene: A 20-minute timer spins on a stack of rejected takes
  • duration: 4s
  • poster: 2.6s
  • transition_in: crossfade
  • status: animated
  • voiceover: "The old way? Prompt, wait twenty minutes, get something that misses."
  • src: compositions/frames/02-problem.html

The old way: prompt, wait twenty minutes, get something that misses. A timer spins while a stack of rejected takes piles up. Establish the pain we remove.

Frame 3 — The feature in action

  • scene: Frames line up as a contact sheet
  • duration: 5s
  • poster: 3.3s
  • transition_in: crossfade
  • status: built
  • voiceover: "You lock the story first — then it animates."
  • src: compositions/frames/03-feature.html

Cut to the storyboard view itself. Frames line up as a contact sheet and the narration says "...you lock the story first, then it animates." Show, don't tell.

Frame 4 — Proof

  • scene: A stat counts up to the payoff number
  • duration: 4s
  • poster: 2.6s
  • transition_in: wipe
  • status: built
  • voiceover: "Fewer re-renders. More finished videos."
  • src: compositions/frames/04-proof.html

A real metric lands: fewer re-renders per finished video. Number counts up while a caption credits the storyboard-first flow.

Frame 5 — Call to action

  • scene: End card with the wordmark and a one-line CTA
  • duration: 3s
  • transition_in: crossfade
  • status: outline
  • voiceover: "Try it: npx frames."
  • src: compositions/frames/05-cta.html

End card, still an outline. "Try it: npx frames" with the wordmark. Not built yet — this frame should render as an outline placeholder in the grid.