From merge-movies
Modify an existing merge.mov movie — add, edit, reorder, or remove scenes.
How this skill is triggered — by the user, by Claude, or both
Slash command
/merge-movies:update-movieThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Modify an existing merge.mov movie — add, edit, reorder, or remove scenes.
Modify an existing merge.mov movie — add, edit, reorder, or remove scenes.
$ARGUMENTS
This skill helps you update existing movies by:
/merge-movies:update-movie <movie-id> - Update a specific movie by ID/merge-movies:update-movie <search term> - Find a movie by title and update it/merge-movies:update-movie - List recent movies and pick oneThis skill uses the merge-movies MCP server. All tools are available automatically — use them directly by name. Authentication is handled automatically via OAuth — on first use, a browser window opens for you to log in, and tokens are managed by Claude Code.
Available tools:
| Tool | Description |
|---|---|
list_movies | List all movies |
get_movie | Get a movie by ID with all scenes |
create_movie | Create a new movie |
update_movie | Update an existing movie (full replacement) |
delete_movie | Delete a movie |
list_scenes | List all scenes in a movie |
get_scene | Get a single scene |
create_scene | Create a new scene in a movie |
update_scene | Full replacement of a scene |
patch_scene | Partial update of a scene |
delete_scene | Delete a scene |
reorder_scenes | Reorder scenes within a movie |
list_codeblocks | List code blocks in a scene |
get_codeblock | Get a single code block |
create_codeblock | Create a code block in a scene |
update_codeblock | Update a code block |
delete_codeblock | Delete a code block |
If arg looks like a UUID (contains dashes, 32+ hex chars):
get_movie({ movieId: "<movie-id>" })
If arg is text — list movies and match by title:
list_movies({})
→ Returns array of { id, title, updatedAt }
If no arg — list movies and ask the user to pick.
Get the full movie with all scenes to understand what exists:
get_movie({ movieId: "<movie-id>" })
→ Returns full movie with metadata, scenes, and code blocks
Present a summary of existing scenes to the user: scene order, types, and narration snippets.
Ask the user what they want changed, or infer from conversation context. Common operations:
Use update_movie with the full movie object including updated metadata:
update_movie({ movieId: "<movie-id>", movie: { ...fullMovieWithUpdatedMetadata } })
Always include a title — a short label (2-5 words) for the scene:
create_scene({
movieId: "<movie-id>",
scene: {
title: "New Feature Overview",
narration: "New scene narration.",
view: { type: "slide", elements: [...] }
}
})
After adding, use reorder to place it in the correct position.
patch_scene({
movieId: "<movie-id>",
sceneId: "<scene-id>",
scene: { narration: "Updated narration text." }
})
patch_scene only updates the fields you include — everything else stays unchanged.
update_scene({
movieId: "<movie-id>",
sceneId: "<scene-id>",
scene: {
narration: "Completely new scene.",
view: { type: "code", layout: "single", codeBlocks: [...] },
timestamp: 0
}
})
delete_scene({ movieId: "<movie-id>", sceneId: "<scene-id>" })
reorder_scenes({
movieId: "<movie-id>",
sceneIds: ["scene-3", "scene-1", "scene-2"]
})
// Add a code block
create_codeblock({
movieId: "<movie-id>",
sceneId: "<scene-id>",
block: {
filePath: "src/new-file.ts",
lineRanges: [{ start: 1, end: 20 }],
changeType: "add",
content: "// file content..."
}
})
// Update a code block
update_codeblock({
movieId: "<movie-id>",
sceneId: "<scene-id>",
blockId: "<block-id>",
block: {
filePath: "src/file.ts",
lineRanges: [{ start: 10, end: 30 }],
changeType: "modify",
content: "// updated content...",
parentId: null
}
})
// Delete a code block
delete_codeblock({
movieId: "<movie-id>",
sceneId: "<scene-id>",
blockId: "<block-id>"
})
Use the studioUrl returned by the API and prepend the base URL. Use $MERGE_MOVIES_URL if set, otherwise default to https://merge.mov.
{MERGE_MOVIES_URL}{studioUrl}
Fetch all scenes with list_scenes, iterate through them, patch_scene each with updated narration.
create_scene to add the new scene (it gets appended)list_scenes to get all scene IDs in current orderreorder_scenes with the new orderUse update_scene with a completely new view object — the old view is fully replaced.
Use patch_scene, including the full view.animations object with the new highlights added.
Important: If a highlight uses
targetBlockId, it must match one of the code block IDs in the same request. Highlights with non-matchingtargetBlockIdvalues are silently removed by the server. See the create-movie skill docs for details.
update_codeblock with new content and lineRangeshighlights that reference changed line numbersNote: Modify blocks require diff format content — prefix added lines with +, removed lines with -, and leave context lines unprefixed. Highlights on diff lines automatically use green/red colors.
{
"type": "code",
"layout": "single | side-by-side | stacked | inline-diff",
"codeBlocks": [{
"filePath": "src/file.ts",
"lineRanges": [{ "start": 1, "end": 30 }],
"changeType": "modify | add | delete | context",
"content": "// actual file content (use +/- diff format for modify blocks)"
}],
"animations": {
"scroll": { "id": "s1", "linesPerSecond": 3, "pauses": [{ "lineNumber": 15, "durationMs": 2000 }] },
"highlights": [{ "id": "h1", "lines": [5, 6, 7], "color": "rgba(255, 213, 79, 0.3)" }]
}
}
{
"type": "slide",
"backgroundColor": "#0d1117",
"elements": [
{ "id": "t", "type": "text", "style": "title | body | bullet", "content": "...", "position": { "x": 10, "y": 30 } },
{ "id": "r", "type": "rect", "position": { "x": 5, "y": 35 }, "size": { "width": 20, "height": 15 }, "stroke": "#58a6ff", "text": "Label" },
{ "id": "c", "type": "circle", "position": { "x": 50, "y": 50 }, "size": { "width": 15 }, "fill": "#58a6ff" },
{ "id": "l", "type": "line", "position": { "x": 25, "y": 42 }, "endPosition": { "x": 35, "y": 42 }, "stroke": "#58a6ff" },
{ "id": "i", "type": "image", "src": "https://...", "position": { "x": 10, "y": 10 }, "size": { "width": 40 } }
]
}
{
"type": "terminal",
"title": "~/project",
"theme": "generic | claude-code | codex",
"inputAnimation": "type | fade | cut",
"outputAnimation": "type | fade | cut",
"entries": [{ "id": "e1", "command": "npm test", "output": "Tests passed", "exitCode": 0 }]
}
{
"type": "react",
"backgroundColor": "#0d1117",
"code": "const { useCurrentFrame, spring, interpolate, AbsoluteFill } = scope; ..."
}
Scope provides: React, useCurrentFrame, useVideoConfig, spring, interpolate, Sequence, Series, AbsoluteFill, Img
{
"startTransition": { "type": "fade", "duration": 0.5 },
"endTransition": { "type": "fade", "duration": 0.3 }
}
Types: cut, fade, slide, zoom
npx claudepluginhub marked-gold/merge-movies-claude-code --plugin merge-moviesGenerates walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays. Useful for app design demos and presentations.
Orchestrates story-to-video pipeline: breaks text into scenes, generates consistent Z-Image hero/refs + Qwen Edit frames, WAN FLF clips, ffmpeg concatenation.
Converts a GitHub pull request into a narrated explainer video with code diff, before/after, and impact scenes. Useful for creating changelog videos or code walkthroughs from PRs.