Agent skill · Audited from source

ffmpeg-skill

skill · kajisho5/ffmpeg-skillMIT licenceAudited 23 Oct 2026 · source ac177ce07ae4

★ 2,050pushed today
✕BLOCKGrade D · 69/100 · 10 findings · ac177ce
2,050repo stars · whole kajisho5/ffmpeg-skill

Is it safe? No — BLOCK, grade D (69/100). We read this skill's source at commit ac177ce07ae4 and observed filesystem and shell access and no hard-coded secrets. The audit raised 10 findings, 2 critical or high. What it does: Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text overlays,…

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “ffmpeg-skill (kajisho5/ffmpeg-skill)”. Retrieved 23 Oct 2026. https://modelsatlas.com/skills/kajisho5/ffmpeg-skill

Blocked. The page stays public so you can check this skill if someone recommended it to you. The audit found 2 critical or high findings, starting with “Prompt injection” in CHANGELOG.md:1050. Do not install it without reading them.

Trust audit

Audit 0.4.1 · source read 23 Oct 2026

Trust score69/100✕BLOCK D
0 critical2 high0 medium7 low1 info

BLOCK means the audit found something that could harm you or your machine. Grade D is shared by 642 of 14,816 audited skills.

What the source does

  • FilesystemDeclared5 observations
  • NetworkNone observedNo outbound calls in the source
  • ShellDeclared1 observation
  • DependenciesPinnedNothing floats
  • SecretsNone foundNo keys in source

Five audit layers

LayerWhat we checkResultFindings
L0 ProvenanceRepo owner, licence, archive status, activityPASS1
L1 Static sourceSecrets, path traversal, supply chain, hidden codePASS7
L2 InstructionsPrompt injection, authority framing, hidden directivesFAIL2
L3 InventoryThe files and declarations match the sourcePASS0
L4 SandboxRun in isolation and watch behaviourSKIPPED why0

Gates applied: no behavioural pass.

Findings (10)

