hypr-video-cli — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited hypr-video-cli (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
# Write config → generate JSON → render
node scripts/gen_canvas.mjs /tmp/video-<name>.mjs /tmp/video-<name>.json
npx hypr-video-cli /tmp/video-<name>.json -o ./output/<name>.mp4- [ ] Step 1: Read references & plan scenes
- [ ] Step 2: Build config & generate JSON
- [ ] Step 3: Render & verify1a. Read these references (always required):
theme() (24 themes), 11 role helpers, autoTracks(), inline animIn/animOut/kf, SVG helpers, buildCanvas. Pitfalls are inline with ⚠️ markers.1b. Plan scenes: identify video type, list scene names/durations, pick best SVG helpers per scene, pick best elements and emoji.
1c. Read extras based on the plan:
| When | Reference |
|---|---|
| Using SVG helpers (almost always) | svg-helpers.md — params for all 65 helpers |
| Choosing fonts | font-assets.md — 18 bundled fonts & pairings |
| Adding emoji/unicode decorations | icons.md |
2a. Write a config .mjs file. Config and JSON go in /tmp/ — never write to examples/.
export default function build(h) {
const {
makeShape, makeEffect, buildCanvas, theme, autoTracks,
svgVignette, svgDotGrid, svgGradientOrb, svgParticles,
svgCheckMark, svgNumberCounter, // ...SVG helpers as needed
} = h;
const t = theme("cyberpunk"); // 24 themes — colors + role helpers + fonts
const MAX = 25000;
// ── Global layers ──
const g_dot = svgDotGrid("g_dot", { start: 0, end: MAX, opacity: 0.04, color: t.ACCENT });
const g_vig = svgVignette("g_vig", { start: 0, end: MAX, opacity: 0.6 });
// ── Scene 1: Hero (0–7s) ──
const s1_orb = svgGradientOrb("s1_orb", {
x: 360, y: 60, w: 1200, h: 960, start: 0, end: 7500, opacity: 0.10, color: t.ACCENT,
});
const s1_title = t.hero("s1_title", "Product Name", {
x: 160, y: 340, start: 0, end: 7000,
animIn: ["blurIn", 1200], animOut: ["blurOut", 700],
kf: { scale: { dur: 7000, amp: 0.02 } },
});
const s1_div = makeShape("s1_div", "rect", t.ACCENT, {
x: 760, y: 510, w: 400, h: 3, start: 500, end: 6500,
animIn: ["expandIn", 500], animOut: ["fadeOut", 300],
});
const s1_sub = t.subtitle("s1_sub", "Tagline goes here", {
x: 260, y: 540, start: 700, end: 6500,
animIn: ["fadeIn", 800], animOut: ["fadeOut", 500],
});
// ── Scene 2: Features (6.5–16s) ──
// ... more scenes follow the same pattern
const elements = [g_dot, g_vig, s1_orb, s1_title, s1_div, s1_sub /* ... */];
return buildCanvas({
bg: t.BG, maxTime: MAX,
// t.fonts is an OBJECT { Montserrat: {...}, "Fira Code": {...}, ... } — NOT an array
// To add extra fonts (e.g. CJK), use object spread:
fontAssets: {
...t.fonts,
"Noto Sans SC": { url: "skill/assets/fonts/NotoSansSC-Variable.ttf", fileType: "ttf" },
},
elements, tracks: autoTracks(elements),
fps: 30, quality: "medium",
});
}node scripts/gen_canvas.mjs /tmp/video-<name>.mjs /tmp/video-<name>.json2b. Before rendering, verify:
t.hero … t.eyebrow) — use raw makeText only for custom font/size/color (e.g. code blocks, CJK with Noto Sans SC)animIn + animOut; stagger 300–500ms between elements0–MAXmaxTime >= last element's endnpx hypr-video-cli /tmp/video-<name>.json -o ./output/<name>.mp4CLI flags: --fps 24|30|60, --quality low|medium|high|very_high, --format mp4|mov|mp3, --width N, --height N, -q (quiet).
If render fails → check ⚠️ pitfalls in gen-canvas.md
examples/theme() + role helpers + inline animIn/animOut/kf + autoTracks().s1_/s2_… per scene; use comment blocks // ── Scene N: Title (Xs–Ys) ──node scripts/gen_canvas.mjs (NOT skill/scripts/){ ...t.fonts, "Extra Font": { url: "...", fileType: "ttf" } } to add fonts. Never use [...t.fonts] (array spread)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.