Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Avenox Studio — produce brand-locked motion graphics with HyperFrames and composite them onto a cut video. Use when making cutaway/overlay graphics: title cards, diagrams, data-viz, loops, lower-thirds, outro. Proven cutaway + composite recipe with gotchas. Triggers: "make graphics", "add an animation", "motion graphic", "intro/outro card", "data-viz". Part of avenox-video step 3.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -14% | 0% |
Brand source of truth: brand/frame.md. Define it once, then never deviate inside a job. (Reference implementation: warm paper #f3efe4, ink #1b1712, one golden accent #e8b23a, a serif display face + a grotesk UI face, plus a mascot. Deliberately anti-AI-slop — no neon, no gradient mesh, no glassmorphism, no 3D gloss.)
cd "$STUDIO_JOBS/<job>/graphics" && npx hyperframes init gfx(one-time; installs a headless chromium — slow first run, background it).
<name>.html. Reuse the brandtemplate below. Each is full-screen 1920×1080 — a cutaway (opaque, replaces footage) or a transparent overlay.
index.html):bash for f in *.html; do n="${f%.html}"; [ "$n" = index ] && continue cp "$f" index.html npx hyperframes render -f 60 --resolution landscape -o "renders/$n.mp4" done
#root with data-composition-id="main" data-start data-duration data-width data-height.class="clip" + data-start data-duration data-track-index.window.__timelines["main"] = gsap.timeline({paused:true}). HyperFrames seeks it per frame, so everything must be seek-safe: use fromTo/set, and position every tween on tl.
Date.now(), no Math.random(), no runtimefetch. Web fonts via <link> are fine.
-f 60, --resolution landscape (1920×1080), --format mp4(use mov/webm for alpha overlays).
<link> to your webfont provider — renders fine inheadless chrome.
html,body{background:<paper>} + a paper div, radial vignette, and an SVGfeTurbulence grain at opacity .05 / mix-blend-mode: multiply. Fix the turbulence seed or the grain is nondeterministic and frames will flicker.
(scaleX wipe) → mascot (assets/mascot.png).
HSV key — saturated body colors and black ink survive, low-saturation cream becomes alpha:
pythonimport numpy as np from PIL import Image im = Image.open(src).convert('RGB') a = np.asarray(im) / 255. mx = a.max(2) s = np.where(mx > 1e-6, (mx - a.min(2)) / np.maximum(mx, 1e-6), 0) bg = (s < 0.22) & (mx > 0.60) out = np.dstack([np.asarray(im), np.where(bg, 0, 255).astype('uint8')]) img = Image.fromarray(out, 'RGBA') img.crop(img.getbbox()).save(dst)
Tune 0.22 / 0.60 to your plate. Too aggressive and you eat highlights on the subject.
Per cutaway input: [i:v]setpts=PTS+{START}/TB,format=yuv420p[ovi], then [prev][ovi]overlay=enable='between(t,{START},{END})':eof_action=pass[vi].
Keep the base audio (-map 0:a). Hardware encode with h264_videotoolbox -b:v 18M.
export SSL_CERT_FILE=$(python3 -c 'import certifi;print(certifi.where())') (and REQUESTS_CA_BUNDLE) or downloads fail.
hyperframes init first run is slow (chromium download) — background it.screen (lower-thirds, kinetic titles, callouts — rendered transparent as .mov/.webm with --format mov) for most beats. Reserve full-screen cutaways for the intro, outro, and genuine dead zones where the screen shows nothing useful. Replacing a screen that has useful content loses information — overlay it instead.
ffmpeg -ss), look atit, and place graphics in empty safe zones — never over a face or important UI. Optional: HyperFrames remove-background matting to sit graphics behind the subject.
a template.
sustained pieces get expensive fast.
Other measured skills in the registry, with their headline benchmark lift.