Twelve skills for getting content in, getting text out, and knowing what is left. Download YouTube videos, podcast feeds and web articles; extract audio, OCR'd text and transcripts; pull frames out of video; and drive a whole tree with one command.
The skills are model-invoked — you describe what you want, you do not address
them by name. "Download this talk into ./Videos and transcribe it" reaches
download-youtube-videos and then transcribe-audio on its own.
In a Claude Code session:
/plugin marketplace add marcelerz/Claude
/plugin install media-toolkit@marcelerz
The first line registers this repository as a marketplace named marcelerz; the
second installs the plugin from it. From a terminal the same thing reads:
claude plugin marketplace add marcelerz/Claude
claude plugin install media-toolkit@marcelerzAdd --scope project or --scope local to install somewhere other than your user
scope. To confirm it landed:
claude plugin list
claude plugin details media-toolkit # component inventory and projected token costInstalling the plugin does not install ffmpeg, yt-dlp, whisper or tesseract. The skills are wrappers around tools that must already be on the machine. Ask Claude to check my media tools as the first thing you do — see Requirements.
Updating takes two commands, and the order matters:
/plugin marketplace update marcelerz
/plugin update media-toolkit
The first refreshes the marketplace's cached clone of this repository. The second reinstalls the plugin from that cache. Running only the second updates nothing — and it reports success, because the cache still advertises the version you already have.
Then restart Claude Code; an update does not apply to the running session.
Terminal equivalents:
claude plugin marketplace update marcelerz
claude plugin update media-toolkitclaude plugin marketplace update with no name refreshes every marketplace you
have added.
To back out:
/plugin uninstall media-toolkit
/plugin marketplace remove marcelerz
The fastest way to find out where you stand is to ask:
check my media tools
which runs the check-media-tools skill and prints every dependency, whether it is
present, which skills need it, and the exact command that installs it. It is
read-only; it never installs anything unless you ask it to.
| Dependency | Needed by | Level | macOS | Debian/Ubuntu |
|---|---|---|---|---|
curl, python3 |
download-podcast, download-webpage, build-manifest | required | preinstalled | preinstalled |
yt-dlp |
download-youtube-videos | required | brew install yt-dlp |
pip3 install --user yt-dlp |
ffmpeg (+ ffprobe) |
5 skills | required | brew install ffmpeg |
apt-get install ffmpeg |
whisper-cli |
transcribe-audio, process-videos, extract-all | required | brew install whisper-cpp |
build from source |
| a ggml model | transcribe-audio, process-videos, extract-all | required | see below | see below |
poppler |
extract-text | required | brew install poppler |
apt-get install poppler-utils |
tesseract |
extract-text, extract-video-frames | required | brew install tesseract |
apt-get install tesseract-ocr |
| language packs | extract-text | optional | brew install tesseract-lang |
apt-get install tesseract-ocr-deu … |
pandoc |
extract-text, download-webpage | required | brew install pandoc |
apt-get install pandoc |
trafilatura |
download-webpage | optional | pip3 install --user trafilatura |
same |
defusedxml |
download-podcast | optional | pip3 install --user defusedxml |
same |
tesseract alone is not enough. A stock install carries only eng, while
extract-text defaults to eng+deu+nld+fra. The language packs come from
tesseract-lang (macOS) or per-language tesseract-ocr-* packages (Debian).
The whisper model is a separate download and there is no package for it:
mkdir -p ~/models && curl -L -o ~/models/ggml-small.en.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.en.binSet MODELS_DIR to keep models elsewhere. Other sizes (tiny.en, medium.en, or
the multilingual variants without .en) follow the same URL pattern and are
selected with -m.
To see the commands for whatever your machine is missing, without running them:
plugin/skills/check-media-tools/scripts/check-media-tools.sh --installAdd --yes to actually execute them.
| # | Skill | Does |
|---|---|---|
| 1 | download-youtube-videos |
Videos into a folder via yt-dlp, optionally with subtitles or a whole playlist |
| 2 | download-podcast |
Episodes from an RSS feed, named YYYY-MM-DD Title.mp3 |
| 3 | download-webpage |
An article as clean text or markdown, boilerplate stripped |
| 4 | extract-audio |
The audio track out of video, to mp3/m4a/wav/flac/opus |
| 5 | extract-text |
Text from PDFs, scans, images and documents, with adaptive OCR |
| 6 | transcribe-audio |
Speech to .srt/.txt/.vtt with whisper.cpp |
| 7 | extract-video-frames |
Stills by interval, count or scene change, optionally OCR'd |
| 8 | process-videos |
Per video: audio, transcript, its own folder and a README |
| 9 | extract-all |
Walks a whole tree and routes every file to the right skill |
| 10 | summarize-transcripts |
A real outline and timestamped key moments from a transcript |
| 11 | build-manifest |
Coverage report: what is extracted, missing, or stale |
| 12 | check-media-tools |
Which dependencies are installed, and how to install the rest |
Skills 1–3 acquire, 4–7 extract, 8–9 compose, 10–12 report and assist.
.claude-plugin/marketplace.json ← the marketplace; points at ./plugin
plugin/
.claude-plugin/plugin.json ← the plugin manifest
skills/<name>/
SKILL.md ← frontmatter + instructions
README.md ← the detail
scripts/<name>.sh ← the tool
tools/ ← consistency checkers, not shipped
docs/skill-backlog.md ← ideas not built
Everything under plugin/ ships to every user who installs this. Do not create a
commands/, agents/ or hooks/ directory there — those are plugin component
paths and would ship too. Repository tooling stays in tools/ at the root.
python3 tools/check-all.py
claude plugin validate . --strict
claude plugin validate ./plugin/.claude-plugin/plugin.json --strict
claude plugin validate ./plugin/skills --strictThe three validate calls check manifest schemas. They are much weaker than
they look — see ARCHITECTURE.md.
tools/check-all.py is what actually enforces this repository's conventions.
The version appears in both .claude-plugin/marketplace.json and
plugin/.claude-plugin/plugin.json and the two must agree. Bump both, commit,
then:
claude plugin tag ./plugin --dry-run
claude plugin tag ./plugin --push -m "media-toolkit %s"claude plugin tag validates that the manifests agree before creating the
media-toolkit--v<version> tag. tools/check-docs.py enforces the same rule at
commit time, so a mismatch fails before it reaches a tag.
Users see a new version only after the default branch moves, so the order is: bump both manifests → commit → push → tag.
MIT — see LICENSE.