Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
60350f4
refactor(skills): fold six domain skills into hyperframes and media-u…
WaterrrForever Oct 15, 2026
9945c41
feat(skills): slim the core entries and give media-use a HeyGen and a…
WaterrrForever Oct 15, 2026
70f4797
fix(skills): plugin runs skip skills update; media-use explains HeyGe…
WaterrrForever Oct 15, 2026
15c95ed
chore(skills): drop a committed Python bytecode file and ignore bytecode
WaterrrForever Oct 15, 2026
6c52be5
feat(skills): align the entry with the Studio skills and keep the wor…
WaterrrForever Oct 15, 2026
cbdc005
feat(skills)!: retire the workflow skills and folded guides; publish …
WaterrrForever Oct 15, 2026
b65388b
fix(skills): resolve the local.md captions link and allow capture's o…
WaterrrForever Oct 15, 2026
3cd7644
fix(skills): regenerate the skills manifest from tracked files only
WaterrrForever Oct 15, 2026
bc4653c
fix(docs): restore generated catalog pages and docs navigation to main
WaterrrForever Oct 15, 2026
52ec786
build(cli): raise the CLI size budget for the skill references it bun…
WaterrrForever Oct 15, 2026
a197f27
test: keep repo-sweep guards meaningful after the workflow skills left
WaterrrForever Oct 15, 2026
e05215d
feat(skills): slim figma, slideshow and remotion to the Studio shape;…
WaterrrForever Oct 15, 2026
8366864
fix(skills): manifest without local bytecode; Studio's edit prompt na…
WaterrrForever Oct 15, 2026
7bf91c1
fix(skills): render when the person asks for the file or for no stops…
WaterrrForever Oct 15, 2026
fe322ba
fix(skills): keep the voiceover carve in media-use; presets stage the…
WaterrrForever Oct 15, 2026
bcc0e65
chore(skills): regenerate the manifest without local bytecode
WaterrrForever Oct 15, 2026
5de395a
fix(skills): the CLI render step follows step 4's rule, not approval …
WaterrrForever Oct 15, 2026
0dc8978
Merge remote-tracking branch 'origin/main' into miao/oss-skills-slim
WaterrrForever Oct 15, 2026
0e82757
fix(ci): run the core-skills check from lint again after the main merge
WaterrrForever Oct 15, 2026
2ebaf6f
Merge remote-tracking branch 'origin/main' into miao/oss-skills-slim
WaterrrForever Oct 15, 2026
13a070e
feat(skills): films that tell a story start from three storylines; ma…
WaterrrForever Oct 16, 2026
9e4c9ce
fix(skills): story.md follows the entry: no voiceover unless asked
WaterrrForever Oct 16, 2026
09d8788
fix(skills): bake-basemap starts from a globe and stops waiting out i…
WaterrrForever Oct 16, 2026
0e184dc
fix(skills): render in the foreground; wait on a detached render's lo…
WaterrrForever Oct 16, 2026
b65c285
feat(skills): route each kind of film; storylines carry look and soun…
WaterrrForever Oct 16, 2026
ed0b0d6
feat(cli): check warns on unread lines, dead stretches, small type, e…
WaterrrForever Oct 16, 2026
bf57e60
feat(cli): snapshot --review captures a beat sheet, seam strips and a…
WaterrrForever Oct 16, 2026
ba5dbec
fix(cli): craft warnings stay out of --strict; a hold gets a real nex…
WaterrrForever Oct 16, 2026
3bbc78f
fix(cli): review spreads beats when every scene starts together; map …
WaterrrForever Oct 16, 2026
f4ee63c
fix(cli): review frames each scene at its middle too, not only 0.3 s in
WaterrrForever Oct 16, 2026
ea8aecb
feat(skills): a film is built from a numeric SPEC.md, with defaults b…
WaterrrForever Oct 16, 2026
0df7f1e
fix(skills): story before look; every object reads as itself; posters…
WaterrrForever Oct 16, 2026
4d6379e
fix(skills): storylines are three films in words, each with a device …
WaterrrForever Oct 21, 2026
5c16c42
Merge origin/main into miao/oss-skills-slim
WaterrrForever Oct 21, 2026
866babc
ci: list main's new embedded-captions hf-cli test among the retired w…
WaterrrForever Oct 21, 2026
f9b7223
fix(core): keep the audio preset comment within core's size budget
WaterrrForever Oct 21, 2026
6cf89bb
fix(cli): craft keeps its own 8 fps grid; comments back within the ch…
WaterrrForever Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
31 changes: 14 additions & 17 deletions .agents/skills/captions-overlay/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
name: captions-overlay
description: Overlay doctrine for the embedded-captions workflow — the caption MODEL (drop / rail / embed) and the rule that captions are an OVERLAY composited on top of the film, never a reserved bottom band you shift content up to avoid. Load when adding captions/subtitles to a talking-head or launch video, when deciding whether a phrase should be dropped, ride the verbatim rail, or be promoted to a scarce embedded climax, when laying out a composition that will carry captions (do NOT reserve a keep-out band), or when centering a composition on the true frame center under captions. Quotes the rail+embed model from embedded-captions and constraint #13 (captions overlay, keep-out band retired) from the product-launch-video scene agent. Applies ON TOP of embedded-captions.
description: Overlay doctrine for captions in HyperFrames videos — the caption MODEL (drop / rail / embed) and the rule that captions are an OVERLAY composited on top of the film, never a reserved bottom band you shift content up to avoid. Load when adding captions/subtitles to a talking-head or launch video, when deciding whether a phrase should be dropped, ride the verbatim rail, or be promoted to a scarce embedded climax, when laying out a composition that will carry captions (do NOT reserve a keep-out band), or when centering a composition on the true frame center under captions. Applies ON TOP of the `/hyperframes` skill's references/captions.md.
metadata:
internal: true
---