HIGHPrompt injectionprompt.zero_width · CHANGELOG.md:1050
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
- **A ZWJ no longer starts an emoji cluster.** U+200D ZWJ and U+200C ZWNJ are ordinary Indic/Persian orthography, so `क्ष` (ka + virama + ZWJ + ssa) was detected as the emoji cluster `94d-200d`: a Hin
Why
invisible characters in instruction text
Fix
strip non-printing characters
HIGHPrompt injectionprompt.zero_width · references/gotchas.md:227
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
U+200D ZWJ and U+200C ZWNJ are ordinary Indic/Persian orthography (`क्ष` is
Why
invisible characters in instruction text
Fix
strip non-printing characters
LOWCode injectioncode.dynamic_import · tests/test_accel.py:592
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
module = importlib.import_module(module_name)
Why
No further detail recorded for this rule.
Fix
—
LOWCode injectioncode.dynamic_import · tests/test_accel.py:735
F-02 Code injectionCWE-78 · CWE-94 · CWE-95Layer L1
module = importlib.import_module(module_name)
Why
No further detail recorded for this rule.
Fix
—
LOWInsecure cryptocrypto.weak_hash · scripts/batch.py:52
F-09 Insecure cryptoCWE-327 · CWE-338Layer L1
h = hashlib.sha1()
Why
No further detail recorded for this rule.
Fix
—
LOWInsecure cryptocrypto.weak_hash · scripts/batch.py:75
F-09 Insecure cryptoCWE-327 · CWE-338Layer L1
return hashlib.sha1((json.dumps(recipe, sort_keys=True) + "\0" + project_content).encode()).hexdigest()[:12]
Why
No further detail recorded for this rule.
Fix
—
LOWInsecure cryptocrypto.weak_hash · scripts/render.py:684
F-09 Insecure cryptoCWE-327 · CWE-338Layer L1
return hashlib.sha1(json.dumps(payload, sort_keys=True, ensure_ascii=False).encode()).hexdigest()
Why
No further detail recorded for this rule.
Fix
—
LOWFilesystem / pathfs.traversal · tests/test_orchestration.py:1690
F-05 Filesystem / pathCWE-22 · CWE-59Layer L1
for step in ([str(evil)], ["../../../../tmp/does_not_matter.py"]):
Why
No further detail recorded for this rule.
Fix
—
LOWObfuscation / stealthobf.decode_call · scripts/cut.py:668
F-07 Obfuscation / stealthCWE-506 · CWE-94Layer L1
raw += bytes.fromhex(rest.strip().split("  ")[0].replace(" ", ""))
Why
No further detail recorded for this rule.
Fix
—
INFOInventory / provenanceinv.oversize · assets/demo.gif
F-13 Inventory / provenanceCWE-1104Layer L0
assets/demo.gif
Why
1647658 bytes not read
Fix
—

Audit 0.4.1 · source sha ac177ce07ae4 · 23 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • Publisherkajisho5 GitHub userOwner of the repository this skill is read from
  • Source folderkajisho5/ffmpeg-skillThe exact folder we audited
  • LicenceMITAs the repository states it
  • Commit pinned for this verdictac177ce07ae4A new audit runs when the source changes
  • Repository statusNot archivedPushed today
  • Sandboxed runNot runSkills are read, not executed; layer L4 is skipped

What it tells the agent

Full source on GitHub ↗

Its description: Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text overlays,…

---
name: ffmpeg-skill
description: 'Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text overlays, lower-thirds and titles, silence removal, multicam and external-mic sync, loudness normalisation, HDR/Dolby Vision to SDR, LUTs, background music with ducking, platform exports (YouTube, Reels, TikTok, X), compliance checks, scene detection and highlight reels, contact sheets to inspect results, and whole-edit project files. Use this skill whenever the user mentions a video or audio file (mp4, mov, mkv, wav, m4a), footage, a clip, captions, subtitles, a reel or short, YouTube/Instagram/TikTok delivery, LUFS, sync, transcoding, ffmpeg, or asks to make something "60 seconds", "vertical", "louder", "captioned" — even when they do not say "edit". Python 3.10+ standard library only (3.9 deprecated), no cloud, no API keys.'
---

# ffmpeg-skill

Scripts live in `scripts/` next to this file; run them with `python3 <skill-dir>/scripts/<name>.py`, and delivery templates in `templates/`. This file is enough to do a job: the table below routes the request, and `--help` on the script about to run is the cheapest full flag list. A reference file costs as much as this one; open one only for a question you have: `references/scripts.md` (every flag of all 42 scripts), `references/devices.md` (iPhone HDR, GoPro, DJI, screen recordings, Zoom), `references/gotchas.md` (the long form of the one-line rules at the end). MCP: `tools/list` shows only the core 12 by default; the other 30 (per this table) stay callable by name via `tools/call`, described by `contract --json`; set `FFMPEG_SKILL_MCP_FULL=1` for all 42.

Shared flags (every script): `--dry-run`; `--json` (output path, its probe, the commands run); `--json-brief` (status/output/verified + a `summary`; prefer on writing steps); `--fast` (preview quality); `--progress` (percent/ETA); `--timeout SECONDS` (`kind: timeout`, default 1800); `--overwrite` (step 7); `--plan FILE` (a dry run `render.py FILE` runs later; refuses if an input changed). Re-encoding tools also take `--hw` (Apple Silicon GPU, big files; `FFMPEG_SKILL_HW=1` = default, not export), `--codec h264|hevc|av1|prores` and `--quality N`: unset, SDR is x264 (`cut.py --keep-hevc`: HEVC source stays HEVC), HDR is x265 Main10; `prores` needs `-o NAME.mov`, `h264` refuses HDR (`color.py --to-sdr` first).

Writing tools run nothing under `--dry-run`; the measuring tools (`probe`, `check`, `sync`, `multicam`, `scenes`, `cropdetect`, `report`, `silence`, `loudness`, `stabilize`; `overlay` for a multi-line `--text` on FFmpeg 8.0-8.1.0) may still run ffmpeg/ffprobe, skipping artifacts/side files (`--edl`, `--sheet`, a generated `.ass`); `verify` ignores the flag. Per tool: `contract --json` `dry_run`.

## Workflow (in this order)

0. **Environment, only on failure.** Never start a job with `doctor`: a broken machine fails with `kind: missing_tool` or an ffmpeg error naming the filter/encoder. Run `python3 <skill-dir>/scripts/_contract.py doctor` (or `npx ffmpeg-skill doctor`) after such a failure, or when asked what the machine can do: read `ok`/`usable`, report the missing capability. `contract --json`'s tool schema is for a *planning* agent, not this workflow.
1. **Probe what you must plan from.** Run `probe.py` on each input you plan from — duration, fps, resolution, codecs, channels, `variable_frame_rate_suspected` — and whenever the user asks about a file. No separate probe before every edit: every writing tool's `--json` already carries its input and a probe of the output. Plan from real numbers, never assumptions.
2. **Prefer lossless.** If the request can be met without re-encoding (plain cuts on keyframes, remuxing, audio-only changes), do not re-encode. `cut.py` and `loudness.py` stream-copy video by default; `--accurate` on `cut.py` only for frame-exact cuts.
3. **Plan with `--dry-run --json`, then execute.** Trust `--json`, not a dry run's summary line, for any number in the plan (a dimension there can be a placeholder). Use before long encodes, to report facts. Never point `-o` at a file you did not create in this job unless the user asked for it to be replaced; pass `--overwrite` only then.
4. **Chain in a sensible order.** A delivery request with no other editing is one template run (`render.py --template NAME INPUT`), not a hand-built chain. Otherwise: colour (HDR→SDR / LUT) → cut → join → silence → fit → caption/overlay → sync → audio → loudness → export. Frame changes before captions, so text is sized for the final frame. Re-encode as few times as possible: intermediates at CRF 18, `export.py` last. **Three or more steps: `render.py` with a project.json.**
5. **Check the deliverable.** Before reporting, run `check.py OUTPUT --platform X` for the destination named (a template run already does). Format rows (codec, pixel format, size, true peak, colour tags, VFR) are safe to fix. Judgement rows change content: duration (cut loses material), aspect (crop loses edges), fps (drops motion), loudness (ambience must not be boosted) — fix only when the request implies the answer, else state the choice and its cost. Mention WARNs; do not chase them.
6. **Verify the output.** Confirm duration, resolution, fps and audio match the request, from the writing tool's `--json`/`--json-brief` probe or `probe.py`, and report those numbers ("final.mp4: 59.98 s, 1080x1920, 30 fps, AAC stereo"). A step is done only when the script exited 0 and the output probes as expected: a non-zero exit, a missing or empty file, or a probe that contradicts the request is a failure reported with the script's error message.
7. **Keep the user's originals.** Never overwrite the source; write new files next to input or where asked. An existing output path is refused (`kind: input`); `--overwrite` is the one way to say "yes, replace it".
8. **Look at the picture.** Whenever the picture

Excerpt, first 6,000 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.

Install

Pinned to the audited commit ac177ce

pip install
uvx [email protected] format --check .      # exactly what the runner would install
uv venv .venv --python 3.12 --seed
uv pip install --python "$PWD/.venv/bin/python" -e ".[dev,web]"
uv run --no-project --with somelib python -c "import somelib; print(somelib.Thing())"
uv build && unzip -l dist/*.whl

Commands as the repository documents them: shown, never run by us. Our verdict covers commit ac177ce07ae4 only.

Works in which agents?

What its own text says, not a test

AgentStatusMore
Claude CodeMentioned in its text, not testedSkills for Claude Code · About Claude Code
Claude DesktopMentioned in its text, not testedSkills for Claude Desktop · About Claude Desktop
CodexMentioned in its text, not testedSkills for Codex · About Codex
CursorMentioned in its text, not testedSkills for Cursor · About Cursor
“Mentioned” means the skill’s text names the agent. We have not run it there.

Audit history

Every audit, every source change

  1. ✕BLOCK D 69 / 100

    first audit · source ac177ce07ae4

README badge

For maintainers · shows the latest audit

ModelsAtlas: BLOCK DMODELSATLASBLOCK · D
[![ModelsAtlas: BLOCK D](https://modelsatlas.com/skills/kajisho5/ffmpeg-skill/badge.svg)](https://modelsatlas.com/skills/kajisho5/ffmpeg-skill/)

The badge shows our verdict and grade for this skill, and links back to this page. It changes when the audit does.

opencode-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to the OpenCode CLI as a background implementer, then review its diff and land it yourself. Use this whenever the user wants to hand implementation work to OpenCode — phrasings like "have OpenCode…

★ 2.5kGrade B
kimi-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to the Kimi Code CLI (`kimi`) as a background implementer, then review its diff and land it yourself. Use this whenever the user wants to hand implementation work to Kimi - phrasings like "have…

★ 2.5kGrade B
grok-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to the Grok Build CLI as a background implementer, then review its diff and land it yourself. Use this whenever the user wants to hand implementation work to Grok — phrasings like "have Grok do…

★ 2.5kGrade B
codex-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to the OpenAI Codex CLI as a background implementer, then review its diff and land it yourself. Use this whenever the user wants to hand implementation work to Codex — phrasings like "have Codex…

★ 2.5kGrade B
claude-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to a separate Claude Code CLI process or another Claude session as an implementer, then review its diff and land it yourself. Use only when the user explicitly asks to delegate implementation to…

★ 2.5kGrade B
agy-delegate✓SAFE

amelnagdy/delegate-skills

Delegate a coding task to the Google Antigravity CLI (`agy`) as a background implementer, then review its diff and land it yourself. Use this whenever the user wants to hand implementation work to Antigravity or agy -…

★ 2.4kGrade B

Add this badge to your README

[![ModelsAtlas: BLOCK D](https://modelsatlas.com/skills/kajisho5/ffmpeg-skill/badge.svg)](https://modelsatlas.com/skills/kajisho5/ffmpeg-skill/)

Questions about ffmpeg-skill

What does the ffmpeg-skill skill do?
Local video editor for coding agents: 42 FFmpeg tools with a machine-readable contract and an MCP server, for Claude Code, Cursor and Codex. Cut, captions, reframe, loudness, platform exports. No cloud, no API keys.
Is ffmpeg-skill safe to install?
No — not without reading the findings first. The audit graded it D (69/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What can ffmpeg-skill access on my machine?
The audit observed that it runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: none found.
Which assistants does ffmpeg-skill work with?
Its documentation mentions claude-code, claude-desktop, codex and cursor. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (ac177ce07ae4), read on 2026-10-23. The repository is watched, and a new audit runs when it changes — this is the first audit.

Sources

Spotted something wrong? Report a correction · Methodology

Keep going in your AI

Opens with this page as the source. We add nothing else to the prompt.