auto-captions-skill@1.0.0
VERIFIED· install onlyPublisher claims: "Auto captions for videos, made on the user's own computer by their AI agent: transcribes speech with a time for every word (free local Whisper by default, or the user's own Groq or Deepgram key, or existing subtitles), proofreads names and numbers, burns creator-style captions into the video (8 presets: word highlight, bold, pill, reveal, two-line, clean subtitles, minimal, one word) in any shape (9:16, 4:5, 1:1, 16:9, crop or blurred background), writes SRT, VTT and a transcript, translates the captions into other languages with the same timing, shows a review sheet with each app's buttons drawn on, and posts or schedules the captioned videos to TikTok, Reels, Shorts, LinkedIn, Facebook, X, Threads and Bluesky through WoopSocial after a yes. Use when someone says "auto captions", "add captions", "add subtitles to my video", "caption generator", "subtitle generator", "burn in subtitles", "TikTok captions", "make an SRT", "translate my subtitles" or "caption this folder of videos". No watermark, no per-minute limits, no paid API needed. Standalone." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-11 and scored it 82/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
subprocess.run(["curl", "-sfL", url, "-o", part], check=False, timeout=120)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."(then open a new terminal). Linux: sudo apt install ffmpeg (or your distro's package).")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.python3 scripts/render.py job.json --only speed --outputs vertical --lang es --forceFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."--no-binary pillow pillow. Linux: sudo apt install libraqm0 (or libfribidi0). Windows: use "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.r = subprocess.run(["ffprobe", "-v", "error", "-show_streams", "-show_format", "-of", "json", path],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/render.py job.json # render every video x output x languageFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.r = subprocess.run(["ffmpeg", "-hide_banner", f"-{kind}"], capture_output=True, text=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.python3 scripts/post_plan.py post.json --media media.json # fill in uploaded mediaIdsFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why."new terminal). Linux: sudo apt install ffmpeg")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Writes plan.md and requests/captions/<video>.<account>.json next to post.json. media.json maps eachFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.3. `python3 <skill>/scripts/render.py captions.json` renders every video, output and languageFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.ap.add_argument("--media", help="media.json: {video file: mediaId} after uploading")Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…n captions with review; never restarts during a script; after render writes post.json for tomorrow 18:00 in the user's time zone, says the plan uses 3 accounts and the free plan covers 2, runs post_plan.py, uploads once, validates, shows p…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.1. Write `post.json` (`references/posting.md`) from what you already know: one account per placeFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…check_setup, asks only what it can't see (names to spell, look), writes captions.json with a 9:16 output, transcribes, runs fix.py --report and reads every line, writes fixes.json, sho…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.3. `python3 <skill>/scripts/styles.py captions.json --at <a second with speech>` puts every styleFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.out = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True).stdout.split("\n")[0]Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.<id>.<lang>.txt a plain transcript (accessibility, show notes, the post text)Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", errors="replace")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.session.json is the JSON returned by `media_uploads_create_session`. It must containFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.