Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build a short news-explainer video tuned for shareability. One striking moment per video; real fetched assets; self-heal validation; pluggable TTS (Gemini-free default, OpenAI fallback).
.claude/skills/sonichi-make-viral-video/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 24% | 0% |
Build a short (~30-60s, 1280×720 landscape, h264+aac) news-explainer video around a single source URL or news event. Designed for shareability via the specificity-shape framing (Chi's pick 2026-05-09): one striking number, image, or quote — not a comprehensive overview.
Distinct from Lucy's recursive-meta-explorer v8-v12 lineage (which optimized for completeness). This skill optimizes for the one moment that makes someone share.
bashbash "$SKILL_DIR/scripts/build.sh" --topic "DoW UAP file release" --source "https://war.gov/UFO" --out results/
Produces:
results/viral-{ts}/video.mp4 — the rendered videoresults/viral-{ts}/script.md — the narration scriptresults/viral-{ts}/assets/ — fetched images with hash + validation logresults/viral-{ts}/build.log — full build trace (codex iterations + validation results)results/viral-{ts}/verify.sh — script to independently re-validate the buildpython3 ≥ 3.10 (PIL for frame composition)ffmpeg (encode + ffprobe gate)gemini API key (free tier, default) OR openai API key (fallback)Phase 1 — Source ingestion + script generation
[{"url": "...", "alt": "...", "purpose": "hook|support|closer"}]Phase 2 — Asset validation (the self-heal loop)
For each asset URL:
If 3+ assets fail validation, escalate to user (don't ship a video with placeholder content).
Phase 3 — Render + pre-publish gate
Per Chi's "visual needs improvement too":
Default: GEMINI (free tier, 1500 req/day quota) → OPENAI (sage voice, ~$0.02/min) fallback.
Voice flags (per render.py --help):
--gemini-voice {Aoede,Charon,Kore,Puck} (default Aoede)--openai-voice — free-text (used only on OpenAI fallback path)The skill ships an end-card slate (last 2s) for series identity. Per Chi 2026-05-10:
MINI WIRE
by Echo Act IV · Sutando (optional byline)
ep. 001 · 2026.05.10Slate flags:
--series-title "Mini Wire" — wordmark in brand red. Empty string skips the slate entirely.--episode 001--date 2026.05.10 (defaults to today)--byline "by Echo Act IV · Sutando" — free-text, between title and episode line. Empty omits byline. Caller controls every word — no hardcoded identity in render.py.--slate-duration 2.0 — secondsThe slate is silent — narration runs over the prior frames; slate gets a apad=pad_dur=2 audio tail so AV streams stay synced through the silent end-card.
render.py reads asset_manifest.json and maps each entry's purpose to its frame:
purpose=hook → HOOK frame bgpurpose=support (idx N) → SUPPORTN] frame bgpurpose=closer → CLOSER frame bgdata-card-* real image if no explicit assetManifest entries have shape:
json{ "url": "https://example.com/photo.jpg", "local_file": "photo.jpg", "alt": "...", "purpose": "hook|support|closer", "badge": "Optional upper-strip badge text", "is_video": false, "source_tag": { "event_id": "pursue-release-01-2026-05-08", "case_id": "apollo-17-vm6-1972", "source_agency": "NASA", "source_url": "https://www.war.gov/UFO/", "source_type": "primary", "attribution": "war.gov/UFO/ · NASA", "license": "public-domain", "footer_short": "Apollo 17 / 1972" }, "provenance": "Free-text operator note." }
source_tag is optional (v1.0, Mini↔Lucy 2026-05-10). When present, renderer:
--footer from distinct event_id + footer_short values across manifest entries (operator-supplied --footer overrides).license: needs-license and empty attribution.Full schema reference: notes/sutando-wire/source-tag-schema-v1.md. v1.1 candidate adds optional primary: bool for multi-event Deep-slot pieces (gates which event_ids enter the auto-footer chain).
Per-frame durations are allocated proportional to that frame's narration word count (not fixed allocations). 18-word HOOK gets ~3× the screen time of a 6-word SUPPORT sliver — fixes the "scene changed before narration finished" failure mode.
Shared cache at state/viral-cache/fetched_assets/ keyed by URL → local-file mapping. build.sh automatically:
Manual control via python3 skills/make-viral-video/scripts/asset_cache.py {preload|promote|list} <run_dir>. Cache index at state/viral-cache/index.json.
bash# Reproduce the UAP topic with this skill, compare against Lucy's v12 visually: bash scripts/build.sh --topic "DoW UAP file release" --source "https://war.gov/UFO"
Validate the output passes:
recursive-meta-explorer-prompt v13Lucy's lineage optimized for informational completeness + per-pass codex /goal iteration. This skill optimizes for one shareable moment + a deterministic validation gate. They serve different goals; both can coexist. Not deleting Lucy's work.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 11,806 | 2,213 | -81% | 1 | 1 | 0% | 1,792 | 2,633 | +47% | 0 | 0 | — |
case-04 | pass→pass | 12,410 | 8,485 | -32% | 1 | 1 | 0% | 1,860 | 3,572 | +92% | 0 | 0 | — |
case-05 | fail→pass | 6,380 | 7,301 | +14% | 1 | 1 | 0% | 981 | 3,429 | +250% | 0 | 0 | — |
case-06 | pass→pass | 13,740 | 9,112 | -34% | 1 | 1 | 0% | 2,221 | 3,752 | +69% | 0 | 0 | — |
case-07 | pass→pass | 12,141 | 2,943 | -76% | 1 | 1 | 0% | 1,961 | 2,820 | +44% | 0 | 0 | — |
case-01 | fail→fail | 25,072 | 5,934 | -76% | 1 | 1 | 0% | 4,830 | 2,576 | -47% | 0 | 0 | — |
case-02 | fail→fail | 28,910 | 4,800 | -83% | 1 | 1 | 0% | 5,329 | 2,633 | -51% | 0 | 0 | — |
case-03 | fail→fail | 28,412 | 9,180 | -68% | 1 | 1 | 0% | 5,393 | 2,608 | -52% | 0 | 0 | — |
case-09 | fail→pass | 12,302 | 2,914 | -76% | 1 | 1 | 0% | 1,683 | 2,752 | +64% | 0 | 0 | — |
case-10 | pass→pass | 15,534 | 5,055 | -67% | 1 | 1 | 0% | 2,181 | 2,942 | +35% | 0 | 0 | — |
case-11 | fail→pass | 16,419 | 8,231 | -50% | 1 | 1 | 0% | 2,382 | 3,574 | +50% | 0 | 0 | — |
case-12 | fail→pass | 15,174 | 4,529 | -70% | 1 | 1 | 0% | 2,469 | 3,052 | +24% | 0 | 0 | — |
case-13 | pass→pass | 5,038 | 2,618 | -48% | 1 | 1 | 0% | 714 | 2,684 | +276% | 0 | 0 | — |
case-14 | fail→pass | 13,720 | 2,999 | -78% | 1 | 1 | 0% | 2,224 | 2,762 | +24% | 0 | 0 | — |
case-15 | fail→fail | 13,315 | 2,551 | -81% | 1 | 1 | 0% | 1,906 | 2,671 | +40% | 0 | 0 | — |
case-16 | fail→fail | 5,855 | 1,982 | -66% | 1 | 1 | 0% | 918 | 2,633 | +187% | 0 | 0 | — |
case-17 | fail→pass | 13,331 | 1,476 | -89% | 1 | 1 | 0% | 2,020 | 2,505 | +24% | 0 | 0 | — |
case-18 | pass→fail | 18,897 | 1,979 | -90% | 1 | 1 | 0% | 2,837 | 2,655 | -6% | 0 | 0 | — |
case-19 | fail→pass | 13,501 | 4,619 | -66% | 1 | 1 | 0% | 1,963 | 2,965 | +51% | 0 | 0 | — |
case-20 | fail→pass | 13,378 | 2,322 | -83% | 1 | 1 | 0% | 2,060 | 2,708 | +31% | 0 | 0 | — |
case-21 | fail→pass | 11,889 | 2,006 | -83% | 1 | 1 | 0% | 1,606 | 2,598 | +62% | 0 | 0 | — |
case-22 | pass→pass | 9,776 | 4,430 | -55% | 1 | 1 | 0% | 1,466 | 3,011 | +105% | 0 | 0 | — |
case-23 | fail→pass | 7,983 | 2,267 | -72% | 1 | 1 | 0% | 1,229 | 2,641 | +115% | 0 | 0 | — |
case-24 | pass→fail | 7,565 | 2,586 | -66% | 1 | 1 | 0% | 1,035 | 2,714 | +162% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +38 percentage points is the difference between those two pass rates over the 21 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.