# Captions Overlay Doctrine

> **Overlay doctrine — supplements the upstream `embedded-captions` skill. Applies ON TOP of it; do not expect it folded into the upstream skill.**
> **Overlay doctrine — supplements the upstream `/hyperframes` skill's `references/captions.md`. Applies ON TOP of it; do not expect it folded into the upstream skill.**
Two ideas combine here. First, the **caption model** — every spoken phrase is `drop`,
`rail`, or `embed`, and embed is the scarce earned peak, not the default. Second, the
Expand All @@ -19,7 +19,7 @@ frame and centers on the true vertical center.

## The caption model — drop / rail / embed

Every spoken phrase is one of three things (verbatim from `embedded-captions`):
Every spoken phrase is one of three things:

| | What | How it's shown |
| --------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -31,15 +31,13 @@ Every spoken phrase is one of three things (verbatim from `embedded-captions`):
never two adjacent/co-visible, spaced ≥ a beat apart. A short clip → usually one embed;
a long explainer → ~one per section. Embedding every word is the common mistake.

This is the **Standard** mode shape (rail = the verbatim lower-third; embed = the climax
composited behind the subject). **Cinematic** mode drops the rail and makes everything
embed-style — use it only for pure-cinematic asks, never for explainer / voiceover where
the words must read.
This is the default shape (rail = the verbatim lower-third; embed = the climax
composited behind the subject). A pure-cinematic treatment drops the rail and makes
everything embed-style — use it only for pure-cinematic asks, never for explainer /
voiceover where the words must read.

### Rail-first, embed-scarce (the load-bearing rules)

Quoted from the `embedded-captions` non-negotiables:

- **Rail-first for talking-head / explainer.** Don't embed the whole transcript — most
text is the rail; embed only peaks. Embedding everything is the default mistake.
- **Embed is scarce + spaced.** ≤1 embed per sentence/beat, never two adjacent or
Expand All @@ -48,11 +46,10 @@ Quoted from the `embedded-captions` non-negotiables:

## The overlay law — captions are NOT a reserved band

