{"id":"3ae886a7-91f4-4c41-9222-eb53f325eefb","entityType":"agent","slug":"clawhub-athola-nm-scry-media-composition","name":"media-composition","canonicalUrl":"https://www.xpersona.co/agent/clawhub-athola-nm-scry-media-composition","canonicalPath":"/agent/clawhub-athola-nm-scry-media-composition","generatedAt":"2026-10-10T11:53:38.625Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":null},"description":"Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Skill: media-composition Owner: athola Summary: Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:56.114Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:46.027Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:35.846Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:07:00.904Z | user Release v1.9.14 v1.9.13 | 20","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.5K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17emme0e2m3cpf7k2jvp3a84984b8z9:nm-scry-media-composition","sourceUrl":"https://clawhub.ai/athola/nm-scry-media-composition","homepage":"https://clawhub.ai/athola/skills/nm-scry-media-composition","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/athola/nm-scry-media-composition","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/athola/skills/nm-scry-media-composition","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Skill: media-composition Owner: athola Summary: Combines GIFs and vid"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":null},"stars":null,"forks":null,"downloads":1526,"packageName":null,"latestVersion":"1.9.19","tractionLabel":"1.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T09:26:03.664Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T09:26:03.665Z","lastCrawledAt":"2026-10-10T09:26:03.664Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T09:26:03.664Z","lastVerifiedAt":null,"highlights":[{"version":"1.9.19","createdAt":"2026-08-26T13:22:56.114Z","changelog":"Release v1.9.19","fileCount":3,"zipByteSize":4523},{"version":"1.9.17","createdAt":"2026-07-30T05:42:46.027Z","changelog":"Release v1.9.17","fileCount":3,"zipByteSize":4623},{"version":"1.9.16","createdAt":"2026-07-14T19:59:35.846Z","changelog":"Release v1.9.16","fileCount":3,"zipByteSize":4569},{"version":"1.9.14","createdAt":"2026-06-30T18:07:00.904Z","changelog":"Release v1.9.14","fileCount":3,"zipByteSize":4596},{"version":"1.9.13","createdAt":"2026-06-27T16:24:52.671Z","changelog":"Release v1.9.13","fileCount":3,"zipByteSize":4573},{"version":"1.9.12","createdAt":"2026-06-19T03:20:38.781Z","changelog":"Release v1.9.12","fileCount":3,"zipByteSize":4582},{"version":"1.0.2","createdAt":"2026-05-09T02:20:37.914Z","changelog":"Release v1.9.5","fileCount":3,"zipByteSize":4731},{"version":"1.0.1","createdAt":"2026-05-06T14:22:08.511Z","changelog":"Release v1.9.4","fileCount":2,"zipByteSize":3546}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17emme0e2m3cpf7k2jvp3a84984b8z9:nm-scry-media-composition","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T11:53:38.623Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-athola-nm-scry-media-composition/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":null},"readme":"Skill: media-composition\n\nOwner: athola\n\nSummary: Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\n\nTags: latest:1.9.19\n\nVersion history:\n\nv1.9.19 | 2026-08-26T13:22:56.114Z | user\n\nRelease v1.9.19\n\nv1.9.17 | 2026-07-30T05:42:46.027Z | user\n\nRelease v1.9.17\n\nv1.9.16 | 2026-07-14T19:59:35.846Z | user\n\nRelease v1.9.16\n\nv1.9.14 | 2026-06-30T18:07:00.904Z | user\n\nRelease v1.9.14\n\nv1.9.13 | 2026-06-27T16:24:52.671Z | user\n\nRelease v1.9.13\n\nv1.9.12 | 2026-06-19T03:20:38.781Z | user\n\nRelease v1.9.12\n\nv1.0.2 | 2026-05-09T02:20:37.914Z | user\n\nRelease v1.9.5\n\nv1.0.1 | 2026-05-06T14:22:08.511Z | user\n\nRelease v1.9.4\n\nv1.0.0 | 2026-04-20T15:01:57.967Z | auto\n\nInitial release of the media-composition skill.\n\n- Combine multiple media assets (GIFs, videos, images) into composite outputs for tutorials or documentation.\n- Supports vertical, horizontal, sequential, grid, overlay, and picture-in-picture (PiP) layouts with customizable options (e.g., padding, background).\n- Uses manifest files to define input components and composition rules.\n- Executes FFmpeg commands to produce the final combined media.\n- Includes step-by-step guidance for validation, FFmpeg command usage, and output verification.\n\nArchive index:\n\nArchive v1.9.19: 3 files, 4523 bytes\n\nFiles: skill-card.md (1887b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.19:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.19:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750576114\n}\n\nFile v1.9.19:skill-card.md\n\n## Description:\n\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via FFmpeg.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[athola](https://clawhub.ai/user/athola)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and documentation authors use this skill to combine existing media assets into tutorial or demo compositions using manifest-defined layouts and FFmpeg commands.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad activation terms could cause the skill to be selected for generic media or tutorial requests.\n\nMitigation: Invoke it only for explicit media-composition tasks that require combining assets with FFmpeg.\n\nRisk: Manifest-defined paths and prerequisite commands may point to unintended local files or commands.\n\nMitigation: Review the manifest paths and required commands before execution, then verify the intended output file after composition.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition)\n- [Clawdis homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with YAML manifest examples and FFmpeg shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces instructions for local media composition and output verification; the skill itself does not embed generated media.]\n\n## Skill Version(s):\n\n1.9.19 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.9.17: 3 files, 4623 bytes\n\nFiles: skill-card.md (2239b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.17:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.17:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.17\",\n  \"publishedAt\": 1785390166027\n}\n\nFile v1.9.17:skill-card.md\n\n## Description: <br>\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and documentation authors use this skill to combine existing GIF, video, or image assets into tutorial and demo compositions using manifest-driven ffmpeg commands. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Generated ffmpeg examples may overwrite existing media outputs when run with overwrite flags. <br>\nMitigation: Review the manifest output paths before execution and run commands only in the intended workspace. <br>\nRisk: Composition manifests may include prerequisite commands for generating component media. <br>\nMitigation: Inspect any manifest requirement commands before running them and confirm they match the expected local project workflow. <br>\nRisk: Broad trigger terms may cause the skill to appear for unrelated media or tutorial tasks. <br>\nMitigation: Use the skill only when the task explicitly requires combining multiple media assets into a composite output. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition) <br>\n- [Homepage from ClawHub metadata](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, markdown, shell commands, configuration] <br>\n**Output Format:** [Markdown guidance with YAML manifest examples and ffmpeg shell commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Commands are intended for local media composition and may overwrite output files when ffmpeg is run with overwrite flags.] <br>\n\n## Skill Version(s): <br>\n1.9.17 (source: ClawHub release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.16: 3 files, 4569 bytes\n\nFiles: skill-card.md (2043b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.16:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.16:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.16\",\n  \"publishedAt\": 1784059175846\n}\n\nFile v1.9.16:skill-card.md\n\n## Description: <br>\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical writers use this skill to combine existing GIFs, videos, and images into tutorial or documentation media using manifest-driven FFmpeg composition. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill guides an agent to run local media-processing commands that write combined output files. <br>\nMitigation: Confirm FFmpeg execution is intended, review output paths before running commands, and verify the combined file exists with expected size and dimensions. <br>\nRisk: Manifest-provided prerequisite commands can affect the local environment if they are untrusted. <br>\nMitigation: Use trusted manifests and review any `requires` commands before allowing an agent to execute them. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition) <br>\n- [Project homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, shell commands, configuration] <br>\n**Output Format:** [Markdown with YAML manifests and inline bash code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Guides an agent to validate media component outputs, run FFmpeg composition commands, and report output file metrics.] <br>\n\n## Skill Version(s): <br>\n1.9.16 (source: server release evidence; artifact frontmatter says 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.14: 3 files, 4596 bytes\n\nFiles: skill-card.md (2084b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.14:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.14:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.14\",\n  \"publishedAt\": 1782842820904\n}\n\nFile v1.9.14:skill-card.md\n\n## Description: <br>\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical writers use this skill to combine existing GIF, video, or image assets into composite tutorials and documentation media. It guides an agent through manifest parsing, input validation, ffmpeg composition, and output verification. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Manifests can include local input paths, output paths, and requires entries that may represent local commands. <br>\nMitigation: Inspect manifest paths and requires entries before running a composition workflow. <br>\nRisk: ffmpeg examples use overwrite behavior for the configured output file. <br>\nMitigation: Confirm output destinations before execution and run in a disposable workspace when composing untrusted media. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition) <br>\n- [Project homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with YAML manifest examples and inline bash or ffmpeg command blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May produce local ffmpeg commands that read component media files and write combined media outputs.] <br>\n\n## Skill Version(s): <br>\n1.9.14 (source: server release metadata; artifact frontmatter reports 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.13: 3 files, 4573 bytes\n\nFiles: skill-card.md (2027b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.13:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.13:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.13\",\n  \"publishedAt\": 1782577492671\n}\n\nFile v1.9.13:skill-card.md\n\n## Description: <br>\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical content authors use this skill to combine terminal, browser, image, GIF, and video outputs into tutorial or documentation media using manifest-defined ffmpeg layouts. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill may activate broadly on media or composition wording. <br>\nMitigation: Review and narrow trigger wording before installation if activation should be limited to explicit ffmpeg or media-composition requests. <br>\nRisk: Generated ffmpeg shell commands can read local media files or overwrite output paths. <br>\nMitigation: Inspect commands, input paths, and output destinations before execution, and run them only in the intended working directory. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition) <br>\n- [Night Market Scry plugin homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown with YAML manifest examples and bash command blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces ffmpeg composition instructions; generated commands may read media inputs and overwrite declared output files.] <br>\n\n## Skill Version(s): <br>\n1.9.13 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.9.12: 3 files, 4582 bytes\n\nFiles: skill-card.md (2041b), SKILL.md (9454b), _meta.json (145b)\n\nFile v1.9.12:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal and Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n\nFile v1.9.12:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.12\",\n  \"publishedAt\": 1781839238781\n}\n\nFile v1.9.12:skill-card.md\n\n## Description: <br>\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical content authors use this skill to combine local GIFs, videos, and images into tutorial-style composites. It guides manifest review, input validation, ffmpeg command execution, and output checks for vertical, horizontal, sequential, grid, overlay, and picture-in-picture layouts. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Broad media-composition triggers may invoke the skill outside a narrowly intended task. <br>\nMitigation: Use the skill deliberately for media-composition work and confirm the requested output before running ffmpeg commands. <br>\nRisk: Untrusted manifests may cause unexpected inputs, commands, or output paths to be used. <br>\nMitigation: Review manifests from untrusted sources before command execution and confirm ffmpeg outputs and temporary files are written to expected locations. <br>\n\n\n## Reference(s): <br>\n- [Claude Night Market scry plugin](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown with YAML and bash code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces ffmpeg composition guidance and validation steps for local media files.] <br>\n\n## Skill Version(s): <br>\n1.9.12 (source: server release metadata; artifact frontmatter says 1.9.8) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.2: 3 files, 4731 bytes\n\nFiles: skill-card.md (2170b), SKILL.md (9657b), _meta.json (144b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combine media assets (GIFs, videos) into composite tutorials with vertical/horizontal\nversion: 1.9.5\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal + Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n## Troubleshooting\n\n### Common Issues\n\n**Command not found**\nEnsure all dependencies are installed and in PATH\n\n**Permission errors**\nCheck file permissions and run with appropriate privileges\n\n**Unexpected behavior**\nEnable verbose logging with `--verbose` flag\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1778293237914\n}\n\nFile v1.0.2:skill-card.md\n\n## Description: <br>\nCombine media assets such as GIFs, videos, and images into composite tutorial and documentation outputs. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[athola](https://clawhub.ai/user/athola) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical content authors use this skill to plan and execute media composition workflows that combine generated terminal, browser, static image, GIF, and video assets into tutorial-ready composites. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Manifest-provided commands or paths may overwrite existing local files when FFmpeg is run with replacement flags. <br>\nMitigation: Review manifest commands, output filenames, and temporary file names before execution, and run composition in a workspace where overwrites are acceptable. <br>\nRisk: Missing or incorrect component outputs can cause failed or misleading composite media generation. <br>\nMitigation: Validate every component output exists and is non-empty before running the composition command, then verify the combined output size and dimensions. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/athola/nm-scry-media-composition) <br>\n- [Skill homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Markdown, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown with YAML manifest examples and inline bash code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces agent guidance for local FFmpeg-based media composition and verification; generated media files are created by the user's local commands.] <br>\n\n## Skill Version(s): <br>\n1.0.2 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.1: 2 files, 3546 bytes\n\nFiles: SKILL.md (9657b), _meta.json (144b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combine media assets (GIFs, videos) into composite tutorials with vertical/horizontal\nversion: 1.9.4\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal + Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n## Troubleshooting\n\n### Common Issues\n\n**Command not found**\nEnsure all dependencies are installed and in PATH\n\n**Permission errors**\nCheck file permissions and run with appropriate privileges\n\n**Unexpected behavior**\nEnable verbose logging with `--verbose` flag\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778077328511\n}\n\nArchive v1.0.0: 2 files, 3546 bytes\n\nFiles: SKILL.md (9657b), _meta.json (144b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: media-composition\ndescription: |\n  Combine media assets (GIFs, videos) into composite tutorials with vertical/horizontal\nversion: 1.8.2\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to arrange them:\n\n```yaml\n# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Manifest Schema\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `name` | string | Yes | Identifier for the composition |\n| `title` | string | No | Human-readable title |\n| `components` | array | Yes | List of media components to combine |\n| `components[].type` | string | Yes | Source type: `tape`, `playwright`, `static` |\n| `components[].source` | string | Yes | Path to source file |\n| `components[].output` | string | Yes | Path to generated output |\n| `components[].requires` | array | No | Commands to run before generation |\n| `combine.output` | string | Yes | Path for combined output |\n| `combine.layout` | string | Yes | Layout mode (see table below) |\n| `combine.options` | object | No | Layout-specific options |\n\n## Step-by-Step Process\n\n### 1. Parse Manifest File\n\n```bash\n# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 2. Validate Component Outputs\n\n```bash\n# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### 3. Execute FFmpeg Composition\n\nBased on the layout specified in the manifest, execute the appropriate FFmpeg command.\n\n### 4. Verify Combined Output\n\n```bash\n# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## FFmpeg Composition Commands\n\n### Vertical Stacking\n\nStack GIFs/videos top to bottom:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\nWith padding between:\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Horizontal Stacking\n\nStack GIFs/videos side by side:\n\n```bash\nffmpeg -i left.gif -i right.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Sequential Concatenation\n\nPlay GIFs/videos one after another:\n\n```bash\n# Create concat list file\ncat > concat_list.txt << EOF\nfile 'first.gif'\nfile 'second.gif'\nfile 'third.gif'\nEOF\n\n# Concatenate\nffmpeg -f concat -safe 0 -i concat_list.txt \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Grid Layout (2x2)\n\n```bash\nffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif \\\n  -filter_complex \"[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### With Background Color\n\n```bash\nffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300\" \\\n  -y output.gif\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Layout Options\n\n| Layout | Description | Options |\n|--------|-------------|---------|\n| `vertical` | Stack top to bottom | `padding`, `background`, `align` |\n| `horizontal` | Stack left to right | `padding`, `background`, `align` |\n| `sequential` | Play in order | `transition`, `duration` |\n| `grid` | N x M grid arrangement | `rows`, `cols`, `padding` |\n| `overlay` | Layer on top of each other | `position`, `opacity` |\n| `pip` | Picture-in-picture | `corner`, `scale`, `margin` |\n\n### Layout Option Details\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `padding` | int | 0 | Pixels between components |\n| `background` | string | \"black\" | Background color (hex or name) |\n| `align` | string | \"center\" | Alignment: left, center, right |\n| `transition` | string | \"none\" | Transition type: fade, wipe, none |\n| `scale` | float | 0.25 | Scale factor for PiP |\n| `corner` | string | \"br\" | PiP corner: tl, tr, bl, br |\n\n## Example Compositions\n\n### Terminal + Browser Tutorial\n\n```yaml\nname: plugin-demo\ncomponents:\n  - type: tape\n    source: demo.tape\n    output: terminal.gif\n  - type: playwright\n    source: browser.spec.ts\n    output: browser.gif\ncombine:\n  output: demo-combined.gif\n  layout: vertical\n  options:\n    padding: 5\n    background: \"#0d1117\"\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Side-by-Side Comparison\n\n```yaml\nname: before-after\ncomponents:\n  - type: static\n    source: before.gif\n    output: before.gif\n  - type: static\n    source: after.gif\n    output: after.gif\ncombine:\n  output: comparison.gif\n  layout: horizontal\n  options:\n    padding: 10\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n### Picture-in-Picture\n\n```yaml\nname: pip-demo\ncomponents:\n  - type: tape\n    source: main.tape\n    output: main.gif\n  - type: playwright\n    source: overlay.spec.ts\n    output: overlay.gif\ncombine:\n  output: pip-demo.gif\n  layout: pip\n  options:\n    corner: br\n    scale: 0.3\n    margin: 20\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Exit Criteria\n\n- [ ] Manifest file parsed successfully\n- [ ] All component outputs validated as existing\n- [ ] FFmpeg composition command executed without errors\n- [ ] Combined output file exists and has non-zero size\n- [ ] Output dimensions and duration logged\n- [ ] Temporary files cleaned up\n## Troubleshooting\n\n### Common Issues\n\n**Command not found**\nEnsure all dependencies are installed and in PATH\n\n**Permission errors**\nCheck file permissions and run with appropriate privileges\n\n**Unexpected behavior**\nEnable verbose logging with `--verbose` flag\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776697317967\n}","readmeExcerpt":"Skill: media-composition Owner: athola Summary: Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:56.114Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:46.027Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:35.846Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:07:00.904Z | user Release v1.9.14 v1.9.13 | 20","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)"},{"language":"yaml","snippet":"# Example manifest: tutorials/mcp.manifest.yaml\nname: mcp\ntitle: \"MCP Server Integration\"\ncomponents:\n  - type: tape\n    source: mcp.tape\n    output: assets/gifs/mcp-terminal.gif\n  - type: playwright\n    source: browser/mcp-browser.spec.ts\n    output: assets/gifs/mcp-browser.gif\n    requires:\n      - \"skrills serve\"\ncombine:\n  output: assets/gifs/mcp-combined.gif\n  layout: vertical\n  options:\n    padding: 10\n    background: \"#1a1a2e\""},{"language":"bash","snippet":"# Read and validate manifest structure\nyq eval '.' manifest.yaml\n\n# Extract component outputs\nyq eval '.components[].output' manifest.yaml"},{"language":"bash","snippet":"# Check all required files exist\nfor output in $(yq eval '.components[].output' manifest.yaml); do\n  if [[ ! -f \"$output\" ]]; then\n    echo \"ERROR: Missing component: $output\"\n    exit 1\n  fi\ndone"},{"language":"bash","snippet":"# Verify output exists and has content\nif [[ -f \"$output\" && -s \"$output\" ]]; then\n  echo \"Composition successful: $output\"\n  ls -lh \"$output\"\nelse\n  echo \"ERROR: Composition failed\"\n  exit 1\nfi"},{"language":"bash","snippet":"ffmpeg -i top.gif -i bottom.gif \\\n  -filter_complex \"[0:v][1:v]vstack=inputs=2\" \\\n  -y output.gif"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: media-composition\ndescription: |\n  Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg\nversion: 1.9.8\ntriggers:\n  - composition\n  - ffmpeg\n  - media\n  - combine\n  - stitch\n  - tutorial\n  - assembling multi-part media into a single output\nmetadata: {\"openclaw\": {\"homepage\": \"https://github.com/athola/claude-night-market/tree/master/plugins/scry\", \"emoji\": \"\\ud83e\\udd9e\", \"requires\": {\"config\": [\"night-market.scry:gif-generation\"]}}}\nsource: claude-night-market\nsource_plugin: scry\n---\n\n> **Night Market Skill** — ported from [claude-night-market/scry](https://github.com/athola/claude-night-market/tree/master/plugins/scry). For the full experience with agents, hooks, and commands, install the Claude Code plugin.\n\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Required TodoWrite Items](#required-todowrite-items)\n- [Manifest Format](#manifest-format)\n- [Manifest Schema](#manifest-schema)\n- [Step-by-Step Process](#step-by-step-process)\n- [1. Parse Manifest File](#1-parse-manifest-file)\n- [2. Validate Component Outputs](#2-validate-component-outputs)\n- [3. Execute FFmpeg Composition](#3-execute-ffmpeg-composition)\n- [4. Verify Combined Output](#4-verify-combined-output)\n- [FFmpeg Composition Commands](#ffmpeg-composition-commands)\n- [Vertical Stacking](#vertical-stacking)\n- [Horizontal Stacking](#horizontal-stacking)\n- [Sequential Concatenation](#sequential-concatenation)\n- [Grid Layout (2x2)](#grid-layout-(2x2))\n- [With Background Color](#with-background-color)\n- [Layout Options](#layout-options)\n- [Layout Option Details](#layout-option-details)\n- [Example Compositions](#example-compositions)\n- [Terminal + Browser Tutorial](#terminal-+-browser-tutorial)\n- [Side-by-Side Comparison](#side-by-side-comparison)\n- [Picture-in-Picture](#picture-in-picture)\n- [Exit Criteria](#exit-criteria)\n\n\n# Media Composition Skill\n\nCombine multiple media assets (GIFs, videos, images) into composite outputs for detailed tutorials and documentation.\n\n\n## When To Use\n\n- Combining multiple media outputs into compositions\n- Creating composite demos from terminal and browser recordings\n\n## When NOT To Use\n\n- Single-format output that does not need composition\n- Simple terminal recordings - use scry:vhs-recording directly\n\n## Overview\n\nThis 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.\n\n## Required TodoWrite Items\n\n```\n- Parse composition manifest file\n- Validate all component outputs exist\n- Determine composition layout and parameters\n- Execute FFmpeg composition command\n- Verify combined output file created\n- Report composition metrics (file size, dimensions)\n```\n**Verification:** Run the command with `--help` flag to verify availability.\n\n## Manifest Format\n\nManifests define the components to combine and how to "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7d107jg9jv602h9ytsegydq184a42s\",\n  \"slug\": \"nm-scry-media-composition\",\n  \"version\": \"1.9.19\",\n  \"publishedAt\": 1787750576114\n}"},{"path":"skill-card.md","content":"## Description:\n\nCombines GIFs and videos into composite tutorials with vertical or grid layouts via FFmpeg.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[athola](https://clawhub.ai/user/athola)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and documentation authors use this skill to combine existing media assets into tutorial or demo compositions using manifest-defined layouts and FFmpeg commands.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Broad activation terms could cause the skill to be selected for generic media or tutorial requests.\n\nMitigation: Invoke it only for explicit media-composition tasks that require combining assets with FFmpeg.\n\nRisk: Manifest-defined paths and prerequisite commands may point to unintended local files or commands.\n\nMitigation: Review the manifest paths and required commands before execution, then verify the intended output file after composition.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/athola/skills/nm-scry-media-composition)\n- [Clawdis homepage](https://github.com/athola/claude-night-market/tree/master/plugins/scry)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with YAML manifest examples and FFmpeg shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces instructions for local media composition and output verification; the skill itself does not embed generated media.]\n\n## Skill Version(s):\n\n1.9.19 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Skill: media-composition Owner: athola Summary: Combines GIFs and videos into composite tutorials with vertical or grid layouts via ffmpeg Tags: latest:1.9.19 Version history: v1.9.19 | 2026-08-26T13:22:56.114Z | user Release v1.9.19 v1.9.17 | 2026-07-30T05:42:46.027Z | user Release v1.9.17 v1.9.16 | 2026-07-14T19:59:35.846Z | user Release v1.9.16 v1.9.14 | 2026-06-30T18:07:00.904Z | user Release v1.9.14 v1.9.13 | 20","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":932,"uniquenessScore":54,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T09:26:03.665Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:53:38.625Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}