Update to Frameo.AI
Snapshot Oct 24, 2026 · 13:00 UTC · version 1.2.5
Collection source: downloaded plugin package.
Instructions updated for subtitles-and-cut
Full description — Now says: bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan...
Observed in instructions or declared skills. Runtime behavior has not been tested.
Up to 10 plugins free · no card required.
All fields and original values.
Full description
Oct 8, 2026 · 18:02 UTC
bed, and burn captions from timings, a script, or a transcription of the footage — on footage the user already has. Free, except a transcription.
Oct 24, 2026 · 13:00 UTC
bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not ...
Skill instructions
Oct 8, 2026 · 18:02 UTC
bed, and burn captions from timings, a script, or a transcription of the footage — on footage the user already has. Free, except a transcription." Needs: the user's video(s), uploaded through show_upload, imported from a web link with im...
Oct 24, 2026 · 13:00 UTC
bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not ...
Supporting files
Oct 8, 2026 · 18:02 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":376},{"relative_path":"ass-skeleton.md","size_in_bytes":1081},{"relative_path":"assets/icon.svg","size_in_bytes":430}]
Oct 24, 2026 · 13:00 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":379},{"relative_path":"assets/icon.svg","size_in_bytes":430},{"relative_path":"references/ass-skeleton.md","size_in_bytes":1081}]
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -1,12 +1,8 @@ --- name: subtitles-and-cut -description: "Trim, resize to 9:16 or 16:9, join clips, add a music bed, and burn captions from timings, a script, or a transcription of the footage — on footage the user already has. Free, except a transcription." +description: "Trim, resize to 9:16 or 16:9, join clips, add a music bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not new scenes." --- -Needs: the user's video(s), uploaded through show_upload, imported from a web link with import_media_url, or already in Frameo; the caption text with timings, a script to fit, or nothing (the speech is transcribed) -Credits: 0 (ffmpeg is free; a music bed is ~1 per 50 characters of its prompt; transcribing the footage is a few credits per minute, charged after the run) -Time: 5–10 minutes - ## When Editing, not generating: cut a long take, make a vertical from a horizontal, join @@ -36,7 +32,7 @@ **1. Look first (free).** `extract_frames(video_url, duration=<that clip's length>, at_seconds=[…])` at a few timestamps to see what is in the footage before cutting; confirm the trim points with the user. -**2. Captions.** Write the `.ass` sidecar: one dialogue line per cue with start/end from +**2. Captions.** Write the `.ass` sidecar, starting from `get_skill_file(skill_id="subtitles-and-cut", path="references/ass-skeleton.md")`: one dialogue line per cue with start/end from the user's timings. When only a script is given, spread the lines across the trimmed length in proportion to their character counts and say the timing is approximate. When the user wants the footage's own speech captioned, `analyze_media(media_url, question="Transcribe @@ -56,13 +52,14 @@ captions, the bed mixed under with `amix`. Output `final.mp4`. `wait_task`, return the link and `open_in_frameo`. +A whip-pan transition between two shots (a 2 s clip that lands on the next shot) is a paid `generate_video` from the next shot's first frame, with the prompt from `get_presets(["whip-pan"])`, quoted with `estimate_cost` first; the preset's notes give the length and the trim. + ## Done -The cut on the Frameo project's canvas, shown with `show_generations` and `final: true` +The cut in the Frameo project, shown with `show_generations` and `final: true` where the chat app displays Frameo cards. -`open_in_frameo` on the result opens the project in the Frameo app, where every take sits on -the canvas, ready for retakes and edits. +`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits. ## Files -- `ass-skeleton.md` — a minimal `.ass` file to fill in. +- `references/ass-skeleton.md` — a minimal `.ass` file to fill in, read in step 2.
Full technical diff · 3 changed fields
changed /description
"Trim, resize to 9:16 or 16:9, join clips, add a music bed, and burn captions from timings, a script, or a transcription of the footage — on footage the user already has. Free, except a transcription."
"Trim, resize to 9:16 or 16:9, join clips, add a music bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not new scenes."
changed /included_files
[
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 376
},
{
"relative_path": "ass-skeleton.md",
"size_in_bytes": 1081
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 430
}
][
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 379
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 430
},
{
"relative_path": "references/ass-skeleton.md",
"size_in_bytes": 1081
}
]changed /skill_md_contents
"---\nname: subtitles-and-cut\ndescription: \"Trim, resize to 9:16 or 16:9, join clips, add a music bed, and burn captions from timings, a script, or a transcription of the footage — on footage the user already has. Free, except a transcription.\"\n---\n\nNeeds: the user's video(s), uploaded through show_upload, imported from a web link with import_media_url, or already in Frameo; the caption text with timings, a script to fit, or nothing (the speech is transcribed)\nCredits: 0 (ffmpeg is free; a music bed is ~1 per 50 characters of its prompt; transcribing the footage is a few credits per minute, charged after the run)\nTime: 5–10 minutes\n\n## When\n\nEditing, not generating: cut a long take, make a vertical from a horizontal, join\ntakes, burn subtitles. Not for generating scenes.\n\n## Ask first\n\n1. **The footage** — links (uploaded or from `read_project`), each clip's length in\n seconds (`extract_frames` needs it; `read_project` reports `seconds` only for items the app has\n placed and saved, a generated clip's `wait_task` result has it as `duration_seconds`, and\n uploads carry none), and\n the target frame.\n2. **Captions** — text with timings (SRT-like), a script to spread evenly, the footage's own\n speech (transcribed, a few credits per minute), or none.\n3. **Sound** — keep the original, add a bed, or both.\n\n## Steps\n\n**Before anything.** `list_projects` (or `create_project`) for the `project_id` and, when the\nproject has several modules, the `module_id` — `extract_frames` and `run_ffmpeg` take that\npair. Nothing below spends credits. The one exception is a music bed the user wants\ngenerated: one `generate_music` under the usual quote (`estimate_cost` with the same\nproject, told to the user, then the call with that `quote_id` and `confirmed_by_user=true`,\nand `wait_task` for the link); a bed is at most 120 s (the tool's cap) and is looped at the\ncut (`-stream_loop -1` on the bed input, `-shortest`) for longer footage.\n\n**1. Look first (free).** `extract_frames(video_url, duration=<that clip's length>,\nat_seconds=[…])` at a few timestamps to see what is in the footage before cutting; confirm the trim points with the user.\n\n**2. Captions.** Write the `.ass` sidecar: one dialogue line per cue with start/end from\nthe user's timings. When only a script is given, spread the lines across the trimmed\nlength in proportion to their character counts and say the timing is approximate. When the\nuser wants the footage's own speech captioned, `analyze_media(media_url, question=\"Transcribe\nthe speech with start and end timestamps for every line\", confirmed_by_user=true)` — the one\npaid call with no quote: it is charged by clip length, a few credits per minute, the user is\ntold that and agrees first, and the finished run (`wait_task`) reports `credits_charged_estimate`.\nCues come from those timestamps, offset by the trim start.\nStyle: bottom-anchored, white with a dark outline, 15% of the height from the bottom\nso phone UI does not cover it.\n\n**3. The cut (free).** `run_ffmpeg` takes at most 10 inputs and 4 outputs: with more than\nnine clips (plus the bed) concatenate in groups of at most 10 first — each input scaled, cropped,\n`setsar=1` and set to one frame rate in that group call, since clips of different sizes do not join —\n`wait_task`, and feed\nthose to the final call, repeating until the final call fits. That call: `-ss`/`-t` for the trim, `scale`+`crop` for 9:16\n(centre crop unless the user points at a subject), `concat` for joins, `ass=subs.ass` for\ncaptions, the bed mixed under with `amix`. Output `final.mp4`. `wait_task`, return the\nlink and `open_in_frameo`.\n\n## Done\n\nThe cut on the Frameo project's canvas, shown with `show_generations` and `final: true`\nwhere the chat app displays Frameo cards.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take sits on\nthe canvas, ready for retakes and edits.\n\n## Files\n\n- `ass-skeleton.md` — a minimal `.ass` file to fill in.\n"
"---\nname: subtitles-and-cut\ndescription: \"Trim, resize to 9:16 or 16:9, join clips, add a music bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not new scenes.\"\n---\n\n## When\n\nEditing, not generating: cut a long take, make a vertical from a horizontal, join\ntakes, burn subtitles. Not for generating scenes.\n\n## Ask first\n\n1. **The footage** — links (uploaded or from `read_project`), each clip's length in\n seconds (`extract_frames` needs it; `read_project` reports `seconds` only for items the app has\n placed and saved, a generated clip's `wait_task` result has it as `duration_seconds`, and\n uploads carry none), and\n the target frame.\n2. **Captions** — text with timings (SRT-like), a script to spread evenly, the footage's own\n speech (transcribed, a few credits per minute), or none.\n3. **Sound** — keep the original, add a bed, or both.\n\n## Steps\n\n**Before anything.** `list_projects` (or `create_project`) for the `project_id` and, when the\nproject has several modules, the `module_id` — `extract_frames` and `run_ffmpeg` take that\npair. Nothing below spends credits. The one exception is a music bed the user wants\ngenerated: one `generate_music` under the usual quote (`estimate_cost` with the same\nproject, told to the user, then the call with that `quote_id` and `confirmed_by_user=true`,\nand `wait_task` for the link); a bed is at most 120 s (the tool's cap) and is looped at the\ncut (`-stream_loop -1` on the bed input, `-shortest`) for longer footage.\n\n**1. Look first (free).** `extract_frames(video_url, duration=<that clip's length>,\nat_seconds=[…])` at a few timestamps to see what is in the footage before cutting; confirm the trim points with the user.\n\n**2. Captions.** Write the `.ass` sidecar, starting from `get_skill_file(skill_id=\"subtitles-and-cut\", path=\"references/ass-skeleton.md\")`: one dialogue line per cue with start/end from\nthe user's timings. When only a script is given, spread the lines across the trimmed\nlength in proportion to their character counts and say the timing is approximate. When the\nuser wants the footage's own speech captioned, `analyze_media(media_url, question=\"Transcribe\nthe speech with start and end timestamps for every line\", confirmed_by_user=true)` — the one\npaid call with no quote: it is charged by clip length, a few credits per minute, the user is\ntold that and agrees first, and the finished run (`wait_task`) reports `credits_charged_estimate`.\nCues come from those timestamps, offset by the trim start.\nStyle: bottom-anchored, white with a dark outline, 15% of the height from the bottom\nso phone UI does not cover it.\n\n**3. The cut (free).** `run_ffmpeg` takes at most 10 inputs and 4 outputs: with more than\nnine clips (plus the bed) concatenate in groups of at most 10 first — each input scaled, cropped,\n`setsar=1` and set to one frame rate in that group call, since clips of different sizes do not join —\n`wait_task`, and feed\nthose to the final call, repeating until the final call fits. That call: `-ss`/`-t` for the trim, `scale`+`crop` for 9:16\n(centre crop unless the user points at a subject), `concat` for joins, `ass=subs.ass` for\ncaptions, the bed mixed under with `amix`. Output `final.mp4`. `wait_task`, return the\nlink and `open_in_frameo`.\n\nA whip-pan transition between two shots (a 2 s clip that lands on the next shot) is a paid `generate_video` from the next shot's first frame, with the prompt from `get_presets([\"whip-pan\"])`, quoted with `estimate_cost` first; the preset's notes give the length and the trim.\n\n## Done\n\nThe cut in the Frameo project, shown with `show_generations` and `final: true`\nwhere the chat app displays Frameo cards.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits.\n\n## Files\n\n- `references/ass-skeleton.md` — a minimal `.ass` file to fill in, read in step 2.\n"
Full snapshot data
{
"description": "Trim, resize to 9:16 or 16:9, join clips, add a music bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not new scenes.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 379
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 430
},
{
"relative_path": "references/ass-skeleton.md",
"size_in_bytes": 1081
}
],
"name": "subtitles-and-cut",
"skill_md_contents": "---\nname: subtitles-and-cut\ndescription: \"Trim, resize to 9:16 or 16:9, join clips, add a music bed and burn captions from timings, a script or a transcription of the footage, on footage the user already has: free, except a transcription or a whip-pan transition clip. Use when the footage already exists and only needs editing, not new scenes.\"\n---\n\n## When\n\nEditing, not generating: cut a long take, make a vertical from a horizontal, join\ntakes, burn subtitles. Not for generating scenes.\n\n## Ask first\n\n1. **The footage** — links (uploaded or from `read_project`), each clip's length in\n seconds (`extract_frames` needs it; `read_project` reports `seconds` only for items the app has\n placed and saved, a generated clip's `wait_task` result has it as `duration_seconds`, and\n uploads carry none), and\n the target frame.\n2. **Captions** — text with timings (SRT-like), a script to spread evenly, the footage's own\n speech (transcribed, a few credits per minute), or none.\n3. **Sound** — keep the original, add a bed, or both.\n\n## Steps\n\n**Before anything.** `list_projects` (or `create_project`) for the `project_id` and, when the\nproject has several modules, the `module_id` — `extract_frames` and `run_ffmpeg` take that\npair. Nothing below spends credits. The one exception is a music bed the user wants\ngenerated: one `generate_music` under the usual quote (`estimate_cost` with the same\nproject, told to the user, then the call with that `quote_id` and `confirmed_by_user=true`,\nand `wait_task` for the link); a bed is at most 120 s (the tool's cap) and is looped at the\ncut (`-stream_loop -1` on the bed input, `-shortest`) for longer footage.\n\n**1. Look first (free).** `extract_frames(video_url, duration=<that clip's length>,\nat_seconds=[…])` at a few timestamps to see what is in the footage before cutting; confirm the trim points with the user.\n\n**2. Captions.** Write the `.ass` sidecar, starting from `get_skill_file(skill_id=\"subtitles-and-cut\", path=\"references/ass-skeleton.md\")`: one dialogue line per cue with start/end from\nthe user's timings. When only a script is given, spread the lines across the trimmed\nlength in proportion to their character counts and say the timing is approximate. When the\nuser wants the footage's own speech captioned, `analyze_media(media_url, question=\"Transcribe\nthe speech with start and end timestamps for every line\", confirmed_by_user=true)` — the one\npaid call with no quote: it is charged by clip length, a few credits per minute, the user is\ntold that and agrees first, and the finished run (`wait_task`) reports `credits_charged_estimate`.\nCues come from those timestamps, offset by the trim start.\nStyle: bottom-anchored, white with a dark outline, 15% of the height from the bottom\nso phone UI does not cover it.\n\n**3. The cut (free).** `run_ffmpeg` takes at most 10 inputs and 4 outputs: with more than\nnine clips (plus the bed) concatenate in groups of at most 10 first — each input scaled, cropped,\n`setsar=1` and set to one frame rate in that group call, since clips of different sizes do not join —\n`wait_task`, and feed\nthose to the final call, repeating until the final call fits. That call: `-ss`/`-t` for the trim, `scale`+`crop` for 9:16\n(centre crop unless the user points at a subject), `concat` for joins, `ass=subs.ass` for\ncaptions, the bed mixed under with `amix`. Output `final.mp4`. `wait_task`, return the\nlink and `open_in_frameo`.\n\nA whip-pan transition between two shots (a 2 s clip that lands on the next shot) is a paid `generate_video` from the next shot's first frame, with the prompt from `get_presets([\"whip-pan\"])`, quoted with `estimate_cost` first; the preset's notes give the length and the trim.\n\n## Done\n\nThe cut in the Frameo project, shown with `show_generations` and `final: true`\nwhere the chat app displays Frameo cards.\n`open_in_frameo` on the result opens the project in the Frameo app, where every take is ready for retakes and edits.\n\n## Files\n\n- `references/ass-skeleton.md` — a minimal `.ass` file to fill in, read in step 2.\n"
}SHA-256 of public snapshot: 2bddc81882ff54a014069e76b1b02a22c0ca89929c36426597b920ab74ff1929