In a generated launch composition, when captions are enabled, finalize composites a
**small, minimal word-by-word caption line** as an overlay layer ON TOP of the whole
film (a single text line, bottom-centered, roughly the bottom ~5-8% of canvas height).
It is an overlay, not a reserved zone (verbatim from constraint #13 of the
product-launch-video scene agent):
In a composed video with captions enabled, the caption line is a **small, minimal
word-by-word line** composited as an overlay layer ON TOP of the whole film (a single
text line, bottom-centered, roughly the bottom ~5-8% of canvas height). It is an
overlay, not a reserved zone:

- **Center the composition on the TRUE vertical center — y = H / 2** (landscape 540,
portrait 960). Do not shift content up to "make room" for captions; a composition
Expand All @@ -64,7 +61,7 @@ product-launch-video scene agent):
line sits — the overlay would fight it. Large imagery / cards / ambient content under
the captions is fine; the caption skin is designed to read over content.
- There is no machine keep-out gate (the old `captions.mjs keepout` check is retired).
Finalize snapshot QA judges caption-over-content legibility visually.
Snapshot review judges caption-over-content legibility visually.

**When captions are disabled:** identical positioning freedom — the overlay simply
doesn't exist.
Expand All @@ -74,8 +71,8 @@ doesn't exist.
The model says the rail rides **in front** and an embed is a rare word composited
**behind the subject** — both are layers added to footage that ships untouched. The
overlay law says the caption line is a layer composited **on top** of the whole film,
not a band carved out of the layout. So in both the captioning pipeline and the
launch-video pipeline, captions are an overlay you add, not a zone you reserve:
not a band carved out of the layout. So whether captions go over footage or over a
composed film, they are an overlay you add, not a zone you reserve:

- Keep the full frame; center on true center; let content run to the edges.
- Make the rail (or the small overlay caption line) carry the verbatim words.
Expand Down
10 changes: 2 additions & 8 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,20 @@
{
"name": "hyperframes",
"source": "./",
"description": "Recommended: all published HyperFrames skills in one versioned bundle. Create and render videos from HTML; load workflows on demand without installing newer standalone skills.",
"description": "Recommended: all published HyperFrames skills in one versioned bundle. Create and render videos from HTML: the contract, film, captions, overlays, motion and look references, the CLI, the registry, media, Figma, slideshows and Remotion ports.",
"homepage": "https://hyperframes.heygen.com",
"license": "Apache-2.0"
},
{
"name": "core-skills",
"source": "./",
"description": "Legacy core-only installation. For release-managed bundled workflows, install hyperframes@hyperframes and then uninstall core-skills@hyperframes.",
"description": "Legacy core-only installation. For the release-managed bundle of every skill, install hyperframes@hyperframes and then uninstall core-skills@hyperframes.",
"homepage": "https://hyperframes.heygen.com",
"license": "Apache-2.0",
"skills": [
"./skills/hyperframes",
"./skills/hyperframes-animation",
"./skills/hyperframes-audio",
"./skills/hyperframes-cli",
"./skills/hyperframes-core",
"./skills/hyperframes-creative",
"./skills/hyperframes-keyframes",
"./skills/hyperframes-registry",
"./skills/hyperframes-studio",
"./skills/media-use"
]
}
Expand Down
31 changes: 14 additions & 17 deletions .claude/skills/captions-overlay/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
name: captions-overlay
description: Overlay doctrine for the embedded-captions workflow — the caption MODEL (drop / rail / embed) and the rule that captions are an OVERLAY composited on top of the film, never a reserved bottom band you shift content up to avoid. Load when adding captions/subtitles to a talking-head or launch video, when deciding whether a phrase should be dropped, ride the verbatim rail, or be promoted to a scarce embedded climax, when laying out a composition that will carry captions (do NOT reserve a keep-out band), or when centering a composition on the true frame center under captions. Quotes the rail+embed model from embedded-captions and constraint #13 (captions overlay, keep-out band retired) from the product-launch-video scene agent. Applies ON TOP of embedded-captions.
description: Overlay doctrine for captions in HyperFrames videos — the caption MODEL (drop / rail / embed) and the rule that captions are an OVERLAY composited on top of the film, never a reserved bottom band you shift content up to avoid. Load when adding captions/subtitles to a talking-head or launch video, when deciding whether a phrase should be dropped, ride the verbatim rail, or be promoted to a scarce embedded climax, when laying out a composition that will carry captions (do NOT reserve a keep-out band), or when centering a composition on the true frame center under captions. Applies ON TOP of the `/hyperframes` skill's references/captions.md.
metadata:
internal: true
---

