Khan Explainer
Make Khan Academy style explainer videos locally on macOS: a pen draws on a blackboard or whiteboard while a voice explains, from one scene file to one MP4 — blackboard lessons, arrows and...
- What
- Make Khan Academy style explainer videos locally on macOS: a pen draws on a blackboard or whiteboard while a voice explains, from one scene file to one MP4 — blackboard lessons, arrows and...
- Cost
- Free
- Needs
- Before you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else.
- Install
- Copy the installer prompt below into your Muse — your agent does the rest.
Make Khan Academy style explainer videos locally on macOS: a pen draws on a blackboard or whiteboard while a voice explains, from one scene file to one MP4 — blackboard lessons, arrows and captions drawn over product screenshots, and vertical clips cut from a YouTube video or podcast with the speaker's real audio, using HTML canvas, Playwright, the built-in `say` voice and ffmpeg, with optional ElevenLabs or free local Kokoro voices.
Version:
Install
Copy the install package below, then paste it into Muse📌 Pinned version: commit 326bf9bBefore you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else. Prerequisites: macOS only. The skill copy itself needs no account, no API key and no paid service, and the skill is free (MIT). Using it afterwards needs macOS, Node 20 or newer and ffmpeg (`brew install ffmpeg`) already on the machine, plus a separate first-run environment setup in the installed scripts/ folder (`npm install`, then `npx playwright install chromium`, which downloads the pinned Playwright package and a Chromium browser) — none of that is run during this install; it is my decision, later, before first use. The default voice is free and local (macOS `say`). LABEL DISCLOSURE, added 2026-10-23 — read this before deciding, because two optional modes send or read data, and both are disclosed in point 2 before either can happen: (i) the optional "real-audio clips" mode, which is never the default, makes yt-dlp read my own Chrome browser session (`--cookies-from-browser chrome`, SKILL.md step 1 of "Real-audio clips") to download the audio of a YouTube video or podcast that I name; (ii) the optional ElevenLabs voice, only if I activate it myself on a scene, sends that scene's spoken text (the whole script, in one take) together with my own ElevenLabs API key to api.elevenlabs.io. Neither mode runs during installation, neither is on by default, and no code in the repository connects the Chrome cookies to ElevenLabs: they are two separate optional flows, in two separate files. Install "khan-explainer" for me. It makes Khan Academy style explainer videos locally on macOS: a pen draws on a blackboard or whiteboard while a voice explains, from one scene file to one MP4. It has three modes: a blackboard lesson (a diagram drawn stroke by stroke), a draw-over-UI tutorial (arrows, circles and numbered captions drawn over product screenshots), and a real-audio clip (vertical shorts cut from a YouTube video or podcast, the speaker's real audio playing under a board drawn to their words, with an optional macOS Vision talking-head cutout). The voice drives the clock: a scene is a list of beats, each beat is one spoken clause plus the drawing made while it is said, and the renderer speaks each beat first, measures it, then fits the drawing to it. It writes in many scripts (Arabic, Urdu and Hebrew right to left; Indic, Thai, Chinese, Japanese, Korean, Cyrillic, Greek and more), on a blackboard or a whiteboard, landscape or vertical. Repository: https://github.com/haiderfarooq3/khan-explainer (the skill is the whole repository at the pinned commit, SKILL.md at the root, minus the .git folder and minus the duplicate skills/khan-explainer/ copy of SKILL.md: 37 files) Pinned version: install the code at commit 326bf9b5332bb30a09e9d11f0ba81e30e7a0e81f exactly. Do not substitute a newer version. If this commit is unreachable, stop and tell me. 1. Clone https://github.com/haiderfarooq3/khan-explainer into a temporary folder, check out commit 326bf9b5332bb30a09e9d11f0ba81e30e7a0e81f, and copy the whole repository folder from that checkout, except the .git folder and except the skills/khan-explainer/ folder (a duplicate copy of the root SKILL.md, plus 92 bytes, kept upstream only for skills.sh discovery; the root file is the source of truth). Then compare every copied file with the fingerprints recorded for this listing on 2026-10-19 and re-verified unchanged on 2026-10-23: [FINGERPRINTS] - .github/workflows/render.yml: SHA-256 be0310b9a1759ef95d00bbbd3a7bd34f95779b817756f623d242fefbef9cdf47 - .gitignore: SHA-256 83891c353af34dbb6cab73c6eb6d8894d281b475a78108e9c36a4be56c589c36 - LICENSE: SHA-256 ff609398ef2adffc88c4856afef52e13a4ceae902d775a7e2b6f6e4db2af7a7f - README.md: SHA-256 788dcb6bcdb7c7b856f01d1f6064d271a77424a3a8465973873d2fa9ac96dce6 - SKILL.md: SHA-256 ce9398dd0f824d99e0c9948cb2c804922c23f467f3c11a1fed247d86be13f2b2 - docs/board.jpg: SHA-256 a9a1dfea2bba775fbed09868583196d808198e7eb478a09eab4e384696989cb1 - examples/ai-agents.js: SHA-256 aa177f29c1448e4a6e1e2632a0d74b85776a4e61ef668a63efd02a6cebae1b48 - examples/arabic.js: SHA-256 39b68b8317bea0ac70faa9b1e96c7d9272fbd36560d226037d509e571ac746df - examples/languages.js: SHA-256 af4cf27afc1d7986bc4992179fc18660c7d2546b791fedf6603f757579c6384d - examples/shots/clone.jpg: SHA-256 192f27dce0bab51abc30b520310de9c941ceb4441c96b3c8f1ab042b658f89e3 - examples/shots/repo.jpg: SHA-256 d4a0162498acb0e954b5ff99601cb7e9d82351eb5d3604c936542fa01627897d - examples/ui-tutorial.js: SHA-256 585a9d12a08d62903a5b68981eb5a171756ccc7e91ab1b5fbda39ad86b49f080 - scripts/board.html: SHA-256 813670e389255eebd0ef89bd425b1793d2364d08d5332fcd15c36aafc162fa96 - scripts/clip_audio.py: SHA-256 426cea3a38c8941c7cddb5604fc43ad018845294c7a2bdc8ec7fde9cbedf1ac7 - scripts/cutout.swift: SHA-256 ac7ef799acd49c14621baac7a46a39223cc8df4ebb9d4b1b731bf19461bfe83d - scripts/kokoro_tts.py: SHA-256 e39403fdc66535e005ddda2e21de178148f5ad42038d4893f7841610bba2e084 - scripts/package-lock.json: SHA-256 42336d6e6e91ada34f84daa7c22fd732b0716c302c983650bdc54b1d51c465ba - scripts/package.json: SHA-256 aac8ef608526bdd1ef67d562e96d8f861a383110330b1b72614c9d9737a08510 - scripts/render.js: SHA-256 79a30cd77042443c50d428a614d2cd8cc686ba73b1dc633351bfa26315ab8289 - scripts/talking_head_example.sh: SHA-256 223e98d22bd3e37855ae231cb7ec728f58f42470399c9ec0dac5b08e18f89401 - tests/fonts.js: SHA-256 ff07d1b943906a0e80e353d06ef75b917d6bf02322897cda28e14045fb06d71d - tests/languages/ar.js: SHA-256 32a7005b613e80ed7ef77fa2029a9f8079cd20f1d00687cd8116c37242765742 - tests/languages/bn.js: SHA-256 87bdac98edae56a49a934c4e8a42a963e94f0b1418e8f3ae474c1aea32417e4a - tests/languages/el.js: SHA-256 6840188a60884e8848650624ee4f1eab7f731e5387304314b8f288753556af46 - tests/languages/es.js: SHA-256 3b57bfe65e3654fddd3c78e92c2c29a5aa95d579a485f578ff28941a81a3b40d - tests/languages/fa.js: SHA-256 63f3b81420956752656d4bbf8aac9829ca5f67d7a9c53f7df4a232aed8cbebd5 - tests/languages/fr.js: SHA-256 488d2bce33eb809782c5176a0a8de9c95e086f145ff3dce9d1c2d29e29deba04 - tests/languages/he.js: SHA-256 5f1e3c5af4ee3b25c3fd571d85a4b98580572f34fabbe2e80eb98916e95f8eb2 - tests/languages/hi.js: SHA-256 284f0ba16a16bb5a102c148bfeedc01ab646ad7839eb5aa089470cfa0ad6d8fa - tests/languages/ja.js: SHA-256 53ca5ea8228d32418377b96da06e9264a97617d8b03ff05f3afa4fa99e3d2443 - tests/languages/ko.js: SHA-256 a7d06ce77fb4f34f3bf68ecd737a999b8cc7df06b043c406b6406c93dc9b9587 - tests/languages/ru.js: SHA-256 af5e2d8531c836b4c5c35f6fbbed0cd730a533815368f190b140bb3a9ebbe631 - tests/languages/ta.js: SHA-256 d2c0c4c075d9d1f9910f5316b5b5584c1ef167064d1e94a2a50448dbab7dc849 - tests/languages/th.js: SHA-256 a5e795236f51ec683bfa6d1a0651149783d2be5b537e97d66aeda216adedc26e - tests/languages/ur.js: SHA-256 489e50571a3f561e967ab66200e47832c93e9664b89a513173b742cb300d4a93 - tests/languages/zh.js: SHA-256 aa73519d2afa28324d2cf89a13b369c1fc0c91a1224f600fabec1da7f6b5a1af - tests/run.js: SHA-256 bf883fe8b9fcac6f156348cf6c523092a1bf01be27b226e5790c71a3c23fab14 If a file does not match, it changed since the listing was prepared: do not install it yet, tell me what you found and let me decide. 2. Read SKILL.md in full and read the files it drives (scripts/render.js, scripts/board.html, scripts/clip_audio.py, scripts/kokoro_tts.py, scripts/cutout.swift, scripts/talking_head_example.sh, scripts/package.json, the examples and the tests), and tell me in plain words: what the skill does when used, which services it connects to, whether it reads or sends any personal information or keys, and anything that seems unusual. Stop on any red flag and tell me before going further. Confirm these points from the files: - The perimeter holds 37 files: SKILL.md at the root (20,141 bytes, name: khan-explainer, "macOS only"), the renderer and helpers in scripts/ (render.js 13,366 bytes, board.html, clip_audio.py, kokoro_tts.py, cutout.swift, talking_head_example.sh, package.json with one pinned dependency, playwright 1.62.1, and its package-lock.json), examples, tests, README, LICENSE (MIT) and three JPEG images. This is real executable code (Node, Python, Swift, shell), not an instruction-only folder: it runs locally at use time, when I ask for a video. The duplicate skills/khan-explainer/SKILL.md (20,233 bytes) is excluded from this install, as stated in point 1. - Nothing is sent anywhere during installation itself; the only download at install time is the repository from GitHub at the pinned commit. No script is run during this copy install, no key is asked for, and there is no telemetry in the perimeter. - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separate step that only starts when I ask for a video: (i) REAL-AUDIO CLIPS (optional, never by default): to get the audio of a YouTube video or podcast I name, SKILL.md documents running the newest yt-dlp through uvx with `--cookies-from-browser chrome`: yt-dlp reads my Chrome browser session (my Chrome cookies) on my machine to download that video's audio. Tell me out loud before any real-audio run that this step will read my Chrome session, and never run it for a video I did not name. The downloaded audio is then transcribed and cut locally by scripts/clip_audio.py using faster-whisper (uvx downloads yt-dlp and faster-whisper, and the Whisper model, on first use; transcription itself is local). (ii) ELEVENLABS VOICE (optional, only if I activate it): only when a scene I approve declares `eleven: '<voice id>'` and ELEVENLABS_API_KEY is in the environment does scripts/render.js send anything to ElevenLabs: a POST to https://api.elevenlabs.io/v1/text-to-speech/<voice id>/with-timestamps carrying my key in the `xi-api-key` header and, in the body, the scene's spoken text (the whole script in one take), the model id and voice settings. It is a paid third-party service. The key is read from the environment only; flag any other use of it to me. Never enable `eleven` on a scene on your own. (iii) Other disclosed use-time downloads and fetches: the Kokoro free local voice, only if I choose it, needs `pip install kokoro soundfile` and downloads its model (about 330 MB) from Hugging Face (hexgrad/Kokoro-82M) on first use, then runs offline; the draw-over-UI mode captures or fetches the product pages and screenshots I name, with Playwright or with my own logged-in browser when a page needs it (hide private data in the page first, as SKILL.md directs); the first-run environment setup in point 5 downloads the pinned Playwright package from the npm registry and a Chromium browser. - The local-only parts at use time: the default rendering (HTML canvas in Playwright/Chromium, the macOS `say` voice, ffmpeg), the Kokoro voice after its one model download, the faster-whisper transcription, the board layout checks (the contact sheet and per-beat images the renderer prints), and the talking-head cutout (macOS Vision, scripts/cutout.swift built locally with swiftc) all run on this machine and send nothing. On Linux the free voice falls back to espeak-ng and sounds rougher, and SKILL.md asks for the Noto fonts for the scripts written — the skill is built for macOS. - Do not run npm install, npx playwright install, brew install, pip install, uvx, yt-dlp, any render, any test, the cutout build, or any real-audio or ElevenLabs step during this install: setting up the environment, downloading a model, reading my Chrome session or sending a script to ElevenLabs are my decisions, later, when I actually ask for a video, as disclosed above. 3. When I say "yes, install", install it as a skill: copy the whole repository folder (everything except .git and except the duplicate skills/khan-explainer/ folder) into the agent's skills directory, in a folder named "khan-explainer", keeping all 37 files with SKILL.md at its root. A manual clone into ~/.claude/skills/khan-explainer followed by removing .git and the duplicate skills/ folder is the upstream route adapted to this perimeter; any other route is fine only as long as every installed file matches its fingerprint. 4. Verify with no network calls: frontmatter valid (name: khan-explainer), all 37 files in place with matching fingerprints. Do not run render.js, any test or any setup command to verify. 5. Report what was installed, where, and what I still need to do myself (for example: have macOS, Node 20 or newer and ffmpeg on the machine; before first use, run the separate first-run setup inside the installed scripts/ folder — `npm install` then `npx playwright install chromium` — knowing it downloads the pinned Playwright package and Chromium; choose the voice myself for each video — the free local `say` voice by default, the free local Kokoro voice after its pip install and one-time Hugging Face model download, or the paid ElevenLabs voice only if I set ELEVENLABS_API_KEY and put `eleven` on the scene, knowing that then my scene's spoken text and my key go to api.elevenlabs.io as disclosed in point 2; and, only if I ask for a real-audio clip, accept that yt-dlp will read my Chrome session with `--cookies-from-browser chrome` to download the audio of the video or podcast I name, as disclosed in point 2. Using the skill is a separate step that only starts when I ask for it, and the use-time reads, sends and downloads disclosed above happen only then). GitHub is optional: if I have a GitHub account or the gh CLI, you may use it; otherwise public access is fine. Never require it unless it's in the prerequisites above. Rules: don't touch anything outside the temp folder and the install target. If anything looks off, stop and ask me.
Saved to your recent installs. Find it anytime on /connect.
🔒 Security, provenance and what this touches
- It can run commands on your Muse’s computer.
- It can contact outside services over the network.
- It can download and install software packages.
- It can create or modify files.
- It works with an API key or a token that you provide.
What the scan found — excerpts from the install prompt
- runs commands — Prerequisites: macOS only. The skill copy itself needs no account, no API key and no paid service, and the ski · - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separ · - Do not run npm install, npx playwright install, brew install, pip install, uvx, yt-dlp, any render, any test
- makes network calls — - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separ · - Lectures et envois ÉTIQUETÉS à l'usage, divulgués ici avant que l'un d'eux arrive — utiliser le skill est un
- installs packages — Prerequisites: macOS only. The skill copy itself needs no account, no API key and no paid service, and the ski · - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separ · - Do not run npm install, npx playwright install, brew install, pip install, uvx, yt-dlp, any render, any test
- writes files — - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separ · - Lectures et envois ÉTIQUETÉS à l'usage, divulgués ici avant que l'un d'eux arrive — utiliser le skill est un
- uses API keys or tokens — Prerequisites: macOS only. The skill copy itself needs no account, no API key and no paid service, and the ski · - LABELLED sends and reads at use time, disclosed here before any of them happens — using the skill is a separ · - Lectures et envois ÉTIQUETÉS à l'usage, divulgués ici avant que l'un d'eux arrive — utiliser le skill est un
The install prompt below already includes the vetting steps: your agent follows the community checklist before installing anything with executable code. Want more?
Questions
How do I install a build?
Every product page includes a copy-paste install prompt. Paste it into your Muse and it sets the build up for you — no manual configuration.
Where does my money go?
Straight to the seller. Skill Harbor never processes payments: checkout happens on the seller’s own page, usually Stripe.
What does the ✓ next to a creator’s name mean?
It means we confirmed the identity of the person behind the listing. It says nothing about the code itself — always check a build before installing it.