← FrameoCONTENT HISTORY

Update to Frameo

Snapshot Oct 8, 2026 · 18:02 UTC · version 1.2.1

Collection source: downloaded plugin package.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "The default UGC ad, a creator on camera reviewing a product in phone-video style: hook, one honest claim, product in hand, a close — lipsynced delivery.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 370
    },
    {
      "relative_path": "assets/icon.svg",
      "size_in_bytes": 323
    }
  ],
  "name": "ugc-review-video",
  "skill_md_contents": "---\nname: ugc-review-video\ndescription: \"The default UGC ad, a creator on camera reviewing a product in phone-video style: hook, one honest claim, product in hand, a close — lipsynced delivery.\"\n---\n\nNeeds: product photos; the one claim; a creator photo or a description\nCredits: about 500–650 for 30 seconds, plus a retake allowance of 15% of the image and clip total\nTime: 15–25 minutes, plus about a minute per clip for the review\n\n## When\n\nThe default UGC ask: a person talking about a product as if to their followers. Not for\nproduct-only shots (`ugc-product-video`), unboxing (`ugc-unboxing-video`), wearing it\n(`ugc-try-on-video`) or a how-to (`ugc-tutorial-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 creator** — design one (age, vibe, setting), use the user's photo, or reuse a creator\n   already in the project (`list_characters`: its first image is the step-1 still and its\n   `voice_id` the voice in step 3, with nothing to generate or choose).\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. The plan carries the retake allowance as its own line for the user\nto approve with everything else. The paid check of clips with speech (`review-shots` step 3)\nruns only when the user asks for it, since the talking beats are lipsynced to one fixed voice,\nand its rough cost (a few credits per minute of clip) is said and agreed first; without it, the\nnote on each talking clip says its sound was not checked.\nThe user can turn the review off.\n\n**0. Script.** Write a script of the length chosen in Ask first in the creator's voice: hook in the first line, the one\nclaim, a close. Show it; the user edits before anything is generated.\n\n**1. Creator still (~18).** `generate_image`: the creator at home, phone held at arm's length, looking into the lens, phone-video framing,\n`image_urls=[creator photo]` if given. \n\n**2. Product-in-scene stills (~18 each).** `generate_image` for each beat that shows the product\n(in hand, on the table, close-up), with `image_urls=[step-1 creator still, product photos…]` when the creator or their hands are in\nframe (the same person every time) and `image_urls=[product photos…]` when only the product\nis; the prompt names nothing the beat does not show.\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 any beat that is too long — the product beats at the video model's max\n(`list_models(kind=\"video\")`; 30 s on the default) because the mix at the cut cannot stretch\nthe picture, the talking beats at the smaller of that max and 15 s, the lipsync's cap —\nuntil every piece is within it, so every clip's `duration` is its length on the timeline. Then\n`search_voices` for the creator's age 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. The creator the user keeps is saved with `save_character` (a name,\n`image_urls=[creator still]` and the chosen `voice_id`), so the next video in this project\nreuses the same face and voice. 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 and the `duration` / `audio_duration`\nof its lipsync.\n\n**4. Clips (~65 per 5 s + ~20 per second of lipsync).** For talking beats: `generate_video` from the creator still, then `generate_lipsync` with the step-3 speech for that beat. For product beats: `generate_video` from the product still with a small handheld move, silent. 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), 5 s for a beat with no speech; every `generate_lipsync` takes that same whole\n`duration` (never above 15 s — the lipsync's own cap, whatever the video model allows),\n`audio_duration` = the estimate, and the clip's `aspect_ratio` and `resolution`. `wait_task` each. Test the first beat before\nthe rest.\n\nOn Seedance models (the default) the product photos go along as `reference_image_urls` on every\nclip that shows the product, and the creator still on every product clip the creator is in,\nwhich holds the label and the face through the motion. The frame is the first reference image,\nso 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 the\nclip that goes into the cut, the lipsync result on a talking beat) once that piece's look has\nbeen checked, instead of the beat's still, so the join reads as one take. Each prompt names where\nthe clip ends and nothing the beat does not show: on a lipsynced beat the creator facing the\nlens; on a silent beat the product in frame with the creator's eyes on it, never on the lens,\nsince the voiceover plays over lips that do not move.\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 — lipsynced beats bring only their clip — 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\neach) 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 all the beats in\norder in groups of at most 10; then one last call joins the groups and burns captions\nfrom an `.ass` sidecar in a casual style. 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: 4878ca37cfe0a7f5703dd44c4b893dc9e9df0f8b088e73b7bfa7516b3a63e4c8