# Captions Overlay Doctrine

> **Overlay doctrine — supplements the upstream `embedded-captions` skill. Applies ON TOP of it; do not expect it folded into the upstream skill.**
> **Overlay doctrine — supplements the upstream `/hyperframes` skill's `references/captions.md`. Applies ON TOP of it; do not expect it folded into the upstream skill.**
Two ideas combine here. First, the **caption model** — every spoken phrase is `drop`,
`rail`, or `embed`, and embed is the scarce earned peak, not the default. Second, the
Expand All @@ -19,7 +19,7 @@ frame and centers on the true vertical center.

## The caption model — drop / rail / embed

Every spoken phrase is one of three things (verbatim from `embedded-captions`):
Every spoken phrase is one of three things:

| | What | How it's shown |
| --------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -31,15 +31,13 @@ Every spoken phrase is one of three things (verbatim from `embedded-captions`):
never two adjacent/co-visible, spaced ≥ a beat apart. A short clip → usually one embed;
a long explainer → ~one per section. Embedding every word is the common mistake.

This is the **Standard** mode shape (rail = the verbatim lower-third; embed = the climax
composited behind the subject). **Cinematic** mode drops the rail and makes everything
embed-style — use it only for pure-cinematic asks, never for explainer / voiceover where
the words must read.
This is the default shape (rail = the verbatim lower-third; embed = the climax
composited behind the subject). A pure-cinematic treatment drops the rail and makes
everything embed-style — use it only for pure-cinematic asks, never for explainer /
voiceover where the words must read.

### Rail-first, embed-scarce (the load-bearing rules)

Quoted from the `embedded-captions` non-negotiables:

- **Rail-first for talking-head / explainer.** Don't embed the whole transcript — most
text is the rail; embed only peaks. Embedding everything is the default mistake.
- **Embed is scarce + spaced.** ≤1 embed per sentence/beat, never two adjacent or
Expand All @@ -48,11 +46,10 @@ Quoted from the `embedded-captions` non-negotiables:

## The overlay law — captions are NOT a reserved band

In a generated launch composition, when captions are enabled, finalize composites a
**small, minimal word-by-word caption line** as an overlay layer ON TOP of the whole
film (a single text line, bottom-centered, roughly the bottom ~5-8% of canvas height).
It is an overlay, not a reserved zone (verbatim from constraint #13 of the
product-launch-video scene agent):
In a composed video with captions enabled, the caption line is a **small, minimal
word-by-word line** composited as an overlay layer ON TOP of the whole film (a single
text line, bottom-centered, roughly the bottom ~5-8% of canvas height). It is an
overlay, not a reserved zone:

- **Center the composition on the TRUE vertical center — y = H / 2** (landscape 540,
portrait 960). Do not shift content up to "make room" for captions; a composition
Expand All @@ -64,7 +61,7 @@ product-launch-video scene agent):
line sits — the overlay would fight it. Large imagery / cards / ambient content under
the captions is fine; the caption skin is designed to read over content.
- There is no machine keep-out gate (the old `captions.mjs keepout` check is retired).
Finalize snapshot QA judges caption-over-content legibility visually.
Snapshot review judges caption-over-content legibility visually.

**When captions are disabled:** identical positioning freedom — the overlay simply
doesn't exist.
Expand All @@ -74,8 +71,8 @@ doesn't exist.
The model says the rail rides **in front** and an embed is a rare word composited
**behind the subject** — both are layers added to footage that ships untouched. The
overlay law says the caption line is a layer composited **on top** of the whole film,
not a band carved out of the layout. So in both the captioning pipeline and the
launch-video pipeline, captions are an overlay you add, not a zone you reserve:
not a band carved out of the layout. So whether captions go over footage or over a
composed film, they are an overlay you add, not a zone you reserve:

