mindforge-cc 11.5.1 → 11.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/mindforge/skill-tdd.md +53 -0
- package/.agent/mindforge/skills-index.md +118 -0
- package/.agent/mindforge/systematic-debug.md +60 -0
- package/.agent/mindforge/wf-catalog.md +37 -0
- package/.agent/mindforge/wf-code-audit.md +31 -0
- package/.agent/mindforge/wf-competitive-analysis.md +31 -0
- package/.agent/mindforge/wf-deep-research.md +32 -0
- package/.agent/mindforge/wf-feature-planner.md +31 -0
- package/.agent/mindforge/wf-incident-response.md +31 -0
- package/.agent/mindforge/wf-onboard-codebase.md +31 -0
- package/.agent/mindforge/wf-perf-optimize.md +31 -0
- package/.agent/mindforge/wf-pr-review.md +31 -0
- package/.agent/mindforge/wf-refactor-plan.md +31 -0
- package/.agent/mindforge/wf-release-prep.md +31 -0
- package/.agent/mindforge/wf-tdd-sprint.md +31 -0
- package/.agent/mindforge/wf-tech-evaluation.md +31 -0
- package/.agent/skills/1password-skill/SKILL.md +156 -0
- package/.agent/skills/1password-skill/references/cli-examples.md +31 -0
- package/.agent/skills/1password-skill/references/get-started.md +21 -0
- package/.agent/skills/article-illustrator/SKILL.md +199 -0
- package/.agent/skills/article-illustrator/references/prompt-construction.md +426 -0
- package/.agent/skills/article-illustrator/references/style-presets.md +80 -0
- package/.agent/skills/article-illustrator/references/styles.md +224 -0
- package/.agent/skills/article-illustrator/references/usage.md +50 -0
- package/.agent/skills/article-illustrator/references/workflow.md +332 -0
- package/.agent/skills/arxiv/SKILL.md +275 -0
- package/.agent/skills/blogwatcher/SKILL.md +130 -0
- package/.agent/skills/code-wiki/SKILL.md +438 -0
- package/.agent/skills/code-wiki/templates/README.md +31 -0
- package/.agent/skills/code-wiki/templates/architecture.md +30 -0
- package/.agent/skills/code-wiki/templates/getting-started.md +47 -0
- package/.agent/skills/code-wiki/templates/module.md +38 -0
- package/.agent/skills/codebase-inspection/SKILL.md +109 -0
- package/.agent/skills/comic-creator/SKILL.md +240 -0
- package/.agent/skills/comic-creator/references/analysis-framework.md +176 -0
- package/.agent/skills/comic-creator/references/auto-selection.md +71 -0
- package/.agent/skills/comic-creator/references/base-prompt.md +98 -0
- package/.agent/skills/comic-creator/references/character-template.md +180 -0
- package/.agent/skills/comic-creator/references/ohmsha-guide.md +85 -0
- package/.agent/skills/comic-creator/references/partial-workflows.md +106 -0
- package/.agent/skills/comic-creator/references/storyboard-template.md +143 -0
- package/.agent/skills/comic-creator/references/workflow.md +401 -0
- package/.agent/skills/concept-diagrams/SKILL.md +355 -0
- package/.agent/skills/concept-diagrams/references/dashboard-patterns.md +43 -0
- package/.agent/skills/concept-diagrams/references/infrastructure-patterns.md +144 -0
- package/.agent/skills/concept-diagrams/references/physical-shape-cookbook.md +42 -0
- package/.agent/skills/creative-ideation/SKILL.md +144 -0
- package/.agent/skills/creative-ideation/references/full-prompt-library.md +110 -0
- package/.agent/skills/devops-cli/SKILL.md +149 -0
- package/.agent/skills/devops-cli/references/app-discovery.md +112 -0
- package/.agent/skills/devops-cli/references/authentication.md +59 -0
- package/.agent/skills/devops-cli/references/cli-reference.md +104 -0
- package/.agent/skills/devops-cli/references/running-apps.md +171 -0
- package/.agent/skills/devops-watchers/SKILL.md +103 -0
- package/.agent/skills/docker-management/SKILL.md +273 -0
- package/.agent/skills/domain-intel/SKILL.md +96 -0
- package/.agent/skills/duckduckgo-search/SKILL.md +230 -0
- package/.agent/skills/github-auth/SKILL.md +240 -0
- package/.agent/skills/github-code-review/SKILL.md +474 -0
- package/.agent/skills/github-code-review/references/review-output-template.md +74 -0
- package/.agent/skills/github-issues/SKILL.md +363 -0
- package/.agent/skills/github-issues/templates/bug-report.md +35 -0
- package/.agent/skills/github-issues/templates/feature-request.md +31 -0
- package/.agent/skills/github-pr-workflow/SKILL.md +360 -0
- package/.agent/skills/github-pr-workflow/references/ci-troubleshooting.md +183 -0
- package/.agent/skills/github-pr-workflow/references/conventional-commits.md +71 -0
- package/.agent/skills/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
- package/.agent/skills/github-pr-workflow/templates/pr-body-feature.md +33 -0
- package/.agent/skills/github-repo-management/SKILL.md +509 -0
- package/.agent/skills/github-repo-management/references/github-api-cheatsheet.md +161 -0
- package/.agent/skills/godmode/SKILL.md +396 -0
- package/.agent/skills/godmode/references/jailbreak-templates.md +128 -0
- package/.agent/skills/godmode/references/refusal-detection.md +142 -0
- package/.agent/skills/hyperframes/SKILL.md +182 -0
- package/.agent/skills/hyperframes/references/cli.md +185 -0
- package/.agent/skills/hyperframes/references/composition.md +129 -0
- package/.agent/skills/hyperframes/references/features.md +289 -0
- package/.agent/skills/hyperframes/references/gsap.md +136 -0
- package/.agent/skills/hyperframes/references/troubleshooting.md +137 -0
- package/.agent/skills/hyperframes/references/website-to-video.md +145 -0
- package/.agent/skills/jupyter-live-kernel/SKILL.md +160 -0
- package/.agent/skills/kanban-orchestrator/SKILL.md +209 -0
- package/.agent/skills/kanban-worker/SKILL.md +188 -0
- package/.agent/skills/llm-wiki/SKILL.md +499 -0
- package/.agent/skills/meme-generation/SKILL.md +122 -0
- package/.agent/skills/node-inspect-debugger/SKILL.md +312 -0
- package/.agent/skills/obsidian/SKILL.md +60 -0
- package/.agent/skills/osint-investigation/SKILL.md +269 -0
- package/.agent/skills/osint-investigation/templates/source-template.md +59 -0
- package/.agent/skills/oss-forensics/SKILL.md +422 -0
- package/.agent/skills/oss-forensics/references/evidence-types.md +89 -0
- package/.agent/skills/oss-forensics/references/github-archive-guide.md +184 -0
- package/.agent/skills/oss-forensics/references/investigation-templates.md +131 -0
- package/.agent/skills/oss-forensics/references/recovery-techniques.md +164 -0
- package/.agent/skills/oss-forensics/templates/forensic-report.md +151 -0
- package/.agent/skills/oss-forensics/templates/malicious-package-report.md +43 -0
- package/.agent/skills/parallel-cli/SKILL.md +384 -0
- package/.agent/skills/pinggy-tunnel/SKILL.md +302 -0
- package/.agent/skills/pixel-art/SKILL.md +209 -0
- package/.agent/skills/pixel-art/references/palettes.md +49 -0
- package/.agent/skills/plan/SKILL.md +331 -0
- package/.agent/skills/polymarket/SKILL.md +75 -0
- package/.agent/skills/polymarket/references/api-endpoints.md +220 -0
- package/.agent/skills/python-debugpy/SKILL.md +368 -0
- package/.agent/skills/requesting-code-review/SKILL.md +273 -0
- package/.agent/skills/research-paper-writing/SKILL.md +2367 -0
- package/.agent/skills/research-paper-writing/references/autoreason-methodology.md +394 -0
- package/.agent/skills/research-paper-writing/references/checklists.md +434 -0
- package/.agent/skills/research-paper-writing/references/citation-workflow.md +563 -0
- package/.agent/skills/research-paper-writing/references/experiment-patterns.md +728 -0
- package/.agent/skills/research-paper-writing/references/human-evaluation.md +476 -0
- package/.agent/skills/research-paper-writing/references/paper-types.md +481 -0
- package/.agent/skills/research-paper-writing/references/reviewer-guidelines.md +433 -0
- package/.agent/skills/research-paper-writing/references/sources.md +191 -0
- package/.agent/skills/research-paper-writing/references/writing-guide.md +474 -0
- package/.agent/skills/research-paper-writing/templates/README.md +251 -0
- package/.agent/skills/rest-graphql-debug/SKILL.md +507 -0
- package/.agent/skills/s6-container-supervision/SKILL.md +171 -0
- package/.agent/skills/scrapling/SKILL.md +328 -0
- package/.agent/skills/sherlock/SKILL.md +186 -0
- package/.agent/skills/simplify-code/SKILL.md +168 -0
- package/.agent/skills/skill-authoring/SKILL.md +158 -0
- package/.agent/skills/spike/SKILL.md +190 -0
- package/.agent/skills/subagent-driven-development/SKILL.md +345 -0
- package/.agent/skills/subagent-driven-development/references/context-budget-discipline.md +53 -0
- package/.agent/skills/subagent-driven-development/references/gates-taxonomy.md +93 -0
- package/.agent/skills/systematic-debugging/SKILL.md +360 -0
- package/.agent/skills/test-driven-development/SKILL.md +336 -0
- package/.agent/skills/video-orchestrator/SKILL.md +194 -0
- package/.agent/skills/video-orchestrator/references/examples.md +227 -0
- package/.agent/skills/video-orchestrator/references/intake.md +166 -0
- package/.agent/skills/video-orchestrator/references/kanban-setup.md +278 -0
- package/.agent/skills/video-orchestrator/references/monitoring.md +180 -0
- package/.agent/skills/video-orchestrator/references/role-archetypes.md +298 -0
- package/.agent/skills/video-orchestrator/references/tool-matrix.md +317 -0
- package/.agent/skills/web-pentest/SKILL.md +332 -0
- package/.agent/skills/web-pentest/references/bypass-techniques.md +133 -0
- package/.agent/skills/web-pentest/references/exploitation-techniques.md +204 -0
- package/.agent/skills/web-pentest/references/scope-enforcement.md +110 -0
- package/.agent/skills/web-pentest/references/vuln-taxonomy.md +81 -0
- package/.agent/skills/web-pentest/templates/authorization.md +69 -0
- package/.agent/skills/web-pentest/templates/pentest-report.md +178 -0
- package/.claude/commands/mindforge/skill-tdd.md +53 -0
- package/.claude/commands/mindforge/skills-index.md +118 -0
- package/.claude/commands/mindforge/systematic-debug.md +60 -0
- package/.claude/commands/mindforge/wf-catalog.md +37 -0
- package/.claude/commands/mindforge/wf-code-audit.md +31 -0
- package/.claude/commands/mindforge/wf-competitive-analysis.md +31 -0
- package/.claude/commands/mindforge/wf-deep-research.md +32 -0
- package/.claude/commands/mindforge/wf-feature-planner.md +31 -0
- package/.claude/commands/mindforge/wf-incident-response.md +31 -0
- package/.claude/commands/mindforge/wf-onboard-codebase.md +31 -0
- package/.claude/commands/mindforge/wf-perf-optimize.md +31 -0
- package/.claude/commands/mindforge/wf-pr-review.md +31 -0
- package/.claude/commands/mindforge/wf-refactor-plan.md +31 -0
- package/.claude/commands/mindforge/wf-release-prep.md +31 -0
- package/.claude/commands/mindforge/wf-tdd-sprint.md +31 -0
- package/.claude/commands/mindforge/wf-tech-evaluation.md +31 -0
- package/.mindforge/config.json +2 -2
- package/.mindforge/dynamic-workflows/REGISTRY.md +65 -0
- package/.mindforge/dynamic-workflows/index.json +171 -0
- package/.mindforge/dynamic-workflows/scripts/code-audit.js +103 -0
- package/.mindforge/dynamic-workflows/scripts/competitive-analysis.js +85 -0
- package/.mindforge/dynamic-workflows/scripts/deep-research.js +151 -0
- package/.mindforge/dynamic-workflows/scripts/feature-planner.js +104 -0
- package/.mindforge/dynamic-workflows/scripts/incident-response.js +106 -0
- package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +102 -0
- package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +128 -0
- package/.mindforge/dynamic-workflows/scripts/pr-review.js +87 -0
- package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +121 -0
- package/.mindforge/dynamic-workflows/scripts/release-prep.js +102 -0
- package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +103 -0
- package/.mindforge/dynamic-workflows/scripts/tech-evaluation.js +72 -0
- package/.mindforge/memory/sync-manifest.json +1 -1
- package/.mindforge/skills/arxiv/SKILL.md +294 -0
- package/.mindforge/skills/blogwatcher/SKILL.md +147 -0
- package/.mindforge/skills/code-wiki/SKILL.md +457 -0
- package/.mindforge/skills/codebase-inspection/SKILL.md +126 -0
- package/.mindforge/skills/concept-diagrams/SKILL.md +373 -0
- package/.mindforge/skills/creative-ideation/SKILL.md +162 -0
- package/.mindforge/skills/domain-intel/SKILL.md +116 -0
- package/.mindforge/skills/duckduckgo-search/SKILL.md +249 -0
- package/.mindforge/skills/github-code-review/SKILL.md +493 -0
- package/.mindforge/skills/github-issues/SKILL.md +382 -0
- package/.mindforge/skills/github-pr-workflow/SKILL.md +379 -0
- package/.mindforge/skills/jupyter-live-kernel/SKILL.md +179 -0
- package/.mindforge/skills/kanban-orchestrator/SKILL.md +227 -0
- package/.mindforge/skills/kanban-worker/SKILL.md +206 -0
- package/.mindforge/skills/meme-generation/SKILL.md +141 -0
- package/.mindforge/skills/obsidian/SKILL.md +80 -0
- package/.mindforge/skills/osint-investigation/SKILL.md +288 -0
- package/.mindforge/skills/oss-forensics/SKILL.md +421 -0
- package/.mindforge/skills/pixel-art/SKILL.md +228 -0
- package/.mindforge/skills/plan/SKILL.md +350 -0
- package/.mindforge/skills/requesting-code-review/SKILL.md +292 -0
- package/.mindforge/skills/research-paper-writing/SKILL.md +2384 -0
- package/.mindforge/skills/scrapling/SKILL.md +345 -0
- package/.mindforge/skills/sherlock/SKILL.md +203 -0
- package/.mindforge/skills/simplify-code/SKILL.md +187 -0
- package/.mindforge/skills/spike/SKILL.md +209 -0
- package/.mindforge/skills/subagent-driven-development/SKILL.md +364 -0
- package/.mindforge/skills/systematic-debugging/SKILL.md +379 -0
- package/.mindforge/skills/test-driven-development/SKILL.md +355 -0
- package/.mindforge/skills/web-pentest/SKILL.md +327 -0
- package/CHANGELOG.md +71 -0
- package/MINDFORGE.md +2 -2
- package/README.md +72 -3
- package/RELEASENOTES.md +109 -0
- package/bin/installer-core.js +6 -2
- package/bin/mindforge-cli.js +7 -0
- package/bin/workflows/workflow-runner.js +110 -0
- package/docs/commands-reference.md +25 -0
- package/docs/getting-started.md +42 -5
- package/package.json +2 -1
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# HyperFrames Feature Reference
|
|
2
|
+
|
|
3
|
+
Load this file when a composition needs captions, TTS narration, audio-reactive visuals, marker-style text highlighting, or scene transitions. All patterns here are deterministic (no `Math.random()`, no `Date.now()`, no runtime audio analysis) and live on the same GSAP timeline as the rest of the composition.
|
|
4
|
+
|
|
5
|
+
## Captions
|
|
6
|
+
|
|
7
|
+
### Language Rule (Non-Negotiable)
|
|
8
|
+
|
|
9
|
+
**Never use `.en` whisper models unless the audio is confirmed English.** `.en` models TRANSLATE non-English audio into English instead of transcribing it.
|
|
10
|
+
|
|
11
|
+
- User says the language → `npx hyperframes transcribe audio.mp3 --model small --language <code>` (no `.en`)
|
|
12
|
+
- User confirms English → `--model small.en`
|
|
13
|
+
- Language unknown → `--model small` (auto-detects)
|
|
14
|
+
|
|
15
|
+
### Style Detection
|
|
16
|
+
|
|
17
|
+
If the user doesn't specify a caption style, detect it from the transcript tone:
|
|
18
|
+
|
|
19
|
+
| Tone | Font mood | Animation | Color | Size |
|
|
20
|
+
| ------------ | ------------------------ | ---------------------------------- | --------------------------- | ------- |
|
|
21
|
+
| Hype / launch | Heavy condensed, 800-900 | Scale-pop, `back.out(1.7)`, 0.1-0.2s | Bright on dark | 72-96px |
|
|
22
|
+
| Corporate | Clean sans, 600-700 | Fade+slide, `power3.out`, 0.3s | White / neutral + muted accent | 56-72px |
|
|
23
|
+
| Tutorial | Mono / clean sans, 500-600 | Typewriter or fade, 0.4-0.5s | High contrast, minimal | 48-64px |
|
|
24
|
+
| Storytelling | Serif / elegant, 400-500 | Slow fade, `power2.out`, 0.5-0.6s | Warm muted tones | 44-56px |
|
|
25
|
+
| Social | Rounded sans, 700-800 | Bounce, `elastic.out`, word-by-word | Playful, colored pills | 56-80px |
|
|
26
|
+
|
|
27
|
+
### Word Grouping
|
|
28
|
+
|
|
29
|
+
- High energy: 2-3 words, quick turnover.
|
|
30
|
+
- Conversational: 3-5 words, natural phrases.
|
|
31
|
+
- Measured / calm: 4-6 words.
|
|
32
|
+
|
|
33
|
+
Break on sentence boundaries, 150ms+ pauses, or a max word count.
|
|
34
|
+
|
|
35
|
+
### Positioning
|
|
36
|
+
|
|
37
|
+
- Landscape (1920x1080): bottom 80-120px, centered.
|
|
38
|
+
- Portrait (1080x1920): ~600-700px from bottom, centered.
|
|
39
|
+
- Never cover the subject's face. `position: absolute` (never relative). One caption group visible at a time.
|
|
40
|
+
|
|
41
|
+
### Text Overflow Prevention
|
|
42
|
+
|
|
43
|
+
Use the runtime helper so captions never overflow:
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
const result = window.__hyperframes.fitTextFontSize(group.text.toUpperCase(), {
|
|
47
|
+
fontFamily: "Outfit",
|
|
48
|
+
fontWeight: 900,
|
|
49
|
+
maxWidth: 1600, // 1600 landscape, 900 portrait
|
|
50
|
+
});
|
|
51
|
+
el.style.fontSize = result.fontSize + "px";
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
When per-word styling uses `scale > 1.0`, compute `maxWidth = safeWidth / maxScale` to leave headroom. Container needs `overflow: visible` (not `hidden` — hidden clips scaled emphasis words and glow).
|
|
55
|
+
|
|
56
|
+
### Caption Exit Guarantee
|
|
57
|
+
|
|
58
|
+
Every group MUST have a hard kill after its exit tween — otherwise groups leak into later ones:
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
tl.to(groupEl, { opacity: 0, scale: 0.95, duration: 0.12, ease: "power2.in" }, group.end - 0.12);
|
|
62
|
+
tl.set(groupEl, { opacity: 0, visibility: "hidden" }, group.end); // deterministic kill
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Per-Word Styling
|
|
66
|
+
|
|
67
|
+
Scan the transcript for words that deserve distinct treatment:
|
|
68
|
+
|
|
69
|
+
- Brand / product names — larger, unique color.
|
|
70
|
+
- ALL CAPS — scale boost, flash, accent color.
|
|
71
|
+
- Numbers / statistics — bold weight, accent color.
|
|
72
|
+
- Emotional keywords — exaggerated animation (overshoot, bounce).
|
|
73
|
+
- Call-to-action — highlight, underline, color pop.
|
|
74
|
+
|
|
75
|
+
## TTS (Kokoro-82M)
|
|
76
|
+
|
|
77
|
+
Local, no API key. Runs on CPU. Model downloads on first use (~311 MB + ~27 MB voices, cached in `~/.cache/hyperframes/tts/`).
|
|
78
|
+
|
|
79
|
+
### Voice Selection
|
|
80
|
+
|
|
81
|
+
| Content type | Voice | Why |
|
|
82
|
+
| ------------- | ----------------------- | --------------------------- |
|
|
83
|
+
| Product demo | `af_heart` / `af_nova` | Warm, professional |
|
|
84
|
+
| Tutorial | `am_adam` / `bf_emma` | Neutral, easy to follow |
|
|
85
|
+
| Marketing | `af_sky` / `am_michael` | Energetic or authoritative |
|
|
86
|
+
| Documentation | `bf_emma` / `bm_george` | Clear British English |
|
|
87
|
+
| Casual | `af_heart` / `af_sky` | Approachable, natural |
|
|
88
|
+
|
|
89
|
+
Run `npx hyperframes tts --list` for all 54 voices across 8 languages.
|
|
90
|
+
|
|
91
|
+
### Multilingual Phonemization
|
|
92
|
+
|
|
93
|
+
Voice ID first letter encodes language: `a`=American English, `b`=British English, `e`=Spanish, `f`=French, `h`=Hindi, `i`=Italian, `j`=Japanese, `p`=Brazilian Portuguese, `z`=Mandarin. The CLI auto-infers the phonemizer locale from that prefix — you don't need `--lang` when voice and text match.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npx hyperframes tts "La reunión empieza a las nueve" --voice ef_dora --output es.wav
|
|
97
|
+
npx hyperframes tts "今日はいい天気ですね" --voice jf_alpha --output ja.wav
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Pass `--lang` only to override auto-detection (e.g. stylized accents):
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx hyperframes tts "Hello there" --voice af_heart --lang fr-fr --output accented.wav
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Valid `--lang` codes: `en-us`, `en-gb`, `es`, `fr-fr`, `hi`, `it`, `pt-br`, `ja`, `zh`. Non-English phonemization requires `espeak-ng` installed system-wide (`apt-get install espeak-ng` / `brew install espeak-ng`).
|
|
107
|
+
|
|
108
|
+
### Speed
|
|
109
|
+
|
|
110
|
+
- `0.7-0.8` — tutorial, complex content
|
|
111
|
+
- `1.0` — natural (default)
|
|
112
|
+
- `1.1-1.2` — intros, upbeat content
|
|
113
|
+
- `1.5+` — rarely appropriate
|
|
114
|
+
|
|
115
|
+
### TTS + Captions Workflow
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx hyperframes tts script.txt --voice af_heart --output narration.wav
|
|
119
|
+
npx hyperframes transcribe narration.wav # → transcript.json (word-level)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Audio-Reactive Visuals
|
|
123
|
+
|
|
124
|
+
Drive visuals from music, voice, or sound. Any GSAP-tweenable property can respond to pre-extracted audio data.
|
|
125
|
+
|
|
126
|
+
### Data format
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
const AUDIO_DATA = {
|
|
130
|
+
fps: 30,
|
|
131
|
+
totalFrames: 900,
|
|
132
|
+
frames: [{ bands: [0.82, 0.45, 0.31, /* ... */] }, /* ... */],
|
|
133
|
+
};
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`frames[i].bands[]` are frequency band amplitudes, 0-1. Index 0 = bass, higher indices = treble. Each band is normalized independently across the full track.
|
|
137
|
+
|
|
138
|
+
### Mapping audio to visuals
|
|
139
|
+
|
|
140
|
+
| Audio signal | Visual property | Effect |
|
|
141
|
+
| ---------------------- | --------------------------------- | -------------------------- |
|
|
142
|
+
| Bass (`bands[0]`) | `scale` | Pulse on beat |
|
|
143
|
+
| Treble (`bands[12-14]`)| `textShadow`, `boxShadow` | Glow intensity |
|
|
144
|
+
| Overall amplitude | `opacity`, `y`, `backgroundColor` | Breathe, lift, color shift |
|
|
145
|
+
| Mid-range (`bands[4-8]`)| `borderRadius`, `width` | Shape morphing |
|
|
146
|
+
|
|
147
|
+
Any GSAP-tweenable property works — `clipPath`, `filter`, SVG attributes, CSS custom properties. Let content guide the visual and let audio drive its behavior. **Never add** equalizer bars, spectrum analyzers, waveform displays, rainbow cycling, or generic particle systems — they look cheap.
|
|
148
|
+
|
|
149
|
+
### Sampling pattern (required)
|
|
150
|
+
|
|
151
|
+
Audio reactivity needs per-frame sampling via a `for` loop of `tl.call()`, NOT a single tween. A single long tween does NOT react to audio:
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
for (let f = 0; f < AUDIO_DATA.totalFrames; f++) {
|
|
155
|
+
tl.call(
|
|
156
|
+
((frame) => () => draw(frame))(AUDIO_DATA.frames[f]),
|
|
157
|
+
[],
|
|
158
|
+
f / AUDIO_DATA.fps,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Gotchas
|
|
164
|
+
|
|
165
|
+
- **textShadow on a container** with semi-transparent children (e.g. inactive caption words at `rgba(255,255,255,0.3)`) renders a visible glow rectangle behind every child. Apply the glow to active words individually, not to the container.
|
|
166
|
+
- **Subtlety for text** — 3-6% scale variation, soft glow. Heavy pulsing makes text unreadable.
|
|
167
|
+
- **Go bigger on non-text** — backgrounds and shapes can handle 10-30% swings.
|
|
168
|
+
- **Deterministic only** — pre-extracted audio data, no Web Audio API, no runtime analysis.
|
|
169
|
+
|
|
170
|
+
## Marker-Style Highlighting
|
|
171
|
+
|
|
172
|
+
Deterministic CSS + GSAP implementations of the classic "highlight / circle / burst / scribble / sketchout" drawing modes for emphasizing text. Fully seekable — no animated SVG filters, no JS timers.
|
|
173
|
+
|
|
174
|
+
### Highlight (yellow marker sweep)
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<span class="mh-highlight-wrap">
|
|
178
|
+
<span class="mh-highlight-bar" id="hl-1"></span>
|
|
179
|
+
<span class="mh-highlight-text">highlighted text</span>
|
|
180
|
+
</span>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```css
|
|
184
|
+
.mh-highlight-wrap { position: relative; display: inline; }
|
|
185
|
+
.mh-highlight-bar {
|
|
186
|
+
position: absolute; inset: 0 -6px;
|
|
187
|
+
background: #fdd835; opacity: 0.35;
|
|
188
|
+
transform: scaleX(0); transform-origin: left center;
|
|
189
|
+
border-radius: 3px; z-index: 0;
|
|
190
|
+
}
|
|
191
|
+
.mh-highlight-text { position: relative; z-index: 1; }
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
```js
|
|
195
|
+
tl.to("#hl-1", { scaleX: 1, duration: 0.5, ease: "power2.out" }, 0.6);
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Multi-line: apply to `.mh-highlight-bar` with `stagger: 0.3`.
|
|
199
|
+
|
|
200
|
+
### Circle
|
|
201
|
+
|
|
202
|
+
Hand-drawn ellipse around a word. Use a positioned `::before` with `border-radius: 50%`, slight rotation, and `clip-path` to avoid covering the letters. Animate `clip-path` or `stroke-dashoffset` on an inline SVG circle.
|
|
203
|
+
|
|
204
|
+
### Burst
|
|
205
|
+
|
|
206
|
+
Short radiating lines around a word. Render 6-12 small `<span>` elements positioned in a radial pattern; animate `scaleY` from 0.
|
|
207
|
+
|
|
208
|
+
### Scribble
|
|
209
|
+
|
|
210
|
+
A chaotic overlay created by animating `stroke-dashoffset` on an inline SVG `<path>` with a `d` attribute describing a zig-zag. Seed values, never `Math.random()`.
|
|
211
|
+
|
|
212
|
+
### Sketchout
|
|
213
|
+
|
|
214
|
+
A rough rectangle outline. Two `<rect>`s with slight `transform` offsets, animated via `stroke-dashoffset`.
|
|
215
|
+
|
|
216
|
+
All five modes tween CSS transforms or `stroke-dashoffset` only — both tween cleanly, are deterministic, and seek correctly.
|
|
217
|
+
|
|
218
|
+
## Scene Transitions
|
|
219
|
+
|
|
220
|
+
Every multi-scene composition MUST use transitions. No jump cuts.
|
|
221
|
+
|
|
222
|
+
### Energy → primary transition
|
|
223
|
+
|
|
224
|
+
| Energy | CSS primary | Shader primary | Accent | Duration | Easing |
|
|
225
|
+
| ------------------------------------ | ---------------------------- | ------------------------------------ | ------------------------------ | --------- | ------------------------ |
|
|
226
|
+
| **Calm** (wellness, brand, luxury) | Blur crossfade, focus pull | Cross-warp morph, thermal distortion | Light leak, circle iris | 0.5-0.8s | `sine.inOut`, `power1` |
|
|
227
|
+
| **Medium** (corporate, SaaS) | Push slide, staggered blocks | Whip pan, cinematic zoom | Squeeze, vertical push | 0.3-0.5s | `power2`, `power3` |
|
|
228
|
+
| **High** (promos, sports, launch) | Zoom through, overexposure | Ridged burn, glitch, chromatic split | Staggered blocks, gravity drop | 0.15-0.3s | `power4`, `expo` |
|
|
229
|
+
|
|
230
|
+
Pick ONE primary (60-70% of scene changes) plus 1-2 accents. Never use a different transition for every scene.
|
|
231
|
+
|
|
232
|
+
### Mood → transition type
|
|
233
|
+
|
|
234
|
+
| Mood | Transitions |
|
|
235
|
+
| ------------------------ | --------------------------------------------------------------------------- |
|
|
236
|
+
| Warm / inviting | Light leak, blur crossfade, focus pull, film burn · _Shader:_ thermal distortion, cross-warp morph |
|
|
237
|
+
| Cold / clinical | Squeeze, zoom out, blinds, shutter, grid dissolve · _Shader:_ gravitational lens |
|
|
238
|
+
| Editorial / magazine | Push slide, vertical push, diagonal split, shutter · _Shader:_ whip pan |
|
|
239
|
+
| Tech / futuristic | Grid dissolve, staggered blocks, blinds · _Shader:_ glitch, chromatic split |
|
|
240
|
+
| Tense / edgy | Glitch, VHS, chromatic aberration, ripple · _Shader:_ ridged burn, domain warp |
|
|
241
|
+
| Playful / fun | Elastic push, 3D flip, circle iris, morph circle · _Shader:_ swirl vortex, ripple waves |
|
|
242
|
+
| Dramatic / cinematic | Zoom through, gravity drop, overexposure · _Shader:_ cinematic zoom, gravitational lens |
|
|
243
|
+
| Premium / luxury | Focus pull, blur crossfade, color dip to black · _Shader:_ cross-warp morph |
|
|
244
|
+
| Retro / analog | Film burn, light leak, VHS, clock wipe · _Shader:_ light leak |
|
|
245
|
+
|
|
246
|
+
### Presets
|
|
247
|
+
|
|
248
|
+
| Preset | Duration | Easing |
|
|
249
|
+
| ---------- | -------- | ----------------- |
|
|
250
|
+
| `snappy` | 0.2s | `power4.inOut` |
|
|
251
|
+
| `smooth` | 0.4s | `power2.inOut` |
|
|
252
|
+
| `gentle` | 0.6s | `sine.inOut` |
|
|
253
|
+
| `dramatic` | 0.5s | `power3.in` → out |
|
|
254
|
+
| `instant` | 0.15s | `expo.inOut` |
|
|
255
|
+
| `luxe` | 0.7s | `power1.inOut` |
|
|
256
|
+
|
|
257
|
+
### Install a shader transition
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
npx hyperframes add flash-through-white
|
|
261
|
+
npx hyperframes add --list
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### CSS vs shader
|
|
265
|
+
|
|
266
|
+
- **CSS transitions** animate scene containers with opacity, transforms, `clip-path`, and filters. Simpler to set up.
|
|
267
|
+
- **Shader transitions** composite both scene textures per-pixel on a WebGL canvas — can warp, dissolve, and morph in ways CSS cannot. Import from `@hyperframes/shader-transitions` instead of writing raw GLSL.
|
|
268
|
+
|
|
269
|
+
Don't mix CSS and shader transitions in the same composition — once a composition uses shader transitions, the WebGL canvas replaces DOM-based scene switching for every transition.
|
|
270
|
+
|
|
271
|
+
### Shader-compatible CSS rules
|
|
272
|
+
|
|
273
|
+
Shader transitions capture DOM scenes to WebGL textures via html2canvas. The canvas 2D pipeline doesn't match CSS exactly:
|
|
274
|
+
|
|
275
|
+
1. No `transparent` keyword in gradients — use the target color at zero alpha: `rgba(200,117,51,0)` not `transparent`. (Canvas interpolates `transparent` as `rgba(0,0,0,0)` creating dark fringes.)
|
|
276
|
+
2. No gradient backgrounds on elements thinner than 4px. Use solid `background-color` on thin accent lines.
|
|
277
|
+
3. No CSS variables (`var()`) on elements visible during capture — html2canvas doesn't reliably resolve custom properties. Use literal color values.
|
|
278
|
+
4. Mark uncapturable decoratives with `data-no-capture` — they stay on the live DOM but are absent from the shader texture.
|
|
279
|
+
5. No gradient opacity below 0.15 — renders differently in canvas vs CSS.
|
|
280
|
+
6. Every `.scene` div must have explicit `background-color`, AND pass the same color as `bgColor` in the `init()` config. Without either, the texture renders as black.
|
|
281
|
+
|
|
282
|
+
These rules only apply to shader transition compositions. CSS-only compositions have no restrictions.
|
|
283
|
+
|
|
284
|
+
### Don't
|
|
285
|
+
|
|
286
|
+
- Mix CSS and shader transitions in one composition.
|
|
287
|
+
- Use exit animations on any scene except the final scene — the transition IS the exit.
|
|
288
|
+
- Introduce a new transition type every scene — pick one primary + 1-2 accents.
|
|
289
|
+
- Use transitions that create visible geometric repetition (grids, hex cells, uniform dots) — they look artificial regardless of the math behind them. Prefer organic noise (FBM, domain warping).
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# GSAP for HyperFrames
|
|
2
|
+
|
|
3
|
+
GSAP is the animation engine for all HyperFrames compositions. Load from CDN inside the composition:
|
|
4
|
+
|
|
5
|
+
```html
|
|
6
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Core Tween Methods
|
|
10
|
+
|
|
11
|
+
- **`gsap.to(targets, vars)`** — animate from current state to `vars`. Most common.
|
|
12
|
+
- **`gsap.from(targets, vars)`** — animate from `vars` to current state (entrances).
|
|
13
|
+
- **`gsap.fromTo(targets, fromVars, toVars)`** — explicit start and end.
|
|
14
|
+
- **`gsap.set(targets, vars)`** — apply immediately (duration 0). Don't use on clip elements that enter later — use `tl.set(selector, vars, time)` inside the timeline instead.
|
|
15
|
+
|
|
16
|
+
Always use **camelCase** property names (`backgroundColor`, `rotationX`, not `background-color`).
|
|
17
|
+
|
|
18
|
+
## Common vars
|
|
19
|
+
|
|
20
|
+
- **`duration`** — seconds (default 0.5).
|
|
21
|
+
- **`delay`** — seconds before start.
|
|
22
|
+
- **`ease`** — `"power1.out"` (default), `"power3.inOut"`, `"back.out(1.7)"`, `"elastic.out(1, 0.3)"`, `"none"`, `"expo.out"`, `"circ.inOut"`.
|
|
23
|
+
- **`stagger`** — number `0.1` or object: `{ amount: 0.3, from: "center" }`, `{ each: 0.1, from: "random" }`.
|
|
24
|
+
- **`overwrite`** — `false` (default), `true`, or `"auto"`.
|
|
25
|
+
- **`repeat`** — number (never `-1` in HyperFrames). **`yoyo`** — alternates direction with repeat.
|
|
26
|
+
- **`onComplete`**, **`onStart`**, **`onUpdate`** — callbacks.
|
|
27
|
+
- **`immediateRender`** — default `true` for `from()`/`fromTo()`. Set `false` on later tweens targeting the same property+element to avoid overwrite surprises.
|
|
28
|
+
|
|
29
|
+
## Transforms
|
|
30
|
+
|
|
31
|
+
Prefer GSAP's transform aliases over raw CSS `transform`:
|
|
32
|
+
|
|
33
|
+
| GSAP property | Equivalent |
|
|
34
|
+
| --------------------------- | -------------------------- |
|
|
35
|
+
| `x`, `y`, `z` | translateX/Y/Z (px) |
|
|
36
|
+
| `xPercent`, `yPercent` | translateX/Y (%) |
|
|
37
|
+
| `scale`, `scaleX`, `scaleY` | scale |
|
|
38
|
+
| `rotation` | rotate (deg) |
|
|
39
|
+
| `rotationX`, `rotationY` | 3D rotate |
|
|
40
|
+
| `skewX`, `skewY` | skew |
|
|
41
|
+
| `transformOrigin` | transform-origin |
|
|
42
|
+
|
|
43
|
+
- **`autoAlpha`** — prefer over `opacity`. At 0, also sets `visibility: hidden`.
|
|
44
|
+
- **CSS variables** — `"--hue": 180`.
|
|
45
|
+
- **Directional rotation** — `"360_cw"`, `"-170_short"`, `"90_ccw"`.
|
|
46
|
+
- **`clearProps`** — `"all"` or comma-separated; removes inline styles on complete.
|
|
47
|
+
- **Relative values** — `"+=20"`, `"-=10"`, `"*=2"`.
|
|
48
|
+
|
|
49
|
+
## Function-based Values
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
gsap.to(".item", {
|
|
53
|
+
x: (i, target, targets) => i * 50,
|
|
54
|
+
stagger: 0.1,
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Easing
|
|
59
|
+
|
|
60
|
+
Built-in eases: `power1` through `power4`, `back`, `bounce`, `circ`, `elastic`, `expo`, `sine`. Each has `.in`, `.out`, `.inOut`.
|
|
61
|
+
|
|
62
|
+
Rule of thumb:
|
|
63
|
+
- Entrances: `power3.out`, `expo.out`, `back.out(1.4)`
|
|
64
|
+
- Exits: `power2.in`, `expo.in`
|
|
65
|
+
- Scrubbed sections: `none` (linear)
|
|
66
|
+
- Vary eases across entrance tweens within a scene — at least 3 different eases.
|
|
67
|
+
|
|
68
|
+
## Defaults
|
|
69
|
+
|
|
70
|
+
```js
|
|
71
|
+
gsap.defaults({ duration: 0.6, ease: "power2.out" });
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Timelines (HyperFrames primary pattern)
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
window.__timelines = window.__timelines || {};
|
|
78
|
+
|
|
79
|
+
const tl = gsap.timeline({ paused: true, defaults: { duration: 0.6, ease: "power2.out" } });
|
|
80
|
+
|
|
81
|
+
tl.from(".title", { y: 50, opacity: 0 }, 0.3);
|
|
82
|
+
tl.from(".subtitle", { y: 30, opacity: 0 }, 0.5);
|
|
83
|
+
tl.from(".cta", { scale: 0.8, opacity: 0, ease: "back.out(1.7)" }, 0.8);
|
|
84
|
+
|
|
85
|
+
window.__timelines["root"] = tl;
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Position parameter
|
|
89
|
+
|
|
90
|
+
Third argument to `.from()` / `.to()` / `.add()`:
|
|
91
|
+
|
|
92
|
+
- Absolute seconds: `0.5`, `2.1`.
|
|
93
|
+
- Relative to end: `">+0.2"` (0.2s after previous), `"<"` (same time as previous), `"<+0.3"` (0.3s after previous's start).
|
|
94
|
+
- Named labels: `tl.addLabel("act2", 5); tl.from(".x", { y: 30 }, "act2");`
|
|
95
|
+
|
|
96
|
+
### Nesting
|
|
97
|
+
|
|
98
|
+
HyperFrames auto-nests sub-composition timelines. **Do not** manually `tl.add(subTl)` — the framework wires sub-timelines into the parent at the sub-composition's `data-start`.
|
|
99
|
+
|
|
100
|
+
### Playback
|
|
101
|
+
|
|
102
|
+
The player controls playback. Don't call `tl.play()`, `tl.pause()`, or `tl.reverse()` at construction time. `{ paused: true }` is required.
|
|
103
|
+
|
|
104
|
+
## Stagger
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
// even distribution
|
|
108
|
+
tl.from(".card", { opacity: 0, y: 40, stagger: 0.1 });
|
|
109
|
+
|
|
110
|
+
// control total amount
|
|
111
|
+
tl.from(".card", { opacity: 0, stagger: { amount: 0.6, from: "center" } });
|
|
112
|
+
|
|
113
|
+
// deterministic "random" stagger (HyperFrames compositions must be deterministic)
|
|
114
|
+
tl.from(".dot", { opacity: 0, stagger: { each: 0.05, from: "random" } });
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`stagger.from`: `"start"` | `"end"` | `"center"` | `"edges"` | `"random"` | index | `[x, y]` for grid.
|
|
118
|
+
|
|
119
|
+
## Performance
|
|
120
|
+
|
|
121
|
+
- Animate transforms (`x`, `y`, `scale`, `rotation`, `opacity`) — cheap, GPU-accelerated.
|
|
122
|
+
- Avoid animating `width`, `height`, `top`, `left`, `margin` — causes layout thrash.
|
|
123
|
+
- Avoid box-shadow or filter animations on large elements — expensive.
|
|
124
|
+
- `will-change` is rarely needed; GSAP handles promotion.
|
|
125
|
+
|
|
126
|
+
## gsap.matchMedia (rarely needed in HyperFrames)
|
|
127
|
+
|
|
128
|
+
Compositions have fixed dimensions (`data-width`/`data-height`), so responsive breakpoints don't apply. You may still use `matchMedia` for `prefers-reduced-motion` when authoring UI previews, but it's not used in rendered video output.
|
|
129
|
+
|
|
130
|
+
## Don't Do
|
|
131
|
+
|
|
132
|
+
- `repeat: -1` anywhere — breaks the capture engine.
|
|
133
|
+
- `Math.random()`, `Date.now()`, performance.now()` inside tween values — non-deterministic.
|
|
134
|
+
- `async` / `setTimeout` / `Promise` around timeline construction — the capture engine reads `window.__timelines` synchronously.
|
|
135
|
+
- Animate `visibility` or `display` directly — use `autoAlpha`.
|
|
136
|
+
- `gsap.set()` on clip elements that enter later in the timeline — they don't exist in the DOM at page-load. Use `tl.set(sel, vars, time)` inside the timeline.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
## `HeadlessExperimental.beginFrame' wasn't found` (first thing to check)
|
|
4
|
+
|
|
5
|
+
**Symptom:** `npx hyperframes render` fails with:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
✗ Render failed
|
|
9
|
+
Protocol error (HeadlessExperimental.beginFrame):
|
|
10
|
+
'HeadlessExperimental.beginFrame' wasn't found
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Cause:** Chromium 147+ removed the `HeadlessExperimental.beginFrame` CDP command. This affected sandbox environments (e.g., OpenClaw, some containerized agent hosts) that ship modern Chromium as the system browser. See [hyperframes#294](https://github.com/heygen-com/hyperframes/issues/294).
|
|
14
|
+
|
|
15
|
+
**Fix (permanent — preferred):** upgrade.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx hyperframes upgrade -y
|
|
19
|
+
# or
|
|
20
|
+
npm install -g hyperframes@latest
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`hyperframes >= 0.4.2` auto-detects whether the resolved browser supports `beginFrame` (checks for `chrome-headless-shell` in the binary path) and falls back to screenshot capture mode when it doesn't. Commit [`4c72ba4`](https://github.com/heygen-com/hyperframes/commit/4c72ba4a36ec2bd6733f7b9cb2a9e63f9fb234b9) (March 2026) shipped this auto-detect.
|
|
24
|
+
|
|
25
|
+
**Fix (escape hatch — if you can't upgrade):**
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export PRODUCER_FORCE_SCREENSHOT=true
|
|
29
|
+
npx hyperframes render
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This forces screenshot mode regardless of the binary. Screenshot mode is slightly slower but visually identical.
|
|
33
|
+
|
|
34
|
+
**Fix (prevent — recommended):** install `chrome-headless-shell` so the engine can use the fast BeginFrame path:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npx puppeteer browsers install chrome-headless-shell
|
|
38
|
+
# or let the CLI do it
|
|
39
|
+
npx hyperframes browser --install
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`scripts/setup.sh` runs this automatically.
|
|
43
|
+
|
|
44
|
+
## `npx hyperframes render` hangs for 120s then times out
|
|
45
|
+
|
|
46
|
+
**Cause:** the resolved browser is system Chrome (e.g., `/usr/bin/google-chrome`) and doesn't support the BeginFrame path, but auto-detect also missed it (older `hyperframes` version).
|
|
47
|
+
|
|
48
|
+
**Fix:**
|
|
49
|
+
1. Check which binary is being used: `npx hyperframes browser --path`
|
|
50
|
+
2. If it's system Chrome, either:
|
|
51
|
+
- Install `chrome-headless-shell`: `npx hyperframes browser --install`, OR
|
|
52
|
+
- Set the escape hatch: `export PRODUCER_FORCE_SCREENSHOT=true`, OR
|
|
53
|
+
- Upgrade: `npx hyperframes upgrade -y`
|
|
54
|
+
|
|
55
|
+
## `ffmpeg: command not found`
|
|
56
|
+
|
|
57
|
+
Install FFmpeg via your system package manager:
|
|
58
|
+
|
|
59
|
+
| OS / distro | Command |
|
|
60
|
+
| --------------- | ----------------------------------- |
|
|
61
|
+
| Ubuntu / Debian | `sudo apt-get install -y ffmpeg` |
|
|
62
|
+
| Fedora / RHEL | `sudo dnf install -y ffmpeg` |
|
|
63
|
+
| Arch | `sudo pacman -S ffmpeg` |
|
|
64
|
+
| macOS | `brew install ffmpeg` |
|
|
65
|
+
| Windows | `winget install Gyan.FFmpeg` |
|
|
66
|
+
|
|
67
|
+
Verify: `ffmpeg -version`.
|
|
68
|
+
|
|
69
|
+
## `Node version X is not supported`
|
|
70
|
+
|
|
71
|
+
HyperFrames requires Node.js >= 22. Check with `node --version`.
|
|
72
|
+
|
|
73
|
+
- **nvm:** `nvm install 22 && nvm use 22`
|
|
74
|
+
- **Homebrew (macOS):** `brew install node@22 && brew link --overwrite node@22`
|
|
75
|
+
- **apt:** follow [nodesource](https://github.com/nodesource/distributions) for Node 22 LTS.
|
|
76
|
+
|
|
77
|
+
## `ENOSPC: no space left on device` or OOM kills during render
|
|
78
|
+
|
|
79
|
+
Renders are memory- and disk-hungry. Minimums:
|
|
80
|
+
|
|
81
|
+
- **RAM:** 4 GB free (8 GB recommended for 60fps / `--quality high`)
|
|
82
|
+
- **Disk:** 2 GB free scratch space — frames are written to `/tmp` during capture
|
|
83
|
+
|
|
84
|
+
Mitigations:
|
|
85
|
+
- Lower quality: `--quality draft`.
|
|
86
|
+
- Lower fps: `--fps 24`.
|
|
87
|
+
- Lower worker count: `--workers 1`.
|
|
88
|
+
- Set `TMPDIR` to a volume with more space: `export TMPDIR=/mnt/scratch`.
|
|
89
|
+
|
|
90
|
+
## Lint passes but the render is blank / black frames
|
|
91
|
+
|
|
92
|
+
Check the browser console in `preview` — usually:
|
|
93
|
+
- A timeline was registered with the wrong key (`__timelines["typo"]` instead of `__timelines["root"]`).
|
|
94
|
+
- The root composition was wrapped in `<template>` (only sub-compositions use `<template>`).
|
|
95
|
+
- A script tag failed to load — check Network tab in preview.
|
|
96
|
+
|
|
97
|
+
Run `npx hyperframes lint --verbose` to see info-level findings.
|
|
98
|
+
|
|
99
|
+
## Contrast warnings from `hyperframes validate`
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
⚠ WCAG AA contrast warnings (3):
|
|
103
|
+
· .subtitle "secondary text" — 2.67:1 (need 4.5:1, t=5.3s)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- **Dark backgrounds:** brighten the failing color until it clears 4.5:1 (normal text) or 3:1 (large text — 24px+ or 19px+ bold).
|
|
107
|
+
- **Light backgrounds:** darken it.
|
|
108
|
+
- Stay within the palette family — don't invent a new color, adjust the existing one.
|
|
109
|
+
- Skip the check temporarily with `--no-contrast` if iterating rapidly, but clear it before delivery.
|
|
110
|
+
|
|
111
|
+
## `Font family 'X' not supported by compiler`
|
|
112
|
+
|
|
113
|
+
The compiler embeds a curated set of web-safe + open-source fonts. If a font isn't supported, either:
|
|
114
|
+
- Swap to a supported alternative from the warning.
|
|
115
|
+
- Register a custom font via `@font-face` pointing to a `.woff2` in the project directory (the compiler embeds referenced `@font-face` files).
|
|
116
|
+
|
|
117
|
+
## Video plays back muted or with no audio
|
|
118
|
+
|
|
119
|
+
Check:
|
|
120
|
+
- The `<video>` element has `muted playsinline` (required — browser autoplay policy).
|
|
121
|
+
- Audio is a **separate** `<audio>` element, not the video element.
|
|
122
|
+
- Audio `data-volume` is set (defaults to 1).
|
|
123
|
+
- The audio file is at the expected path — compositions load relative to their own directory.
|
|
124
|
+
|
|
125
|
+
## Docker render fails on Linux with rootless Docker
|
|
126
|
+
|
|
127
|
+
Add `--privileged` or pass `--cap-add=SYS_ADMIN`:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npx hyperframes render --docker --docker-args "--cap-add=SYS_ADMIN"
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The headless browser needs namespace permissions for sandboxing.
|
|
134
|
+
|
|
135
|
+
## Bug reports
|
|
136
|
+
|
|
137
|
+
Include `npx hyperframes info` output + the full error log. File at [github.com/heygen-com/hyperframes](https://github.com/heygen-com/hyperframes/issues).
|