← FrameoCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Frameo
Snapshot Oct 8, 2026 · 18:02 UTC · version 1.2.1
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Product-only UGC: handheld-style shots of the product with a voiceover, no creator on camera.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 370
},
{
"relative_path": "assets/icon.svg",
"size_in_bytes": 371
}
],
"name": "ugc-product-video",
"skill_md_contents": "---\nname: ugc-product-video\ndescription: \"Product-only UGC: handheld-style shots of the product with a voiceover, no creator on camera.\"\n---\n\nNeeds: product photos; the one claim\nCredits: about 390–470 for 30 seconds, plus a retake allowance of 15% of the image and clip total\nTime: 10–20 minutes, plus about a minute per clip for the review\n\n## When\n\nWhen there is no creator to show, or the brand wants the product alone. Not for a person on\ncamera (`ugc-review-video`).\n\n## Ask first\n\n1. **The product** — photos (`show_upload` for files on the user's device, `import_media_url` for a web link; images attached to the chat do not reach Frameo, and `create_upload_url` is for clients that send the file themselves), the name, and the one thing the video\n must say about it.\n2. **The voice** — the tone of the voiceover (warm, brisk, playful) and its language.\n3. **Frame and length** — 9:16, 15 / 30 / 45 s.\n\nSay the rough cost in the same turn as the questions; the user's yes comes with the plan (Steps, **The plan first.**).\n\n## Steps\n\n**Before any paid step.** The project: `list_projects` (or `create_project`) gives the `project_id`\nand, when the project has several modules, the `module_id`; every call below that takes a project —\n`estimate_cost` included — gets that same pair; without it those tools answer `project_needed`. The\nquote: one `estimate_cost(items=[…])` prices a stage in one call, with the same project, model,\nsize and number of `image_urls` or `reference_image_urls` (`reference_count`) as each generate call, and returns a `quote_id` per item plus the total. Each generate call\nthen passes its own item's `quote_id` and `confirmed_by_user=true`. A quote is single-use and lasts\n15 minutes, so a long plan is priced stage by stage, right before each stage runs; a stage that\ncomes to more than the user approved is asked about again first. Generate calls return\n`generation_ids`; `wait_task` returns the links, and `show_generations` shows each stage's running\nand finished work in one card where the chat app displays Frameo cards: all the stage's ids at\nonce, before its first `wait_task`, and the finished result with `final: true`.\n\n**The plan first.** Before the first paid call, the plan goes to the user in the chat as plain\ntext: what will be made, in order, one line per generation (for a script, the shot list; for a\nset, each shot), with each line's credits and the total. The credits come from\n`estimate_cost(items=[…])`, up to 10 items a call, so a long plan takes several calls; those\nquotes may expire unused, since each stage is quoted again right before it runs. Nothing is\ngenerated until the user says yes. The user can drop or change lines; a changed line is priced\nagain.\n\n**Canvas rows.** Pass `shot_number` on every `generate_image` and `generate_video` of a shot (1, 2, 3… in story order; the same number for a retake and for that shot's video), so each shot gets its own row on the Frameo canvas. Cast, prop and location references take `placement_kind` (`character`, `prop` or `location`) and the subject's name as `placement_group` instead: they sit on their own board, and the shots built from them do not pile into their row.\n\n**Review (on by default).** Every still and clip is checked before it is built on, and the\nfinished cut before it is handed over, following `review-shots`: its checklist and steps come\nfrom `get_skill(\"review-shots\")`, loaded before step 1. The checks run on the step-1 still\nbefore step 2 builds on it, after step 2 (`review-shots` steps 0, 1 and 4), after step 4 (steps 2 and 4) and after the cut (step 5); the\nproduct's label, shape and colour are checked against the product photos in every shot, and a\nfailed shot is retaken once. No clip has speech on screen, so every check is free; a retake is\npaid like the shot it replaces, from the retake allowance the plan carries as its own line for\nthe user to approve. The user can turn the review off.\n\n**0. Script.** Write a voiceover script of the length chosen in Ask first: hook in the first\nline, the one claim, a close. Show it; the user edits before anything is generated.\n\n**1. Establishing still (~18).** `generate_image`: the product in a real setting, phone-video\nframing, `image_urls=[product photos…]`; no person in frame. \n\n**2. Product-in-scene stills (~18 each).** `generate_image` with `image_urls=[product photos…]` for each beat that shows the product\n(hero on a surface, in use, detail, packaging).\n\n**3. Voice (~1 per 50 characters).** First the beat list, no tool call: estimate each beat\nat 2.8 words per second (2.5 for Hindi) plus one second of headroom, say it is\napproximate, and split until every piece is within it — more lines, more clips — before any speech or\nclip is generated: a beat whose estimate is over the video model's max (30 s on the default) is\nsplit, because there is no lipsync here to stretch the picture and the mix would run\npast it. Then\n`search_voices` for the tone and language, 3 candidates, then `generate_speech` per final beat (each\npaid call, here and below, has its own quote); `wait_task` for the links. Each speech\nresult's `duration_seconds` is its measured spoken length; from here on the estimate means that\nlength when the result has one, and the words-per-second figure only when it has none. That estimate is the clip's `duration` in step 4.\n\n**4. Clips (~65 per 5 s).** `generate_video` per final beat — one clip per piece, the first piece of a split beat on its source beat's still and each\nlater one on the previous piece's last frame (below) — with a handheld push-in or slow orbit in the prompt, silent; the voiceover is mixed at the cut. Every `generate_video` takes `duration` = that beat's speech estimate rounded up to whole\nseconds and kept inside the model's range (`list_models(kind=\"video\")` gives it; 4–30 s on\nthe default). `wait_task` each. Test the first beat before the rest.\n\nOn Seedance models (the default) the product photos go along as `reference_image_urls` on every\nclip that shows the product, which holds the label through the motion. The frame is the first\nreference image, so the prompt names the others from the second image on, and it counts toward the model's cap;\nthe quote carries `first_frame=true` and `reference_count` = the number of\n`reference_image_urls`, not counting the frame. Each\nlater piece of a split beat opens on the previous piece's last frame (`extract_frames` on that\nclip) once that piece's look has been checked, instead of the beat's still, so the join reads\nas one take. Each prompt names where the clip ends (the product in frame) and nothing the beat\ndoes not show.\n\n**5. Cut (free).** `run_ffmpeg` takes at most 10 inputs and 4 outputs, so the cut is passes, `wait_task`\nafter each (its outputs are the next pass's inputs): per beat, mix its step-3 speech over its clip (`amix`, speech on top) into `beatN.mp4` at exactly\nthe clip's `duration` (`tpad`/`apad` over-pad, `-t <duration>` sets the length; captions are\ntimed from those durations), up to four beats per call (one output each) and fewer when their files would pass ten inputs\n(a clip plus its speech is two inputs and four such beats fill a call); then concatenate the beats in order in groups of at most 10;\nthen one last call joins the groups and burns captions from an `.ass` sidecar in a casual\nstyle. Output `final.mp4`, review the finished cut (`review-shots` step 5), and return the link\nand `open_in_frameo`.\n\n## Done\n\nThe UGC clip, the script, and every still and clip in the Frameo project, with the review note\nper shot: passed, retaken and why, or kept with a known flaw.\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\nNone.\n"
}SHA-256 of public snapshot: 88fc59a3fbc6fc481330695816a39ec0a5cb3c3dbd0c615e6e58ae740ca62d16