Skip to content
Back to skills

Explainer Kit

ASecurity

Explainer Kit - the support layer the talking-explainer skill runs on - machine setup check, the user's brand + voice profile, voiceover transcription to word timings, audio mastering, the corner-logo overlay, sync check, seam diffs and the tools that turn a character image into a talking mascot. Use it through talking-explainer; use it directly only for its setup ("set up my explainer profile", "run the explainer setup check") or one of its tools by name.

  • 67 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
ai-agentspythongonodegit

Works with

  • cli

Security analysis

A100/100

Pro scans all 20 files and shows the line behind each finding

Scanned November 7, 2026

npx -y skills add brewed-ops/talking-explainer --skill explainer-kit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Explainer Kit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Explainer Kit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/brewed-ops-explainer-kit/badge)](https://www.skillsdirectory.com/skills/brewed-ops-explainer-kit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: explainer-kit
description: Explainer Kit - the support layer the talking-explainer skill runs on - machine setup check, the user's brand + voice profile, voiceover transcription to word timings, audio mastering, the corner-logo overlay, sync check, seam diffs and the tools that turn a character image into a talking mascot. Use it through talking-explainer; use it directly only for its setup ("set up my explainer profile", "run the explainer setup check") or one of its tools by name.
---

# Explainer Kit

Shared tools for the talking-explainer skill. It is not a film recipe on its own - the film phases live in
talking-explainer's SKILL.md.

Paths used below:
- `<skill>` = this skill's folder. `<engine>` = `<skill>/../spatial-film`.
- `<home>` = `TALKING_EXPLAINER_HOME` or `~/.talking-explainer`. Profile = `<home>/profile/`.
- `<py>` = the `python` command saved in `<home>/config.json` by setup-check (e.g. `py -3.12` on Windows,
  `python3` on macOS).

Run every film script from the film project root. Scripts are proven code - run them, never regenerate them.

## Phase S - Setup (first run only, skip when `<home>/profile/brand.json` exists)

1. `node <skill>/scripts/setup-check.mjs` - fix every MISSING line with the install command it prints, rerun
   until it exits 0. Tell the user plainly what to install; do not install system tools without asking. Its
   YOUR INPUTS block lists what only the user can bring (TODO / ASK / OPTIONAL) - steps 2-5 fill those.
2. Brand interview, one message (include the voiceover question: ElevenLabs voice clone on a paid plan, or
   recording themselves with a decent mic in a quiet room - no route = stop and tell them they need one), then
   `node <skill>/scripts/profile.mjs init --name "<brand>" ...` (flags: `--wordmark "Part1,Part2" --logo <file>
   --logo-has-text --ink #hex --accent #hex --opener "explains" --cta "Follow for more" --presenter "<mascot name>"
   --language "<language>" --films-dir <dir>`). A PNG logo goes through
   `<py> <skill>/scripts/prep-logo.py <logo> <home>/profile` first. No logo = wordmark only.
3. Voice: fill `<home>/profile/voice.md` (the template explains both ways) - 5-question interview, or
   `<py> <skill>/scripts/speech-profile.py` on the transcript of a 5+ minute unscripted recording of them talking.
4. Presenter: the bundled talking demo, or their own talking character (talking-explainer's "Your own talking
   character" section).
5. Music (optional): their own licensed bed at `<home>/profile/music/bed.mp3`. Otherwise the HeyGen catalog
   (`npx hyperframes auth login` once, then `node <engine>/scripts/music-search.mjs "<mood>"`) or no bed.

`node <skill>/scripts/profile.mjs show` prints the merged profile at any time.

## Files

| Path | What |
|---|---|
| `scripts/setup-check.mjs` | Checks every tool, saves the Python command, prints install commands for what is missing. |
| `scripts/profile.mjs` | `init` / `show` / `path` for the user's brand profile. |
| `scripts/new-explainer.mjs` | Base scaffold (engine skeleton + kit + brand + SFX + audio). talking-explainer's scaffold calls it - do not run it on its own. |
| `scripts/prep-logo.py`, `scripts/build-brand.py` | Logo cleanup; the corner-logo overlay (`m-brand`) timed from film.json. |
| `scripts/prep-mascot.py` | Normalise a character's pose PNGs, write the manifest, fit blinks when faces exist. |
| `scripts/transcribe.py`, `scripts/words.py` | faster-whisper word timings; print every word with its start time (the storyboard's cue sheet). |
| `scripts/master-audio.py` | Voice loudnorm + sidechain-ducked bed + loudness report. |
| `scripts/sync-check.py`, `scripts/seam-diff-all.mjs` | Render audio vs source word timings; seam diffs with the presenter box masked. |
| `scripts/speech-profile.py` | Measure a speaker's style from a long unscripted recording's transcript. |
| `scripts/cut-sheet.py`, `scripts/mouth-fit.py`, `references/mascot-sheet-prompt.md` | A TALKING character from 3 image prompts: cut the sheets into sprites, fit 6 mouth shapes per pose. |
| `references/voice-script.md` | How to write a script in the speaker's voice (loaded in talking-explainer phase 1). |
| `assets/brand/` | Montserrat 700 + OFL (logo font). The user's logo is copied in per film; SFX come from HyperFrames' `media-use` skill. |
| `template/` | Base kit.css, frame.md, snippets, scene-starter, worker brief, presenter track - talking-explainer layers its Apple look on top. |
| `template/profile/` | Sample profile: brand.example.json, logo.svg, voice.example.md. |

## Hard rules

1. **The speaker's voice is untouchable** - only loudness mastering; the visuals move to the words, never the reverse.
2. **Music must be theirs to use** - their own licensed file, the HeyGen catalog, or none. Never pull a track off
   YouTube or a random site.
3. **Sync check** = transcribe the RENDERED mp4, then `sync-check.py` against the source timings. That is the proof
   the picture lands on the words - never claim it from reasoning.
4. renders/, .media/, .hyperframes/ and audio files stay out of git.

## When things go wrong

| Symptom | Cause | Fix |
|---|---|---|
| A script says "run setup-check first" | no `<home>/config.json` | `node <skill>/scripts/setup-check.mjs` |
| `prep-mascot.py` needed | custom mascot folder without manifest.json | `<py> <skill>/scripts/prep-mascot.py <home>/profile/mascot` |
| Voice clips after a gain lift | plain gain on a hot take | `master-audio.py` (loudnorm), never plain gain |
| `build-presenter.py` dies in ffmpeg on `vo-master.wav` | audio not mastered yet | run `master-audio.py` first |
| seam-check FAILs ~1% on every cut | the presenter moves across seams | `seam-diff-all.mjs`: 0.00% outside the box = pass |
| Render is ~15x slower than expected | no GPU / software path | render-final prints the gpu mode; close other GPU apps or accept the wait |

Files in this skill

  • SKILL.md5.7 KB
  • assets/brand/OFL-montserrat.txt4.3 KB
  • assets/brand/montserrat-700.woff218.4 KB
  • references/mascot-sheet-prompt.md5.4 KB
  • references/storyboard.md5.3 KB
  • references/voice-script.md5 KB
  • scripts/blocks_to_sprite.py3.3 KB
  • scripts/build-brand.py3.4 KB
  • scripts/cut-sheet.py7.5 KB
  • scripts/lib/brand.mjs2.5 KB
  • scripts/lib/python.mjs1.5 KB
  • scripts/master-audio.py3.1 KB
  • scripts/mouth-fit.py16.5 KB
  • scripts/mouth-zoom.py1.5 KB
  • scripts/new-explainer.mjs7.8 KB
  • scripts/prep-logo.py1.7 KB
  • scripts/prep-mascot.py4.6 KB
  • scripts/profile.mjs3.5 KB
  • scripts/seam-diff-all.mjs2.4 KB
  • scripts/setup-check.mjs9.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.