reel-studio — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited reel-studio (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.
End-to-end production for every professional short-form reel. Default style: saddamh1. Decoded forensic-level.
<repo>/interview-clip-engine/
references/SADDAMH1-MASTER-PLAYBOOK.md — 12 sections, single source of truth.
#FFFFFF/#F7E043/#000000 stroke 2px)Reference clip: clips/DJI_20260518_0023.silcut_clip_03_.mp4 (visa for digital nomad, 74s). The user approved this version ("always do such work") — these rules apply to EVERY new reel.
start_sec = 0.2, duration_sec = 3.5 — covers the IG/YT/TT thumbnail window.text = full episode title (10-14 words OK, render auto-shrinks via font ladder 120→60).style = "light" by default (white bg + black text + red accent on 1-2 nouns).illustration_prompt = 1 scenic nature anchor — see below.illustration_prompt MUST reference a subject noun from the clip's hook/topic — NOT random food/sand/abstract.rice terrace · beach drone · palm sunset · scooter street · jungle · cliff · roadside cafe · infinity pool.
minimalist editorial photo of <topic-subject>, <scenic location>, golden hour, muted dark palette, soft warm glow, vertical 9:16, cinematic depth of field, no text no words no captions
Card text MUST be readable at 1.5s pause-frame inspection. Original render failed: black text on dark-scrim scenic image = invisible.
(255,255,255,140) to LIFT image, NOT dark scrim. Black text + red accent then pops.(0,0,0,160). White text + yellow accent.0.35s (was 0.20 — slightly slower entrance feels editorial)0.80s (was 0.25 — viewer needs time to finish reading)pipeline/stage_08c_broll_cards.py::build_overlay_filter.#FFFFFF base, #F7E043 exact yellow accent (NOT #FFFF00), 2px stroke, 4px shadow, pop-karaoke, sentence case (NOT all-caps).#F7E043 · light = white/black/#FF3C3C.highpass=94, eq 200/-2, eq 3500/+2, eq 8000/+4.4, acompressor -18/3/8/180/+3, deesser.eq=brightness=0.05:contrast=1.08:saturation=1.10assets/bgm/mixkit-cinematic-*.mp3 (7 tracks, 100-226s, Mixkit Free license commercial-OK).mixkit-cinematic-871.mp3 (light, uplifting).For interview-style or "guest + me" reels, rotate 4 straps (top center) w/ 0.4s alpha fade-in/out:
MIKE CHANG / 7 MILLION+ FOLLOWERS)YOUR NAME / FOUNDER SKYNETLABS · CLAUDE CODE EXPERT)EDITED BY CLAUDE CODE / GUYS - DM FOR FULL GUIDE)LETS CONNECT / DM FOR INTERVIEW)Per-clip duration timing table:
| Clip ≈ | T1 | T2 | T3 |
|---|---|---|---|
| 20-25s | 8s | 14s | 20s |
| 25-30s | 8s | 16s | 23s |
| 30-35s | 10s | 18s | 25-28s |
| 35-40s | 10s | 20s | 30-32s |
Adjust to natural sentence breaks — strap should never change mid-sentence.
| Use | Hex | Text color | Notes |
|---|---|---|---|
| Brand primary pill | #F7E043 gold | black | Subject strap default |
| Premium accent | #00897B teal | white | outro strap (REPLACES ugly red) |
| Premium dark | #1A1A2E charcoal | gold/white | Card body bg |
| Emphasis only | #E53935 red | white | Word-level color pop, NEVER full strap bg |
| Host strap top | #4FC3F7 cyan | black | Your name |
| Host strap sub | #0D47A1 deep blue | white | Your credentials |
| Mid CTA pill | #E57345 orange | black | Claude Code message |
| Sub text default | black @0.85 | white | Always under top pill |
BANNED: #FF3C3C bright red as strap bg (cheap/alarmist). Use teal #00897B instead for any "urgent" CTA.
For multi-clip packs, prepend 3s animated intro + (optionally) append 6s animated outro to give narrative arc.
Intro card recipe (3s):
zoompan=z='min(zoom+0.0008,1.06)':d=90:s=1080x1920:fps=30[email protected]:t=fill for text legibilityOutro card recipe (6s):
FOLLOW @SKYNETLABS (the handle, always w/ @)Concat: ffmpeg -i intro.mp4 -i main.mp4 -i outro.mp4 -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" re-encodes ALL → seamless audio/video sync, same codec params end-to-end.
If source clip has dark B-roll cards baked in from older saddamh1 pipeline runs (night cityscapes, dark forests):
ffmpeg signalstats at 0.3s intervals, identify windows with YAVG<60work/*/broll_bg/*.png[scene]overlay=0:0:enable='between(t,X,Y)'-loop 1 -i scene.png (NO -t — image stream must outlast overlay window)scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,setsar=1| Gotcha | Symptom | Fix |
|---|---|---|
% literal in text | drawtext silently fails to render | Strip % or write "percent" |
\@ in single-quoted string | bash escape leaks | Use double quotes OR keep @ as-is (drawtext doesn't interpret it) |
-t N on -loop 1 input | overlay enable past N → nothing renders | Drop -t, use -shortest on output |
Newlines in -filter_complex | parse error | Flatten to single line OR use here-doc carefully |
| atempo<0.9 on speech | lip-sync looks off even when timing aligned | Don't speed-shift voice. Trim instead. |
Copy & adapt from templates/merge_pack/:
brand_main.sh — 4-strap rotation render for N clipsbuild_intros_outro.sh — animated intro/outro card generatorconcat_final.sh — intro+main+outro stitcherREADME.md — full quick-start + locked defaultsTrigger: when user has 2+ interview clips and wants branded social-pack output.
interviewLong-form raw video (interview, podcast, lecture) → 5-10 viral 9:16 shorts.
cd <repo>/interview-clip-engine
python run.py --input raw/episode.mp4
python run.py --url "https://youtube.com/watch?v=..."saddamh1 (default for new content)User records solo talking-head per generated script → I edit indistinguishable saddamh1 output.
# Step 1: generate script
python script_gen.py --topic "your topic" --duration 45 --tone tough-love
# → outputs/scripts/<slug>.md with HOOK + BEATS + PAYOFF + CTA + camera brief + B-roll cues + SFX + BGM + post caption
# Step 2: user records per brief, saves MP4 in raw/
# Step 3: edit
python run.py --input raw/my-take.mp4 --single-speakertts (voiceover, no recording)Script → ElevenLabs TTS → animated captions + B-roll cards + BGM.
_VIDEO-INVENTORY/PENDING/voiceover-batch-2026-05-16/ pipelinemograph (motion-graphics explainer, no face cam) ⭐ NEW 2026-05-17Decoded forensically from @beingmayy (After Effects MORPHING tutorial, 33s 16:9) + @mister.usb (Mac mini replaces streaming-stack, 67s 9:16). Flat-bg explainer w/ bold typography + UI mockup chips + 3D Apple emojis + product photos w/ soft blue halos. Voiceover-driven, NO face cam.
Playbook: references/mograph/MOGRAPH-MASTER-PLAYBOOK.md (12 sections — visual ID, slide grammar, 11-chip library, glow specs, hook bank, anti-patterns, pre-ship checklist).
11 slide types (consumed from script JSON):
typography — bold mixed-weight word reveal (with weight_mix for multi-size rows)chip-timer-pill · chip-search · chip-imessage · chip-button · chip-youtube · chip-track-order · chip-iphone · chip-phone-screen · chip-timelineproduct-photo — centered w/ soft blue halo + headline aboveicon-halo-cluster — 3+ icons w/ halos in triangle layoutend-cta — avatar + handle + socials row + animated FOLLOW + cursorRun:
# Manual — author script JSON yourself, render:
python mograph_reel.py --script examples/mograph-sap-n8n.json
# Auto — 1-line topic → Gemini drafts full slide JSON (mograph schema) → render:
python mograph_script_gen.py --topic "SAP just bought into n8n at $5.2B" --render
python mograph_script_gen.py --batch outputs/topics-week-21.txt --render
# → clips/mograph_*.mp4 (~25-30s, 9:16, 10-13 slides, hard cuts)4 ready samples in examples/:
mograph-sap-n8n.json (13 slides, 27.4s) — SAP buys n8n at $5.2Bmograph-apple-claude-wwdc.json (12 slides, 24.8s) — Apple opens Siri to Claudemograph-aeo-geo-killed.json (11 slides, 25.2s) — Google's AEO/GEO is still SEOmograph-chip-showcase.json (13 slides, 22.8s) — exercises all 11 chip primitivesTopic fit: "X tool hit $Y valuation" / "Big company surprising move" / "Old vs new way" / "X pays for itself" / "You don't need to be Y to do Z". NOT good for personal stories (no face = no emotion anchor).
Latest test (2026-05-17 PM): SAP buys n8n at $5.2B sample reel rendered clean — 13 slides distinct, FOLLOW CTA fires w/ cursor + 4 socials (IG/YT/TT/LI).
Reference assets: references/mograph/refs/ (2 source videos staged). Decode scripts: references/mograph/analyze_mograph.py + deep_decode_mograph.py (pending Gemini re-quota — playbook synthesized from manual frame-by-frame decode).
Inspired by @naval / @ryanholiday / @dailystoic. Premium thought-leader reels.
assets/fonts/)python kinetic_reel.py --quote "Do what's needed. Not what you want." --emphasis "needed,want"
python kinetic_reel.py --batch outputs/kinetic-quotes-pack.txt --emphasis "obstacle,path,consistency"
python kinetic_reel.py --quote "..." --voice tts.wav # add VOUse when: B2B / agency / luxury client targeting. Batchable from existing story posts. Zero recording required.
aeo-daily (skynet-aeo-engine bridge) ⭐ NEW 2026-05-19Wires daily AEO content into reel-studio. 3 variants per AEO daily output → 5 channel slots.
Bridge: <repo>/skynet-aeo-engine/scripts/build_videos.py
| Variant | Duration | Style | Source script (extended schema) | Fallback (legacy) | Channels |
|---|---|---|---|---|---|
aeo-daily-biz-pro | 60-75s (target 67s) | saddamh1 talking-head, business voice, F7E043 yellow + green-on-money | copy.business.linkedin.post | copy.li_post | ig-pro, yt, tt-pro |
aeo-daily-travel-narrative | 45-60s (target 52s) | kinetic-stoic text reel + scenic DJI Ken-Burns (NO face, NO VO) | copy.travel.ig_travel_1.caption | synth from copy.anchor | ig-travel-1 |
aeo-daily-travel-tiktok | 30-45s (target 38s) | saddamh1-lite Hinglish, warm gold/coral/turquoise palette | copy.travel.tt_travel_1.script | synth from copy.anchor | tt-travel-1 |
End-card handles (mandatory):
example.com (agency)@yourhandle (personal)Voice-lint guard: travel variants HARD-FAIL if script contains aeo / agency / client / skynetlabs / linkedin / ghl / n8n / saas / mrr / fiverr / upwork. Scrub copy.json before re-run.
Source-MP4 lookup (real pipeline):
interview-clip-engine/raw/aeo-daily-YYYY-MM-DD.mp4tts_reel.py (auto ElevenLabs > Edge > pyttsx3)travel-narrative NEVER needs source MP4 (kinetic_reel.py + Ken-Burns layer)Run:
# Smoke test (ffmpeg colorbars, no deps) — proves orchestration
cd <repo>/skynet-aeo-engine
python scripts/build_videos.py --smoke
# Real pipeline (today)
python scripts/build_videos.py
# Specific date
python scripts/build_videos.py --date 2026-05-19
# One variant only
python scripts/build_videos.py --only travel-tiktokOutput (predictable for schedulers):
skynet-aeo-engine/outputs/<date>/business/ig-pro/reel.mp4
skynet-aeo-engine/outputs/<date>/business/yt/reel.mp4
skynet-aeo-engine/outputs/<date>/business/tt-pro/reel.mp4
skynet-aeo-engine/outputs/<date>/travel/ig-travel-1/reel.mp4
skynet-aeo-engine/outputs/<date>/travel/tt-travel-1/reel.mp4
skynet-aeo-engine/outputs/<date>/video_build_report.jsonNew run.py flags (added 2026-05-19):
--script-text "..." — persist script text alongside the work dir--slug ig-pro — predictable output filename override--synth-colorbars — emit ffmpeg colorbars MP4 at variant's target duration + AR (smoke-test gate)Smoke test results 2026-05-19 (3 colorbar mp4s):
Per Agent C competitor research — rotate variants every 4 reels:
| Variant | When | Inspired by | Look |
|---|---|---|---|
saddamh1-default | 75% of reels | saddamh1 | Lower-third, Sentence case, #F7E043 yellow + cyan/green accents, dense color-pop |
iman-premium | every 4th reel | @imangadzhi | lowercase Inter Bold 52px, minimal color (white + 1 accent), ambient pad BGM -22dB, gentle push-in 1.0→1.03, teal/orange or warm-muted grade, 24fps cinematic, AR toggle 9:16/16:9 |
bartlett-podcast | interview cutdowns | Steven Bartlett (Diary of a CEO) | stacked 2-cam 1080×960+1080×960 (top:speaker close / bottom:wide both), diarization-driven cam switch (120ms lead + 800ms min hold), dual-color caps (host #F7E043 / guest #FFFFFF), 3s hook ribbon w/ name + EP#, podcast BGM fade-out at 2s, "Watch full episode" end card |
| substance-caps | personal-brand / founder talking-head | Submagic "Hormozi 2" + UK coach reels (decoded 2026-06-01) | MID-SCREEN 2-line stack, lead words WHITE + punch word GOLD #E8C87E bigger, Montserrat Black caps word-pop, full-frame espresso #3C2422 break-cards (lowercase gold word) as pattern-interrupts, occasional Playfair-italic soft phrase, warm-clean grade |
Run via --variant <name>. Default = saddamh1-default.
`substance-caps` (NEW 2026-06-01) — proven clone of the "stop polishing, start substance" reference reel. Preset: config/presets/substance-caps.yaml. Standalone renderer: tools/substance_caps_render.py (midcaps-twotone ASS + espresso break-cards + serif soft-phrases in ONE ffmpeg pass). Proof: work/substance-caps-PROOF.html (ref-vs-clone side-by-side). Fonts shipped in assets/fonts/ (Montserrat-Black, Anton, PlayfairDisplay-Italic). To run on a clip: whisper word-stamps → substance_caps_render.py. TODO: fold the midcaps-twotone branch into pipeline/stage_08_burn_caps.py keyed by captions.style so run.py --variant substance-caps routes the full multi-platform pipeline.
v0.4.0 2026-05-19 — iman-premium + bartlett-podcast upgraded from caption-only to full-spec modes:
config/presets/iman-premium.yaml (99 lines) + config/presets/bartlett-podcast.yaml (132 lines)references/iman-premium/IMAN-PREMIUM-PLAYBOOK.md (12 sections) + references/bartlett-podcast/BARTLETT-PODCAST-PLAYBOOK.md (12 sections)stage_11_end_card.py (shared, 2 flavors — clean-fade-handle for iman + watch-full-episode for bartlett, Pillow slate + ffmpeg concat w/ audio fade-out) · stage_06b_multicam_stack.py (bartlett signature, vstack top:cam_b 1080×960 + bottom:cam_a 1080×960, single-cam pass-through fallback if --cam-b absent, diarization-driven swap = v2 TODO) · stage_07c_color_grade.py (iman LUT apply via lut3d=, ffmpeg eq+colorbalance+curves fallback w/ preset-driven dict from YAML fallback_filter)--cam-b, --handle, --hook-name, --hook-episode, --ar 9:16|16:9, --skip-grade, --skip-endcard. Pipeline routing in run.py: iman → 07c + 11, bartlett → 06b (if --cam-b) + 11. Drop a .cube LUT at assets/luts/teal-orange-cinematic.cube to swap fallback for cinematic grade.stage_08 dual-color speaker routing (host yellow / guest white via diarization tags per word), stage_08e_hook_ribbon (3s top-third overlay w/ speaker name + EP#), BGM fade-out-at-mark in stage_09 finalize (afade=t=out:st=0:d=2 on BGM track only)--cam-b) → pass-through copy ✓. stage_11 iman flavor: 3s clip + 2.0s slate → 5.03s output ✓. stage_11 bartlett flavor: 3s clip + 2.5s slate → 5.54s output ✓.raw/DJI_iman.MP4) end-card text legibility at iPhone preview size (handle @yourhandle Inter Bold 64px → may want bigger), then drop a real .cube LUT for the cinematic grade pass.| Component | Tool | Purpose |
|---|---|---|
| Silence kill | unsilence (replacing auto-editor) | 30-50% runtime save |
| Transcribe | faster-whisper large-v3 GPU | Word timestamps |
| Diarize | pyannote-audio 3.1 | Speaker turns (interview mode) |
| Hook detect | Gemini 2.5 Flash native video | 1hr ctx free tier |
| Hook timestamp snap | custom (fuzzy match Whisper) | Fix Gemini ±15s drift |
| Cut | ffmpeg | Frame-accurate |
| Reframe | MediaPipe face-track | Horizontal → 9:16 |
| Zoom | ffmpeg zoompan (1.0→1.06 push-in) | saddamh1 signature |
| B-roll cards | Pillow + ffmpeg overlay | Gemini picks card text per clip |
| Captions | ASS karaoke (upgrade to pycaps planned) | Word-by-word selective highlight |
| SFX layer | ffmpeg amix | impact + pop on emphasis + ding on numbers |
| Voice EQ | ffmpeg afilter chain | highpass + presence + de-ess + compressor |
| BGM | Mixkit cinematic ducked-low | Sidechain compress |
| Loudness | alimiter + loudnorm -16 LUFS | Platform-spec |
All free, all local-first, all Windows-tested on RTX 4060.
interview-clip-engine/.env)GEMINI_API_KEY=... # https://aistudio.google.com/app/apikey (free)
HF_TOKEN=... # https://huggingface.co/settings/tokens + accept pyannote license
GROQ_API_KEY= # optional Whisper fallback| Topic family | Template | BGM mood | Card style | Highlight color | Variant |
|---|---|---|---|---|---|
| Money / income | T1 problem-solution | motivational-uplift | dark + green accent | green (#00FF00) | saddamh1-default |
| Skill / future-threat | T3 contrarian | cinematic-tense | red bg | red (#FF3B30) | saddamh1-default |
| Discipline / mindset | T4 story-payoff | dramatic-cello | dark | yellow (#F7E043) | iman-premium |
| List of N | T2 list-of-N | upbeat | light + numbered | cyan (#00FFFF) | saddamh1-default |
| Comment-bait reveal | T5 comment-bait | trap-lite | dark + yellow CTA | yellow (#F7E043) | saddamh1-default |
| Interview cutdown | n/a (interview mode) | ambient | lower-third name strap | white + 1 accent | bartlett-podcast |
# Interview → 5-10 shorts
python run.py --input raw/long_interview.mp4
# YouTube interview URL
python run.py --url "https://youtube.com/watch?v=ABC"
# My talking-head recording, single speaker
python run.py --input raw/my_take.mp4 --single-speaker
# Skip silence cut (short clips)
python run.py --input raw/short.mp4 --skip-silence
# Generate script for new topic
python script_gen.py --topic "why most freelancers stay broke"
# Generate 10 scripts batch
python script_gen.py --batch outputs/topics-week-21.txt
# Re-render with different variant
python run.py --input raw/my_take.mp4 --variant iman-premium01_silence_cut auto-editor (→ unsilence upgrade)
02_transcribe faster-whisper word-stamps
03_diarize pyannote (skipped for single-speaker)
04_hook_detect Gemini Flash native video
05_edl_build hook timestamp snap + word merge
06_cut_clips ffmpeg frame-accurate
07_reframe MediaPipe face-track 9:16
07b_zoomout push-in 1.0→1.06 (saddamh1 signature)
08c_broll_cards Gemini picks + Pillow renders + ffmpeg overlays
08_burn_caps ASS karaoke selective highlight
09_finalize voice EQ + BGM duck + alimiter + loudnorm
09b_sfx impact + pop + ding overlaysPer-stage skip flags: --skip-silence, --skip-reframe, --skip-zoom, --skip-broll, --skip-caps, --skip-bgm, --skip-sfx.
unsilence lib → replace auto-editor (1-day, top OSS win)pycaps → upgrade ASS karaoke to CSS-styled animated captions (2-3 days)opensource-clipping B-roll fetch (Pexels API) + auto-thumbnail (1-2 days)bilingualsub → stacked EN+UR subs for Pakistan reels (1 day)pipeline/10_tts_voiceover.py (mode 3 unlock)iman-premium + bartlett-podcast caption variantssaddamh1-replicator~~ → merged hereinterview-clipper~~ → merged here/video-edit command~~ → superseded~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.