Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. Use when assembling multi-part media into a single output.
npx skills add https://github.com/athola/claude-night-market --skill media-composition
Combine multiple media assets (GIFs, videos, images) into composite
outputs for detailed tutorials and documentation.
This skill orchestrates the combination of separately generated media
assets into unified outputs. It reads manifest files that define
components and their composition rules, validates all inputs exist,
and executes FFmpeg commands to produce the final composite media.
The following tools must be available on PATH before using this skill:
ffmpeg: media composition and encodingyq: YAML manifest parsingRun ffmpeg -version and yq --version to verify availability.
- Parse composition manifest file
- Validate all component outputs exist
- Determine composition layout and parameters
- Execute FFmpeg composition command
- Verify combined output file created
- Report composition metrics (file size, dimensions)
Manifests define the components to combine and how to arrange them:
# Example manifest: tutorials/mcp.manifest.yaml
name: mcp
title: "MCP Server Integration"
components:
- type: tape
source: mcp.tape
output: assets/gifs/mcp-terminal.gif
- type: playwright
source: browser/mcp-browser.spec.ts
output: assets/gifs/mcp-browser.gif
requires:
- "skrills serve"
combine:
output: assets/gifs/mcp-combined.gif
layout: vertical
options:
padding: 10
background: "#1a1a2e"
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| name | string | Yes | Identifier for the composition |
| title | string | No | Human-readable title |
| components | array | Yes | List of media components to combine |
| components[].type | string | Yes | Source type: tape, playwright, static |
| components[].source | string | Yes | Path to source file |
| components[].output | string | Yes | Path to generated output |
| components[].requires | array | No | Commands to run before generation |
| combine.output | string | Yes | Path for combined output |
| combine.layout | string | Yes | Layout mode (see table below) |
| combine.options | object | No | Layout-specific options |
# Read and validate manifest structure
yq eval '.' manifest.yaml
# Extract component outputs
yq eval '.components[].output' manifest.yaml
# Check all required files exist
for output in $(yq eval '.components[].output' manifest.yaml); do
if [[ ! -f "$output" ]]; then
echo "ERROR: Missing component: $output"
exit 1
fi
done
Based on the layout specified in the manifest, execute the appropriate
FFmpeg command.
# Verify output exists and has content
if [[ -f "$output" && -s "$output" ]]; then
echo "Composition successful: $output"
ls -lh "$output"
else
echo "ERROR: Composition failed"
exit 1
fi
Stack GIFs/videos top to bottom:
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v][1:v]vstack=inputs=2" \
-y output.gif
With padding between:
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2" \
-y output.gif
Stack GIFs/videos side by side:
ffmpeg -i left.gif -i right.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2" \
-y output.gif
Play GIFs/videos one after another:
# Create concat list file
cat > concat_list.txt << EOF
file 'first.gif'
file 'second.gif'
file 'third.gif'
EOF
# Concatenate
ffmpeg -f concat -safe 0 -i concat_list.txt \
-y output.gif
ffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \
-filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2" \
-y output.gif
ffmpeg -i top.gif -i bottom.gif \
-filter_complex "color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300" \
-y output.gif
| Layout | Description | Options |
|--------|-------------|---------|
| vertical | Stack top to bottom | padding, background, align |
| horizontal | Stack left to right | padding, background, align |
| sequential | Play in order | transition, duration |
| grid | N x M grid arrangement | rows, cols, padding |
| overlay | Layer on top of each other | position, opacity |
| pip | Picture-in-picture | corner, scale, margin |
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| padding | int | 0 | Pixels between components |
| background | string | "black" | Background color (hex or name) |
| align | string | "center" | Alignment: left, center, right |
| transition | string | "none" | Transition type: fade, wipe, none |
| scale | float | 0.25 | Scale factor for PiP |
| corner | string | "br" | PiP corner: tl, tr, bl, br |
name: plugin-demo
components:
- type: tape
source: demo.tape
output: terminal.gif
- type: playwright
source: browser.spec.ts
output: browser.gif
combine:
output: demo-combined.gif
layout: vertical
options:
padding: 5
background: "#0d1117"
name: before-after
components:
- type: static
source: before.gif
output: before.gif
- type: static
source: after.gif
output: after.gif
combine:
output: comparison.gif
layout: horizontal
options:
padding: 10
name: pip-demo
components:
- type: tape
source: main.tape
output: main.gif
- type: playwright
source: overlay.spec.ts
output: overlay.gif
combine:
output: pip-demo.gif
layout: pip
options:
corner: br
scale: 0.3
margin: 20
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Improves the quality of images, especially screenshots, by enhancing resolution, sharpness, and clarity. Perfect for preparing images for presentations, documentation, or social media posts.
Downloads videos from YouTube and other platforms for offline viewing, editing, or archival. Handles various formats and quality options.
Lightweight WSI tile extraction and preprocessing. Use for basic slide processing tissue detection, tile extraction, stain normalization for H&E images. Best for simple pipelines, dataset preparation, quick tile-based analysis. For advanced spatial proteomics, multiplexed imaging, or deep learning pipelines use pathml.
Microscopy data management platform. Access images via Python, retrieve datasets, analyze pixels, manage ROIs/annotations, batch processing, for high-content screening and microscopy workflows.
Python library for working with DICOM (Digital Imaging and Communications in Medicine) files. Use this skill when reading, writing, or modifying medical imaging data in DICOM format, extracting pixel data from medical images (CT, MRI, X-ray, ultrasound), anonymizing DICOM files, working with DICOM metadata and tags, converting DICOM images to other formats, handling compressed DICOM data, or processing medical imaging datasets. Applies to tasks involving medical image analysis, PACS systems, radiology workflows, and healthcare imaging applications.
This skill should be used when working with pre-trained transformer models for natural language processing, computer vision, audio, or multimodal tasks. Use for text generation, classification, question answering, translation, summarization, image classification, object detection, speech recognition, and fine-tuning models on custom datasets.
Take athola/media-composition from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.