- Keep the full frame; center on true center; let content run to the edges.
- Make the rail (or the small overlay caption line) carry the verbatim words.
Expand Down
8 changes: 0 additions & 8 deletions .fallowrc.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,6 @@
// The relocated media-use .mjs files are agent-invoked scripts outside the
// import graph; keep the exemption scoped to that shipped script type.
"packages/cli/src/media-use/**/*.mjs",
// Agent-invoked motion-graphics tools co-located with their docs (run via
// `node <path>` per grounding/PROTOCOL.md / categories/maps/module.md
// prose), not import-graph reachable.
"skills/motion-graphics/grounding/**",
"skills/motion-graphics/categories/**",
// Agent-invoked reference materials (template + motion-primitive HTML, catalogs),
// forked by path by the frame-worker per SKILL.md prose, not import-graph reachable.
"skills/music-to-video/references/**",
// Bundled @font-face data (read at runtime via fs.readFileSync, invisible
// to the import graph) + its manual rebuild tool.
"skills/**/fonts/**",
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,6 @@ jobs:
- "skills/gsap/**"
- "skills/media-use/**"
skills:
- "scripts/generate-captured-font-copies.mjs"
- "packages/cli/src/media-use/**"
- "scripts/check-media-use-copy-parity.test.mjs"
- "scripts/check-skill-import-boundaries.test.mjs"
Expand All @@ -192,7 +191,6 @@ jobs:
- ".claude-plugin/**"
- ".cursor-plugin/**"
- "scripts/package-agent-plugin*"
- "scripts/agent-plugin-captions.test.mjs"
- "scripts/set-version*"
- "LICENSE"
- ".codex-plugin/**"
Expand Down Expand Up @@ -716,8 +714,6 @@ jobs:
- name: Exercise npm-cli bootstrap command
run: >-
node --test
skills/hyperframes-animation/scripts/package-loader.test.mjs
skills/hyperframes-creative/scripts/package-loader.test.mjs
skills/hyperframes/scripts/plugin-cli.test.mjs
# Guards that skills-manifest.json (the published freshness fingerprint read
Expand Down Expand Up @@ -787,8 +783,6 @@ jobs:
run: node --test scripts/package-agent-plugin.test.mjs
- name: Build portable agent plugin
run: node scripts/package-agent-plugin.mjs
- name: Exercise captions from the extracted portable bundle
run: node --test scripts/agent-plugin-captions.test.mjs
- name: Build upload-ready Codex plugin
run: node scripts/package-codex-plugin.mjs

Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -197,3 +197,7 @@ chrome/
# Hosted catalog item files are generated output the docs host serves; the rules above match their folder names
!docs/public/catalog/items/**/compositions/
!docs/public/catalog/items/*-ad/

# Python bytecode from running skill scripts
__pycache__/
*.pyc
11 changes: 9 additions & 2 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ registry/blocks/orbit-card/assets/three.module.min.js
registry/blocks/orbit-card/assets/gsap-3.14.2.min.js
# generated Lottie data: pretty-printing multiplies its size
registry/blocks/lottie-character-walk/assets/mascot.json
# reference snippets with intentional pseudo-markup (literal "..." attributes)
skills/talking-head-recut/references/frames/polaroid.html
# repo-native skill examples with intentional pseudo-markup placeholders
# (e.g. <RANGE>, <TOTAL> tokens the agent replaces at build time — not real HTML)
.claude/skills/**/examples/**/*.html
Expand All @@ -49,3 +47,12 @@ skills/talking-head-recut/references/frames/polaroid.html
# explicitly (not registry/examples/**/*.html) so hand-authored example HTML still
# gets formatted.
registry/examples/warm-grain/compositions/captions.html

# Skill entries: agents read each one whole when it opens, so table padding costs tokens every time.
skills/hyperframes/SKILL.md
skills/hyperframes-cli/SKILL.md
skills/hyperframes-registry/SKILL.md
skills/media-use/SKILL.md
skills/figma/SKILL.md
skills/slideshow/SKILL.md
skills/remotion-to-hyperframes/SKILL.md
Loading
Loading