mirror of
https://github.com/hanzoai/frames.git
synced 2026-09-24 00:08:03 +00:00
The workflow skills, the CLI reference, and the guides described a vendor's services: a separate account to sign into, a credential file beside the project, a music library and asset search that are not ours, and preview media on a CDN we do not run. Auth is now one Hanzo IAM token in $HANZO_API_KEY, read from Hanzo KMS — one credential for voice, music, sound effects, images, video, the shared catalog, and cloud rendering. The credential guide, the cloud-render pages, and the CLI auth reference all say the same thing, because there is now only one thing to say. Docs previews resolve from the docs site's own /images/ path, produced by our own generator. They are not committed (docs/images/ is ignored), so a deploy must run `bun run generate:catalog-previews` first — the same gap as before, minus a CDN we cannot publish to. Element grounding calls zen-vl through api.hanzo.ai rather than a third-party vision endpoint, and the LUT library builds every look from params, so no look needs a host at all. Command examples read `npx @hanzo/frame` / `hanzo frame` throughout. Three navigation entries left dangling by the rebrand now resolve. The changelog and the weekly archive keep their entries as written and say plainly that pre-port entries describe the upstream product.
3.9 KiB
3.9 KiB
Test set — diverse scenes for template stability regression
Canonical test corpus for verifying templates don't regress when we add features. Pick cases that stress different parts of the pipeline — blend mode, matte quality, baked-in graphics, luminance extremes, motion.
The test set
All in ~/Downloads/caption-test-videos/ (720×1290, ~8s, 9:16). Add
landscape + 1:1 as we grow.
| Case | Scene | Stress test |
|---|---|---|
Sunset_Stroll |
Outdoor selfie at sunset, palm trees, boardwalk | Bright backdrop → default screen blend fails; needs dark text + normal blend |
Nature_Vibe |
Forest golden-hour + baked timestamp bottom-left + watermark top-right | Baked graphics avoidance; warm-mid luminance |
Gym_Grind |
Dark gym + dark tank top + phone-mirror selfie | Low luminance → matte difficulty; screen blend natural fit |
AI_Insights |
Podcast studio + neon "THE DIALOG" sign + window view | Competing graphics in BG (sign, city skyline); mid-tone |
Kitchen_Buzz |
Warm kitchen, apron, smiling | Baseline friendly case |
Tech_Trends |
Clean white studio + mic | Max bright backdrop — needs dark text or opaque BG |
Street_Talk |
Walking city street, handheld | Handheld motion + bright outdoor |
Outdoor_Hype |
Forest + Instagram watermark top + sun flare | Baked graphic + bright + motion |
Usage
for case in Sunset_Stroll Nature_Vibe Gym_Grind AI_Insights; do
bash scripts/render-and-composite.sh /tmp/ts-${case}
done
Regression checklist
For every new template or significant change, re-run the test set and verify:
- Sunset_Stroll: captions legible on bright sunset (Cinematic cream/screen washes out → use Standard mode, opaque rail)
- Nature_Vibe: captions don't collide with baked timestamp (bottom-left) or watermark
- Gym_Grind: captions visible on dark gym despite dark subject
- AI_Insights: captions don't fight with "THE DIALOG" neon sign
- Tech_Trends: dark text +
normalblend on pure white studio - Each case: 0.5s+ per caption, no wrap-into-subject-head-zone
- Each case: FG layer for 9:16 portraits where subject fills frame
Bugs we've fixed via this test set
- 2026-04-23: Hardcoded
text-shadow: warm-glow + dark-dropin all templates ignoredcap_color— dark text got overwhelmed by bright halo on bright backgrounds. Fix:TEXT_SHADOWplaceholder with luminance-adaptive default. - 2026-04-23: Hardcoded
filter: brightness(1.12)lightened dark text, shifting it toward neutral. Fix:TEXT_FILTERplaceholder that drops brightness boost for dark colors. - 2026-04-23:
BLEND_MODEandCAP_COLORhardcoded in new templates — plan.json overrides ignored. Fix: placeholders added to all 4 templates.
Expansion plan
Still need to add:
- 1 × 16:9 landscape (letterbox one of the above, or add a new source)
- 1 × 1:1 square (if available)
- 1 × multi-speaker (speaker diarization test)
- 1 × foreign language (CJK rendering test)
- 1 × shot-cut (PySceneDetect-required case)
- 1 × product/B-roll (no talking head — refuse gate)