{"id":56047,"plugin_id":"plugin_asdk_app_6ada7bec545881919206a8cf89db59f8","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-26T18:06:28.689Z","digest":"6cf3262e9123b661c4f8b6153e981572c9008104975f3d85d3e50fb4b0498a23","against":null,"payload":{"description":"Vector-native motion: keyframes, animated posts/banners, logo stingers, shader fills, photo slideshows, timeline compositing. Free authoring; exports mp4/gif.","included_files":[{"relative_path":"references/brand.md","size_in_bytes":15284},{"relative_path":"references/charts.md","size_in_bytes":5659},{"relative_path":"references/design-quality.md","size_in_bytes":22265},{"relative_path":"references/edit-code.md","size_in_bytes":16488},{"relative_path":"references/gotchas.md","size_in_bytes":8693},{"relative_path":"references/markup.md","size_in_bytes":23958},{"relative_path":"references/motion-recipes.md","size_in_bytes":21788},{"relative_path":"references/omni-and-media.md","size_in_bytes":7338},{"relative_path":"references/reading-and-verifying.md","size_in_bytes":21129},{"relative_path":"references/video.md","size_in_bytes":7676}],"name":"moda-video-motion","skill_md_contents":"---\nname: moda-video-motion\ndescription: >-\n  Vector-native motion: keyframes, animated posts/banners, logo stingers,\n  shader fills, photo slideshows, timeline compositing. Free authoring;\n  exports mp4/gif.\n---\n\n# moda-video-motion\n\n**PREREQUISITE — `load_skill(\"moda-core\")` once per session** (step-0, write\ncontract, free/metered map). Already loaded? Skip ahead. If you cannot load\nit, the non-negotiables: call `moda_bootstrap` before anything; `brand_list`\nbefore creating; revision-guarded writes use `expected_revision` from your last read.\n`canvas_edit_image` captures its own target state and has no revision argument.\nOn `stale_revision`, re-read and retry once; send the canvas link\nthe moment it exists; stuck or failed? `ask_expert(\"<question>\")` — free and\nfast, never guess.\n\n## Sizes and defaults\n\n| Piece | Size | `category` | Export |\n|---|---|---|---|\n| Landscape motion / stinger | 1920×1080 | `animation` | `format='mp4', page=N` |\n| Vertical post, story, reel | 1080×1920 | `animation` | mp4 (gif for a loop) |\n| Square animated post | 1080×1080 | `animation` | mp4 or gif |\n| Animated banner ad | the ad's exact size | `animation` | gif |\n| Shader-fill background | any canvas | any | mp4/gif — it freezes in stills |\n\nFive facts that decide most of the work:\n\n- Keyframes and clip sequencing apply ONLY on `category='animation'`; on any\n  other canvas every motion call is dropped with a warning. Animated shader\n  fills move anywhere.\n- Static exports (png/jpeg/pdf/pptx) of animation and video-filled nodes render\n  BLANK or frozen — deliver mp4/gif, and say so if a still is requested.\n- mp4/gif REQUIRE `page=N`: one animated page per file. A page with no animation\n  rejects typed `no_animation` — the honest answer is a still + the link.\n- One stitched film from many scenes: `export(canvas_ref, format='mp4',\n  scope='sequence')` renders all visible pages of a multi-page animation canvas\n  as ONE video, in order, transitions included — no `page`, mp4 only, and\n  the 18000-frame / 600 s mp4 ceiling covers the WHOLE film (600 s at 30 fps).\n  The editor's export panel has the same \"sequence\" mode as the interactive\n  alternative. A canvas with a persisted Main Edit timeline exports it with\n  `scope='main_edit'` (mp4 only, page-less like sequence). `fps` picks the\n  rate (mp4 24|30|60 default 30, gif 10|12|15|24 default 12); 60 fps halves\n  the longest exportable mp4 film (300 s; a gif is capped at 9000 frames / 300 s).\n- Everything in this recipe is unmetered: iteration costs nothing.\n\n## Recipe — motion on a canvas\n\n1. `canvas_create(name='[Piece]', intent='[one-line brief]', width=[W], height=[H], category='animation', brand_kit_id='[KIT]')` — send the link immediately.\n2. Author the still frame FIRST — real type, brand geometry, layout: `canvas_apply_markup(canvas_ref, page, markup)` (references/markup.md). Motion on a bad frame is a bad piece that moves.\n3. `canvas_screenshot(canvas_ref)` — fix the frame before animating.\n4. Add motion: `canvas_edit(canvas_ref, code)` — a `motion.page(...)` program with tweens, effects, staggers and recipes. Read references/motion-recipes.md FIRST: its opening \"motion model\" section is the five rules that decide whether the motion is correct (rest state, one track per target, what `blend` makes keyframes mean, why `endMs` is not a snap-back point, how an endless loop is authored), and the named recipes — logo sting, animated stat, kinetic type, shader background — follow it. Author from that file; don't probe.\n5. Draft-judge the movement: `export(canvas_ref, format='gif', page=[N])` and look at it. A screenshot shows one frozen frame — it cannot tell you whether the motion works.\n6. Deliver: live link FIRST, then `export(canvas_ref, format='mp4', page=[N])`. Read `warnings[]`.\n\n## Recipe — footage under real type (timeline compositing)\n\n1. Upload the user's footage or choose an existing team `file_…` reference. Inspect it with `media_video_frames` before composing. New video generation is unavailable through this connector.\n2. Animation canvas at the delivery size, then place the clip with `<video src=\"file_…\" width=\"1920\" height=\"1080\" fit=\"cover\"/>` via `canvas_apply_markup(canvas_ref, page, markup)` — the clip is a fill; layer type and brand marks above it.\n3. Sequence and trim in `canvas_edit(canvas_ref, code)` (`t.video(node, { startMs })`; trim/rate/loop via `update()` — references/edit-code.md).\n4. `export(canvas_ref, format='mp4', page=[N])`, then read `warnings[]`: server mp4 muxes audible clip audio, and `audio_source_dropped` names anything that did not survive. Relay it — never a silent loss.\n\n## Examples\n\n- \"an animated banner ad, 300×250\" → motion recipe at the ad's exact size → gif.\n- \"a stinger from our logo\" → motion recipe, `recipe-rise` + a shader backdrop.\n- \"make this post move\" → import/rebuild the frame on an animation canvas, then animate.\n- \"cut these two clips together with our headline over them\" → compositing recipe.\n- \"a video from these 5 photos\" → compositing recipe: place, sequence, export mp4.\n\n## Errors\n\nAny typed error → load moda-core and read its recovery reference.\nEdit programs are atomic — a failure means NOTHING applied: re-read, fix the\nprogram, re-run. `no_animation` on export means the page has no motion yet.\n\n## Make it recurring\n\nThe weekly animated post → moda-automate; a stinger or lower-third you will\nreuse on every future piece → moda-templates.\n\nSee also: moda-video — supported motion and export workflows ·\nmoda-core — the contract, recovery, everything Moda can do.\n\n## References\n\n| Doc | Load when |\n|---|---|\n| references/motion-recipes.md | ALWAYS before authoring motion — the motion model, then the named deliverables (logo sting, teaser, animated ad) |\n| references/edit-code.md | before writing an edit program: batches, revisions, warnings |\n| references/video.md | supported canvas motion, placement of existing footage, and export rules |\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}