About layer-motion-graphics
A Layer skill for combining video generation with timeline editing in motion graphics. It is aimed at brand and video creators, with guidance for preserving exact logos and setting text through timeline items rather than generated lettering.
Key features
- 01Create logo reveals with pinned frames
- 02Generate looping logo animation
- 03Set exact copy as timeline text
- 04Animate text with transitions and cuts
- 05Use masks and solid plates
Use cases
- 01Make a brand logo reveal
- 02Create a looping logo animation
- 03Add titles, lower thirds, and CTAs
- 04Build word-by-word kinetic type
MCP support
The skill describes using Layer tools for model selection, price estimates, generation, timeline rendering, and polling job results.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ layerai/ skills --skill layer-motion-graphicsAfter installing, type/layer-motion-graphicsin Claude Code to confirm it loaded.
Details
From the project READMELayer Motion Graphics
Overview
Motion graphics on Layer split into two jobs that must not be mixed. Pictures that move (a logo
assembling, an emblem catching light) are a generation with a video model. Words are never
generated: video models misspell, cannot use a font file, and drift between frames. Words go on as
text items in a render_video_timeline edit, set in the brand font.
Generation mechanics are in the layer skill and motion prompting in layer-video. Timeline
assembly basics (cutting, safe areas, audio length) are in layer-video-timeline, and exact text on
stills is layer-typography. Reusing one motion design for many variants is layer-motion-templates;
a shared colour and texture finish is layer-video-looks.
If a sibling skill named here is missing from your available skills, ask the user to install it
(npx skills add layerai/skills --skill <name>); unattended, proceed from tool schemas and flag the
gap.
Quick reference
| Job | Route |
|---|---|
| Logo reveal | image_to_video, exact logo as last_frame, an abstract or empty plate as first_frame |
| Idle logo loop | image_to_video, the logo as both first_frame and last_frame, loop capability |
| Title, lower third, CTA | Timeline text item with font_file_id, never a prompt |
| Text entering or leaving | A transition between items: slide, wipe, iris, clockWipe, flip, fade |
| Word-by-word kinetic type | Consecutive text items, one word or phrase each, stepped on start_frame |
| Shaped reveal of an image | mask on an image or video item: circle, ellipse-horizontal, ellipse-vertical |
| Plate behind type | A solid item under the text, or the text item's own background_color |
Reveals and loops: generate the picture, pin the frame
A reveal is judged on its last frame, which is the one the viewer reads. Filter list_base_models
with filter.use_case: "image_to_video" and filter.guidance_file_types: ["first_frame", "last_frame"], take the first result, and get_base_model for its durations and trigger word. Pass
the exact logo file as last_frame, so the landing frame is the artwork rather than the model's
memory of it. first_frame is what the reveal grows from: an empty plate in the brand colour, an
abstract shape, or particles, from an existing still or one text_to_image run (layer-image), sized
with width and height to the reveal's frame. Describe only the transition in the prompt ("gold shards converge and
lock into the emblem, light sweep across it at the end"), never the logo's letters.
render_video_timeline takes {workspace_id, template, videos, images, audios}. template is
{width, height, fps, tracks: [{id, name, items, transitions}]}; an item is {id, type, start_frame, duration_in_frames} plus file_id or slot, and optionally layout {left, top, width, height},
effects, start_from_in_seconds to trim a clip's head, and volume; a solid takes color
{red, green, blue, alpha}. The render returns a generation_id for get_generation_run.
An idle loop takes the logo as both first_frame and last_frame, and a model with the loop
capability where the clip must repeat without a jump. Keep its motion small (a breathing glow, a
slow rim light) so the mark never leaves its own silhouette.
Set duration_seconds on a model filtered with fixed_duration: true when the sting must land on a
beat. Estimate with estimate_forge_price using the same files, then execute and poll get_forge_run
at poll_interval_seconds.
Type: set it, then move it with cuts
A timeline text item takes text, font_file_id (an uploaded .ttf or .otf; upload local fonts with
request_file_upload_url) or font_family, font_size, font_weight, letter_spacing,
line_height, text_align, color, stroke ({color, width}), shadow ({color, x, y, blur}),
background_color, and a layout box {left, top, width, height} in composition pixels.
The timeline has no keyframes. An item's position, opacity and effects hold for its whole span. Motion comes from two sources only:
- Transitions on a track's
transitions, each{id, type, from_item_id, to_item_id, duration_in_frames, easing}, withdirection(from-left,from-right,from-top,from-bottom) onslide,wipeandflip.easing: "spring"gives the overshoot that reads as designed motion;ease-outsuits an entrance,ease-inan exit. A transition joins two adjacent items on one track, so a title that slides in needs asolidor empty-looking item before it. - Stepped items. Kinetic type is a run of
textitems on one track, each one word or phrase, back to back onstart_framewith no overlap. Hard cuts on the beat read as rhythm; a shortfadeorwipebetween them reads as flow.
Anything that must glide continuously (a slow push on the title, a sweep of light across the type) is
a generated clip of the type rendered as an image, not a timeline effect: render_text the line,
then animate that still with image_to_video as both frames and a "light sweep only, letters
unchanged" prompt, and check every frame for warping. Report the gap rather than promising a
keyframe move.
Reading time and placement
Hold a title at least as long as it takes to read twice aloud, and convert that to frames at the
template's fps. A lower third holds for the whole time its speaker is on screen. Keep type
and logos well inside the frame edges, since social players overlay their own UI top and bottom;
check the platform's current safe-area spec rather than guessing a margin. Tracks composite in
reverse order: Track 1 is on top, so type goes on the first track and plates below it.
Worked example
"A 4-second logo sting for our trailer, then a lower third naming the studio."
- The logo PNG and the brand font are on the user's machine: upload both with
request_file_upload_url. list_base_modelswithfilter.use_case: "image_to_video",filter.guidance_file_types: ["first_frame", "last_frame"]andfilter.capabilities: {fixed_duration: true}. Take the first result;get_base_modelfor its durations.estimate_forge_pricewith a dark brand-colour plate asfirst_frame, the logo aslast_frame,duration_seconds: 4, and the prompt "embers drift inward and fuse into the emblem, a single light sweep across it in the last half second, camera locked". Above 20 CUs, ask first.execute_forge, pollget_forge_run, and step to the last frame of each output against the logo file. Reject any that changed the mark.- Timeline at 30 fps: Track 1 holds a
solid(8 frames) then atextitem "Studio Name" in the brand font, joined by aslidetransitiondirection: "from-left",easing: "spring",duration_in_frames: 12. Track 2 holds the sting video item. estimate_video_timeline_pricewith that template; thenrender_video_timelinewith the same arguments and pollget_generation_run. Watch it end to end.
Common mistakes
- Prompting the logo's name or letters into a video model instead of pinning the logo as
last_frame. - Generating titles, lower thirds or CTA copy as video rather than setting them as text items.
- Expecting a keyframe slide or scale on one timeline item; motion is transitions or stepped items.
- A transition with only one item on the track, so there is nothing to transition from.
- Overlapping items on one track instead of stacking them on separate tracks.
- Titles cut before they can be read twice, or set outside the platform's safe area.
- A logo loop with motion big enough to break the mark's silhouette.