Transform, convert, watermark, and optimize existing images with deterministic Pillow operations.
Design & media
mediaproc
Process video, audio, and images with allow-listed tools in a work-directory-confined SSH container.
What it does
Process video, audio, and images on a trusted remote instance using ffmpeg, ffprobe, SoX, and ImageMagick. Files are uploaded, handled inside a work-directory-confined container, and downloaded through an SSH wrapper. A server-enforced allow-list permits only the documented media tools and scoped file operations, with no interactive shell or command chaining.
When to use it
- Transcoding video and extracting audio
- Normalizing or converting audio files
- Resizing images and generating thumbnails
- Inspecting media metadata
The skill document
mediaproc
Locked-down media processing over SSH. Built on lockbox — no shell access, no injection, no bullshit.
For installation and deployment, see references/setup.md.
Security model
mediaproc is not a general-purpose shell, and scripts/mediaproc.sh is not
arbitrary remote code execution even though it forwards a free-form-looking command
string. The instance runs inside a lockbox-
hardened container, and this skill only ever talks to an instance you (or your
operator) already run and trust:
- Key-auth only — SSH accepts public-key auth only (no passwords), connecting as a restricted user. There is no interactive shell and no PTY.
- Server-side enforced allow-list, not documentation —
scripts/mediaproc.shpasses its argument through to the SSH channel as-is, but the remote lockbox dispatcher is what decides what runs, and it only ever executes the fixed set documented below:ffmpeg,ffprobe,sox,soxi,convert,identify,magick, plus lockbox's built-in, scoped file operations. This is an enforced allow-list on the server, not a client-side convention — the wrapper cannot be used to run anything outside that set. Any other command name is refused before execution; the remote never spawns a shell, so there is no shell-injection surface and no way to chain (;,|,&&, backticks, etc.) into a second command. - Work-dir confined — every path resolves under the instance work directory
(
/work); traversal is blocked. The sandbox cannot read or write your host filesystem. - Consumer-only — this skill moves files to/from a running instance and runs the whitelisted media tools on them. It never provisions, escalates, or installs anything on your machine (server setup is a separate, operator-side step — see setup.md).
- You must still trust the configured host —
MEDIAPROC_HOST/MEDIAPROC_PORTpoint at a specific instance. The allow-list constrains what runs, not where; ifMEDIAPROC_HOSTis pointed at an instance you don't control, that operator still sees every file youput/getand every command you send. Only point this skill at a mediaproc instance you or a trusted operator run.
SSH Wrapper
Use scripts/mediaproc.sh for all commands. It handles host, port, and host key acceptance via MEDIAPROC_HOST and MEDIAPROC_PORT env vars.
The `` argument looks free-form but is not arbitrary execution: the
wrapper does no shell evaluation of it — it passes the whole string as a single
argument over the SSH channel — and it is the remote lockbox dispatcher that
enforces the allow-list from the Security model above, server-side, on every
invocation. There is no local or remote shell in the loop, so there's no
injection/chaining surface (;, |, &&, backticks, etc. are inert; the
dispatcher just refuses anything that isn't the fixed command name it expects).
scripts/mediaproc.sh [args]
scripts/mediaproc.sh < input_file
scripts/mediaproc.sh > output_file
Media Tools
| Command | Description |
|---|---|
ffmpeg | Video/audio encoding, transcoding, filtering |
ffprobe | Media file analysis |
sox | Audio processing |
soxi | Audio file info |
convert | Image conversion/manipulation (ImageMagick) |
identify | Image file info (ImageMagick) |
magick | ImageMagick CLI |
Upload, Process, Download
# Upload
scripts/mediaproc.sh "put input.mp4" < input.mp4
# Transcode
scripts/mediaproc.sh "ffmpeg -i /work/input.mp4 -c:v libx264 /work/output.mp4"
# Download result
scripts/mediaproc.sh "get output.mp4" > output.mp4
# Clean up
scripts/mediaproc.sh "remove-file input.mp4"
scripts/mediaproc.sh "remove-file output.mp4"
Video Operations
# Get video info as JSON
scripts/mediaproc.sh "ffprobe -v quiet -print_format json -show_format -show_streams /work/video.mp4"
# Apply frei0r glow effect
scripts/mediaproc.sh "ffmpeg -i /work/in.mp4 -vf frei0r=glow:0.5 /work/out.mp4"
# Extract audio from video
scripts/mediaproc.sh "ffmpeg -i /work/video.mp4 -vn -acodec libmp3lame /work/audio.mp3"
# Create thumbnail from video
scripts/mediaproc.sh "ffmpeg -i /work/video.mp4 -ss 00:00:05 -vframes 1 /work/thumb.jpg"
Audio Operations
# Convert audio format
scripts/mediaproc.sh "sox /work/input.wav /work/output.mp3"
# Get audio info
scripts/mediaproc.sh "soxi /work/audio.wav"
# Normalize audio
scripts/mediaproc.sh "sox /work/input.wav /work/output.wav norm"
Image Operations
# Resize image
scripts/mediaproc.sh "convert /work/input.png -resize 50% /work/output.png"
# Create thumbnail
scripts/mediaproc.sh "convert /work/input.jpg -thumbnail 200x200 /work/thumb.jpg"
# Get image info
scripts/mediaproc.sh "identify /work/image.png"
File Operations
All paths relative to the work directory. Traversal blocked.
Destructive. remove-file, remove-dir, and remove-dir-recursive
permanently delete data in the remote work directory — there is no trash/undo.
remove-dir-recursive deletes an entire subtree in one call and is especially
dangerous. Only run these after explicit user confirmation of the exact path.
| Command | Description |
|---|---|
put | Upload file from stdin |
get | Download file to stdout |
list-files [--json] | List directory |
remove-file | Delete a file |
create-dir | Create directory |
remove-dir | Remove empty directory |
remove-dir-recursive | Remove directory recursively |
move-file | Move or rename |
copy-file | Copy a file |
file-info | Get file metadata as JSON |
file-exists | Check if file exists (true/false) |
file-hash | Get SHA256 hash |
disk-usage [path] | Get bytes used |
search-files | Glob search |
append-file | Append stdin to a file |
# List files
scripts/mediaproc.sh "list-files"
# List as JSON (size, modified, isDir, permissions)
scripts/mediaproc.sh "list-files --json"
# List subdirectory
scripts/mediaproc.sh "list-files project1"
# File operations
scripts/mediaproc.sh "create-dir project1"
scripts/mediaproc.sh "move-file old.mp4 new.mp4"
scripts/mediaproc.sh "copy-file input.mp4 backup.mp4"
scripts/mediaproc.sh "file-info video.mp4"
scripts/mediaproc.sh "file-exists video.mp4"
scripts/mediaproc.sh "file-hash video.mp4"
scripts/mediaproc.sh "search-files '*.mp4'"
scripts/mediaproc.sh "disk-usage"
scripts/mediaproc.sh "remove-dir-recursive project1"
Plugins
- frei0r — Video effect plugins (used via
-vf frei0r=...) - LADSPA — Audio effect plugins: SWH, TAP, CMT (used via
-af ladspa=...) - LV2 — Audio plugins (used via
-af lv2=...)
Fonts
2200+ fonts included covering emoji, CJK, Arabic, Thai, Indic, monospace, and more. Custom fonts can be mounted to /usr/share/fonts/custom.
Questions people ask
- Which media operations are supported?
- It can encode, transcode, filter, and inspect video or audio; extract audio and video thumbnails; normalize or convert audio; and resize, convert, thumbnail, or inspect images. frei0r video effects and LADSPA or LV2 audio plugins are also available through ffmpeg.
- Can it execute arbitrary shell commands on the remote host?
- No. The remote lockbox dispatcher allows only ffmpeg, ffprobe, sox, soxi, convert, identify, magick, and documented scoped file operations; there is no shell or PTY, and chaining syntax is refused or inert.
- How are files and access secured?
- SSH uses public-key authentication with a restricted user, while all paths stay under the instance's /work directory and traversal is blocked. You must use an instance run by you or a trusted operator, because its operator can see uploaded files and submitted commands.
Related skills
Generate and edit images, videos, and music through VAP Media API, then return the completed media URL.
Generate and edit images, videos, and music through VAP Media API, then return the completed media URL.
Upload an image and receive a public CDN URL with retention based on its size and selected tier.
Run, diagnose, size, and update host-based services without dropping avoidable requests.
Turn written replies into concise, normalized text that TTS engines can read naturally.