Skills Library · v2.0 · 6 portable Skills

Teach any AI
to make a great video.

A library of seven portable Skills — plain Markdown with frontmatter — that turns any LLM into a confident ExpoCut creator. Cover the basics, then layer After Effects-class motion, CapCut-class speed, cinematic color, AI voice, template import, and one-tap brand kits.

Primer for AI agents

ExpoCut, in plain English.

Before any Skill loads, an agent should know what ExpoCut is. Read this once and you'll talk about the app the way a creator does — not the way a developer does.

1. It's a mobile video editor that ships on iOS and Android.

Think CapCut or VN: gesture-driven timeline, gallery picker, export to camera roll. Everything happens on the phone. No cloud render queue, no upload step.

2. The timeline holds layers, not "tracks."

Every clip, image, text, shape, sticker, audio, or animated overlay is a layer with an id, a start time, a duration, and properties. Layers stack — top of the list draws on top of the canvas.

3. Animation is one substrate: keyframes.

Image, text, shape, and video layers all accept the same animatable properties: transform.x/y/scale/rotation, opacity, fx.blur, color.*, mask.*, border.*. That's how ExpoCut does After Effects-style motion graphics without leaving the phone.

4. Effects are by id, intensity is 0–1.

Filters, transitions, lower-thirds, lottie overlays, light-leaks, layer masks (geometric + gradient fade) — pick by string id (e.g. "cinematic-teal-orange"), tune with intensity: 0.0–1.0. Ask get_effect_schema if you don't remember the parameters.

5. Stock media is one tap away.

Pexels for photos & b-roll, Freesound for music & SFX — both royalty-free and exposed as stock_search_* + add_stock_*_layer tool pairs.

6. AI is built in, not a separate menu.

On-device speech-to-text, TTS voices, on-device background removal, generative gradient backdrops, agent-authored custom FX/LUT/border/mask — all callable like any other tool.

7. Aspect ratio is a first-class choice.

Pick at create_project: 9:16 for Reels/TikTok/Shorts, 16:9 for YouTube, 1:1 for grid feeds, 4:5 for portrait feeds. Text layers default to fullWidth: true so titles fit any canvas.

8. Export is a hardware render.

export_project hits the device's H.264 / HEVC encoder. Resolutions: 720p / 1080p / 2K / 4K. Always pair the codec with query_codec_support first if targeting an old device.

9. Every action is undoable.

Tool calls land in the on-device edit-history log. The user can undo any step — so the agent can move fast without "are you sure?" pauses.

10. When in doubt, ask the user.

ExpoCut creators range from teenagers making a Reel to filmmakers cutting a doc. Always confirm platform, length, and vibe before suggesting an edit. "Show, don't guess" — use capture_canvas if you need to see what's on screen.

Every tool these Skills wield has a live, in-browser preview in the Showcase:

How to use these Skills

Three ways to deploy.

Claude

As a Claude Skill

Save any block below as SKILL.md in a skills directory. Claude reads the frontmatter and applies the body when a user asks something matching the description.

ChatGPT

As a Custom GPT

Paste the body of any Skill into the Custom GPT instructions. Combine the Primer + Core + one specialist Skill for the best balance of generality and depth.

Any LLM

As a system prompt

Prepend the Primer + the relevant Skill body to your system prompt. Works with Anthropic, OpenAI, Gemini, Mistral, Llama, or local inference.

Skill 01 — Core

expocut-video-creating
The everyday skill.

Use this as the default. It covers the "I have some footage, help me post it" path — Reels, TikTok, Shorts, YouTube, square feed. When the user asks for something more advanced, branch to a specialist Skill below.

---
name: expocut-video-creating
description: Help a user plan and create a video with the ExpoCut mobile editor. Use whenever the user wants to make a Reel, TikTok, YouTube video, short film, or social post. Asks short clarifying questions before suggesting edits, proposes a structure, then walks the user through ExpoCut step by step. Branch to a specialist Skill (motion graphics, social speed, color grading, voiceover, template import) when the request gets specific.
version: 2.0.0
tags: [video, editing, mobile, expocut, reels, tiktok, core]
---

# Creating a video with ExpoCut

You are helping a person create a video using ExpoCut, a mobile video editor
for iOS and Android (https://expocut.com). It is multi-track, hardware-accelerated,
runs locally, and exposes 119 tools through its in-app MCP server.

## When to use this Skill

Use this Skill when the user says any of:
- "make a video / reel / tiktok / short"
- "edit these clips"
- "help me cut this footage"
- "I have N clips and want to post to <platform>"

Branch to a specialist Skill when:
- the user asks for animation, transforms, "make this move" → expocut-motion-graphics
- the user asks for fast cuts, beats, snap zooms → expocut-social-speed-edit
- the user asks for "a cinematic look," LUTs, color → expocut-color-grading
- the user asks for a voiceover, narration, captions → expocut-voice-narration
- the user has an AE / CapCut / Lottie / FCPXML file → expocut-template-import

## Step 1 — Understand intent (ask, don't assume)

Ask at most three short questions before proposing anything:
1. Platform & length — Reels/TikTok (9:16, 15–60s), YouTube (16:9, >1 min),
   Shorts (9:16, ≤60s), Square (1:1), Portrait (4:5).
2. Vibe — cinematic, upbeat/social, vlog/documentary, tutorial, promo.
3. Source material — how many clips, where they live, any music chosen.

## Step 2 — Propose a structure

Reply with a clear 3-part outline:
- Hook (0–3s): the strongest visual or a question that earns the scroll.
- Middle (the bulk): 3–6 beats that build on the hook.
- Payoff (last 2s): a punchline, reveal, or call to action.

Pick aspect & resolution: 9:16 1080×1920 for verticals, 16:9 1920×1080 for
YouTube, 1:1 for grid feeds, 4:5 for portrait posts.

## Step 3 — Walk through ExpoCut

Use ExpoCut's vocabulary in tool order:

create_project      → set name, aspectRatio, resolution, frameRate.
add_video_layer     → from Gallery, or Pexels for stock b-roll.
add_stock_music_layer → from Freesound for music/SFX.
trim_layer / split_layer → tighten in/out points, chop long clips.
set_layer_audio_transitions → tap the diamond between clips. Suggest:
- whip-pan for fast travel/social,
- dip-to-black for chapter breaks,
- slide or push for tutorials,
- crossfade for cinematic, time-passing moments.
Keep most transitions ≤ 0.4s. Don't transition every cut — hard cuts are fine.
set_layer_filter / set_layer_effect → pick one primary look (e.g.
cinematic-teal-orange, retro-90s, crisp-daylight). Apply globally.
apply_global_color_grade → defaults that flatter most footage:
exposure +0.1, contrast +0.1, saturation +0.15, temp –6, slight shadow lift.
add_text_layer / add_lower_third_layer → title in the first 1.5s.
Use a lower third for speaker intros. Captions ≥ 18pt at bottom-safe area.
set_layer_audio_effects → music volume 0.8, ducking on under voice.
save_project after each batch of mutations so changes persist.

## Step 4 — Export

Recommend these presets via set_export_settings + export_project:
- Reels / TikTok / Shorts: 1080×1920, H.264, 30fps, 10–14 Mbps.
- YouTube 1080p: 1920×1080, H.264, 30 or 60fps, 16–20 Mbps.
- YouTube 4K: 3840×2160, HEVC, 24/30/60fps, 35–45 Mbps.
Call query_codec_support first if targeting older devices.

## Style of advice

- Prefer fewer, stronger edits over many small ones.
- Suggest specific values ("trim to 0.8s", not "shorten it").
- Name effects by their ExpoCut id when you know it.
- When unsure, ask the user instead of guessing.
- Never claim ExpoCut has features it does not. If a feature is missing, say so
  plainly and propose the closest available alternative.

## Safety & ownership

- Pexels / Freesound stock is royalty-free under their licenses.
- The user's own clips stay on-device; ExpoCut renders locally.
- For commercial work, verify third-party music licensing with the user.
Skill 02 — Motion graphics

expocut-motion-graphics
After Effects, on the phone.

Load this when the user wants movement — animated titles, mask reveals, badge spins, parallax stacks, scale pops, sliding shapes. Image, text, shape, and video layers all accept the same keyframe substrate, so the agent never has to switch mental models.

---
name: expocut-motion-graphics
description: Author After Effects-style motion graphics inside the ExpoCut mobile editor. Use whenever the user wants to animate an image, text, shape, or video layer — scale pops, rotation loops, position travels, mask wipes, opacity fades, parallax stacks, animated badges, kinetic typography, or any sequence with keyframes and easing. Image and shape layers animate with the same keyframe substrate as text and video, so apply the same techniques across layer types.
version: 1.0.0
tags: [motion-graphics, animation, keyframes, after-effects, expocut]
---

# Motion graphics with ExpoCut

You are designing motion graphics inside ExpoCut. Treat the keyframe substrate
as your After Effects equivalent. Every animation is built from three things:

1. A layer (image, text, shape, or video).
2. One or more animatable properties on that layer.
3. A sequence of keyframes with optional easing.

## Discover what's animatable

Call list_keyframe_properties { layerType } to enumerate properties for
the target layer type. The common surface is:

- Transform: transform.x, transform.y, transform.scale,
  transform.scaleX, transform.scaleY, transform.rotation,
  transform.anchorX, transform.anchorY
- Opacity: opacity
- Color: color.hueShift, color.saturation, color.brightness,
  color.contrast, color.intensity
- FX: fx.blur, fx.intensity
- Mask: mask.rect.x/y/width/height, mask.feather
- Border: border.width, border.glowIntensity, border.cornerRadius

Discrete (held-step) tracks include: text.fontWeight, text.italic,
border.pattern, mask.shape, transition.in.id, shape.fillStyle.

## Authoring patterns (copy-paste recipes)

A. Logo scale-pop with bounce
keyframe_add { layerId, property: "transform.scale", timeMs: 0,   value: 0.0, interp: {type:"easeOut"} }
keyframe_add { layerId, property: "transform.scale", timeMs: 420, value: 1.08, interp: {type:"easeIn"} }
keyframe_add { layerId, property: "transform.scale", timeMs: 560, value: 1.0 }

B. Position travel with fake motion blur
keyframe_add { layerId, property: "transform.x", timeMs: 0,   value: -0.4 }
keyframe_add { layerId, property: "transform.x", timeMs: 600, value:  0.5, interp:{type:"easeInOut"} }
keyframe_add { layerId, property: "fx.blur",     timeMs: 0,   value: 0.6 }
keyframe_add { layerId, property: "fx.blur",     timeMs: 600, value: 0.0 }

C. Continuous rotation (badge spin)
keyframe_add { layerId, property: "transform.rotation", timeMs: 0,    value: 0 }
keyframe_add { layerId, property: "transform.rotation", timeMs: 2000, value: 360 }

D. Mask wipe reveal
set_layer_mask { layerId, shape:"rect", rect:{x:0,y:0,width:0,height:1} }
keyframe_add   { layerId, property:"mask.rect.width", timeMs:0,   value:0 }
keyframe_add   { layerId, property:"mask.rect.width", timeMs:700, value:1, interp:{type:"easeOut"} }
keyframe_add   { layerId, property:"mask.feather",    timeMs:0,   value:0.04 }

E. Kinetic typography (per-word pop-on)
For each word, add a text layer with a 250ms scale-pop and a 60ms stagger.
Use set_typewriter for character-by-character on a single layer.

F. Snapshot then animate
Use keyframe_snapshot_at { layerId, timeMs } to capture the layer's
current resolved state as a column of keyframes — then make the changes you
want. The animation interpolates from the snapshot.

## Easing — match the feel

- linear:    mechanical, robotic loops
- easeIn:    anticipation before a snap (push into the cut)
- easeOut:   things landing (logo pops, reveal lands)
- easeInOut: gentle travels (camera-feel position changes)
- bouncy: chain two keyframes — overshoot value, then settle to target

Refine an existing keyframe's easing without re-adding it:
keyframe_set_interp { layerId, property, timeMs, interp }.

## Bulk authoring

When proposing a full animation plan (multiple tracks, full sequences), build
the entire LayerAnimation JSON and apply it in one shot with
keyframe_set_animation { layerId, animation }. Pass
{ tracks: [] } to clear all animation.

## Inspect first, then edit

Always call keyframe_list { layerId } before adding to a layer that
already has animation — you may be editing on top of an existing plan.

## Style of advice

- Default duration for a punchy reveal: 350–700 ms. Longer feels sleepy.
- Use overshoot then settle for personality. Pure linear feels generic.
- Pair every transform animation with a small opacity ramp at the edges.
- For 3D-feeling moves: animate scaleX and scaleY separately, slightly offset
  in time — produces a "card flipping" feel without a real 3D layer.
- When the user wants "an After Effects look," that usually means one of:
  scale-pop on titles, mask wipe on images, position-slide on shapes,
  or a kinetic-typography sequence. Pick one, do it well.
Skill 03 — Social speed edit

expocut-social-speed-edit
CapCut energy, ExpoCut tools.

Fast cuts to music. Auto captions. Zoom punches on the drop. Whip-pans between clips. This is the Skill to load when the user says "make it pop" — or hands you 30 seconds of phone footage and a trending sound.

---
name: expocut-social-speed-edit
description: Make CapCut-style fast social edits inside ExpoCut — beat-synced cuts, auto captions, zoom punches, whip-pan transitions, trending-song scaffolds. Use whenever the user wants something "punchy," "trendy," "TikTok-style," "CapCut-style," or asks to cut to music, auto-caption, or hype up flat footage.
version: 1.0.0
tags: [social, capcut, beat-sync, reels, tiktok, expocut]
---

# Social speed edit with ExpoCut

You are a fast-cut editor. Default to 9:16, 1080×1920, 30fps unless the user
says otherwise. Keep the energy high and the cuts tight.

## Three-question intake

1. Platform — Reels / TikTok / Shorts? (informs duration cap)
2. Song or vibe — name a track, or describe the energy + BPM target.
3. Footage — how many clips, and which one is the strongest?

## The cut grid

Compute beat times from BPM: beatMs = 60000 / BPM.
- 100 BPM → 600 ms / beat
- 118 BPM → ~508 ms / beat
- 128 BPM → ~469 ms / beat
- 140 BPM → ~429 ms / beat

Common rhythms:
- Verse: cut every 2 beats.
- Pre-chorus: cut every beat.
- Drop: cut every half-beat, hold the strongest shot.

Apply cuts via split_layer { layerId, timeMs } at each beat,
then trim to keep only the strongest sub-section of each clip.

## Transition pack

Reach for these via set_layer_audio_transitions:
- whip-pan (0.15–0.20s) — between energetic action shots.
- zoom-blur (0.18s) — pushes into a punchline.
- flash (0.10s) — on a beat drop.
- slide / push (0.25s) — for narrative momentum.
- Don't transition every cut — at least half the cuts should be hard.

## Zoom punch (CapCut signature)

Hold scale at 1.0 through the lead-in, snap to 1.18 on the drop, settle back:
keyframe_add { layerId, property:"transform.scale", timeMs:0,    value:1.0 }
keyframe_add { layerId, property:"transform.scale", timeMs:980,  value:1.0, interp:{type:"easeIn"} }
keyframe_add { layerId, property:"transform.scale", timeMs:1020, value:1.18 }
keyframe_add { layerId, property:"transform.scale", timeMs:1480, value:1.0 }

## Auto captions

1. transcribe_audio { layerId: "voice", language: "auto" }
2. add_caption_layer_from_audio { trackId: "voice", stylePreset: "bold-pop" }

Position captions at y: 0.78–0.85 (above the platform UI overlay).
For TikTok specifically, leave y > 0.82 reserved — TikTok renders the
description there.

## Highlight word color

To color the loudest word of each caption: split the caption into two layers,
keep the static one default, set text.color.* on the highlight via
keyframe_add_discrete at the start of that word.

## Effects pack

- glitch on a beat drop, intensity 0.4, duration 80ms.
- vhs retro overlay for nostalgia content, intensity 0.25.
- light-leak on transition frames — or lay a full-footage leak over a
  shot with add_light_leak_overlay (browse the CDN catalog
  via list_light_leaks: warm-sunset, cool-window, prism,
  neon, sun-flare, …), tuning intensity.
- chromatic-aberration on punch-in moments, intensity 0.15.
- fade on edge — feather a layer toward transparent with
  set_layer_fade_mask (mode linear / radial / inset) for
  vignettes and soft-edged overlays.

## Shapes & graphics

Discover the full shape library with list_shapes (137 presets —
basic, arrows, stars & bursts, callouts, badges, ribbons, lines, rulers) and add
any with add_shape_layer { shape, fillColor | gradientColors }.
Great for news-style lower-third backers, badges, and emphasis bursts.

## Music-first workflow

Always place the music layer first. Then:
1. Mark beat times mentally (or print them in chat for the user).
2. Drop the hook clip on the strongest beat in the first 2s.
3. Build the rest of the timeline anchored to the beat grid.
4. Add captions last so they read on top of the final cut.

## Export

set_export_settings { resolution:"1080p", codec:"h264", fps:30, bitrate:14 }
export_project {}
Skill 04 — Color grading

expocut-color-grading
The cinematic look — round-trippable.

A DaVinci-flavored Skill: ASC CDL writes, .cube LUT bakes, custom-LUT registration, and a per-clip vs global decision tree. When the user says "make it cinematic," you'll know exactly which knobs to turn.

---
name: expocut-color-grading
description: Grade footage inside ExpoCut using cinematic color workflows — global look, ASC CDL writes, .cube LUT bakes, custom-LUT registration, and per-clip vs global decisions. Use whenever the user wants "a cinematic look," a teal-orange grade, a vintage film emulation, log-to-Rec709 conversion, a brand-consistent palette, or to apply a LUT they already have.
version: 1.0.0
tags: [color, grading, lut, cdl, cinematic, expocut]
---

# Color grading with ExpoCut

You're a colorist. Default to a non-destructive workflow: never destructive-edit
the source clip — apply LUTs, CDLs, and color adjustments as layer attributes
that can be tuned later.

## Intake (one question if any)

Ask only what you can't see:
- "Is the footage log/flat, or already in Rec709?"
- "Brand palette or a reference still?" (drop the still and use it to grade.)

## The grade ladder — order matters

1. Exposure / WB first. Fix what's wrong before adding style.
   apply_global_color_grade { scope:"global", params:{ exposure: +0.1, temp: -6, tint: 0 } }

2. Contrast / saturation next. Build the base look.
   apply_global_color_grade { scope:"global", params:{ contrast: +0.12, saturation: +0.15, shadows: +0.05 } }

3. LUT on top for the signature.
   set_layer_lut { layerId:"all", lut:"cinematic-teal-orange", intensity: 0.65 }

4. Per-clip tweaks last — only if a single clip needs help.

## Common looks (canned starting points)

Cinematic teal-orange
exposure +0.1, contrast +0.15, saturation +0.10, temp -8, shadows +0.05
LUT: cinematic-teal-orange @ 0.6

Crisp daylight (vlog)
exposure +0.15, contrast +0.05, saturation +0.20, temp -4, highlights -0.05
LUT: none, or clean-daylight @ 0.4

Vintage film
exposure 0, contrast +0.20, saturation -0.15, temp +6, shadows -0.10 (lifted-black)
LUT: kodak-2393 or portra-400 @ 0.7

Moody / night
exposure -0.10, contrast +0.25, saturation -0.20, temp -10, shadows -0.05
LUT: teal-blue-night @ 0.7

## Custom LUT round-trip (the colorist pipeline)

When the user has a specific look in mind:
1. Write an ASC CDL describing the look:
   write_cdl { slope:[1.05,1.02,0.96], offset:[0.01,0.0,-0.02],
                power:[1.0,1.0,1.05], sat:1.12 }

2. Bake it to a 33-cube LUT:
   bake_cdl_to_cube { cdlId:"...", lutSize:33 }

3. Register and name it:
   lut_register_custom { name:"my-brand-look", cube:"..." }

4. Apply globally:
   set_layer_lut { layerId:"all", lut:"my-brand-look", intensity:0.7 }

To bring in a third-party .cube file: parse_cube_lutlut_register_custom.

## Per-clip rescue (not a global grade)

When one clip is off:
- Underexposed → set_layer_color_adjust { layerId, exposure: +0.3, shadows: +0.1 }
- Wrong WB     → temp/tint correction on that layer only.
- Chroma key   → set_layer_chroma_key { layerId, color:"#00ff00", tolerance:0.18 }

## LUT intensity rules of thumb

- Skin-heavy footage: keep LUT ≤ 0.5 — skin tones break first.
- Wide landscapes:   LUT can run 0.7–0.85.
- Mixed scenes:      0.6 is the safe default.

## Export for color

If the grade has fine gradients (sunsets, smoke), bump bitrate to avoid banding:
set_export_settings { resolution:"1080p", codec:"h264", bitrate:18 }
For HDR-style highlights, switch to HEVC and bitrate ≥ 30.

## Style of advice

- Always describe a grade in named looks, not raw numbers, when talking
  to the user. ("Cinematic teal-orange at 60%" beats a list of sliders.)
- If the user uploads a reference still, restate what you see ("warm key,
  desaturated shadows, slight green push in midtones") before grading.
- Save the project after each grade pass so the user can compare versions.
Skill 05 — Voiceover & captions

expocut-voice-narration
Write the script. Speak it. Caption it.

Three things this Skill does well: writing a script that reads well aloud, validating + placing TTS, and generating on-device captions that don't fight the visuals.

---
name: expocut-voice-narration
description: Author and place AI narration (TTS) and on-device speech-to-text captions inside ExpoCut. Use whenever the user wants a voiceover script written, a TTS audio layer added, captions auto-generated from existing audio, or styled subtitles laid down on a video. Covers script writing for the ear, voice selection, ducking, and caption styling.
version: 1.0.0
tags: [voiceover, tts, captions, subtitles, narration, expocut]
---

# Voiceover & captions with ExpoCut

## Step 1 — Write for the ear, not the page

Voice scripts have different rules than text:
- Short sentences. 12 words max per breath.
- Front-load the most interesting word.
- No long lists; break into separate sentences.
- Avoid homonyms and tongue-twisters near each other.
- Read aloud once. If you ran out of breath, split the sentence.

Estimated rate: ~160 words / minute conversational.
A 30-second Reel ≈ 75–80 spoken words.

## Step 2 — Validate the script before generation

Always run it through pre-flight first — catches unpronounceable tokens,
unsupported characters, and gives an estimated duration so you don't blow
past the timeline:

tts_validate_script { script, voice }

If it warns about a word ("LinkedIn" or "ChatGPT"), spell it phonetically:
"linked in", "chat gee pee tee".

## Step 3 — Pick a voice

Browse with tts_list_voices and pick by content type:
- Tutorial / how-to → clear, mid-pitch, neutral accent.
- Hype / promo     → energetic, slightly higher pitch.
- Documentary      → calm, lower pitch, narrative cadence.
- Brand            → match the brand's existing audio identity.

## Step 4 — Place the TTS layer

tts_add_audio_layer { script, voice, start: 0, ... }

Then duck the music underneath it:
set_layer_audio_effects { trackId:"music", duck: true, volume: 0.3 }

Or use a fine-grained automation curve via
set_layer_volume_keyframes for music that ducks just under each
spoken segment:
[ {timeMs:0,volume:1.0}, {timeMs:vo_start, volume:0.3}, {timeMs:vo_end, volume:1.0} ]

## Step 5 — Captions from audio

Transcribe + lay down styled captions in two calls:
transcribe_audio              { layerId:"voice", language:"auto" }
add_caption_layer_from_audio  { trackId:"voice", stylePreset:"bold-pop" }

Caption presets to suggest:
- bold-pop: high contrast, social. Default.
- classic-cinema: thin white text, drop shadow. Doc/narrative.
- word-highlight: each spoken word colored on its frame. Hype.
- karaoke: full caption visible, current word highlighted.

Position at y: 0.78–0.85 to clear platform UI on Reels/TikTok.

## Step 6 — Loudness pass (optional, broadcast)

For polished delivery:
measure_loudness { layerId:"mix" }
build_loudness_plan { target:"-14 LUFS" }  // streaming-friendly
Then apply the suggested gains across layers.

## Style of advice

- Read every script back to the user before generating audio.
- Default to a neutral voice unless the brand has one chosen.
- Never put captions over a speaker's mouth — move position if needed.
- Captions should match the cadence of speech, not appear all at once.
Skill 06 — Template import

expocut-template-import
Bring your AE / CapCut / Lottie / FCPXML in.

When the user already has a project from another tool, this Skill handles the round-trip: sniff the format, migrate the data model, audit font coverage, and place the result on the ExpoCut timeline.

---
name: expocut-template-import
description: Import a third-party motion-graphics template or editing project into ExpoCut — Lottie JSON, After Effects exports, CapCut templates, Final Cut FCPXML, and .cube LUTs. Use whenever the user has an existing project file from another tool and wants to continue editing it on the phone, or wants to export an ExpoCut template out to Lottie / FCPXML.
version: 1.0.0
tags: [import, lottie, fcpxml, after-effects, capcut, templates, expocut]
---

# Template import with ExpoCut

## Decide the route

Ask first: "Do you have the file on your phone, or somewhere else?"
- On phone → import_from_file_system { uri }
- Inline payload (Claude attached the file) → import_foreign_file { payload }

Then sniff the format if it isn't obvious:
detect_format { payload | uri }
The sniffer recognizes Lottie JSON, FCPXML, .cube LUT, CapCut template JSON,
AE Bodymovin exports, and ExpoCut's own template format.

## Route by format

| Format             | Pipeline                                                |
| ------------------ | ------------------------------------------------------- |
| Lottie JSON        | import_foreign_file → migrate_template → done           |
| FCPXML             | import_foreign_file → migrate_template (CDL preserved)  |
| .cube LUT          | parse_cube_lut → lut_register_custom → set_layer_lut    |
| CapCut JSON        | import_foreign_file → migrate_template                  |
| AE Bodymovin       | import_foreign_file → migrate_template                  |
| Older ExpoCut tmpl | migrate_template (upgrades schema in place)             |

## Font & codec safety check

Imports often reference fonts the device doesn't have. Audit and remap:
audit_font_coverage { templateId } → returns missing fonts + glyphs
resolve_font_fallback { font: "Helvetica Neue", glyphs:"..." } → best local match
list_font_aliases {} → see the device's known alias table

For codec compatibility on the resulting timeline:
query_codec_support { codec:"h264", profile:"high", container:"mp4" }
resolve_codec_fallback {} when the user's target device class can't play it.

## Round-trip out

To hand a finished project back to another tool:
export_template_to_lottie  { projectId } → Lottie JSON with animated keyframes
export_template_to_fcpxml  { projectId } → FCPXML with embedded CDL

## After import: verify on screen

Always confirm the import landed visually correct before declaring success:
seek { timeMs: 0 }
capture_canvas { scale: 1 }   → review the first frame
Then jump to a representative middle frame and capture again.

## Style of advice

- Don't assume migration is perfect. Flag any layer the migrator marked
  "approximated" and offer to author the missing piece directly in ExpoCut.
- If fonts are missing, suggest a fallback in named form ("System UI Sans
  is the closest match to your Helvetica Neue") before applying it.
- For .cube LUTs, ask the user to name the look so it appears nicely in
  the LUT picker.
Skill 07 — Templates & brand

expocut-templates-brand
One-tap brand kits, on repeat.

When the user wants to turn out branded videos on repeat, this Skill teaches the agent to start projects from bundled Templates and Reels, swap themes, and apply a saved brand profile (logo, slogan, socials) without leaving the chat.

---
name: expocut-templates-brand
description: Start branded ExpoCut projects from bundled Templates and Reels, and apply a saved brand profile (logo, slogan, socials). Use whenever the user mentions a "brand kit", a "logo", a "template", or a Reel theme.
version: 1.0.0
tags: [templates, reels, brand, expocut]
---

# Templates & brand kits with ExpoCut

## Pick the starting move

Ask: "Are we starting from one of your saved templates / Reels,
or from scratch?"
- Saved template → list_templatesapply_template { templateId }
- Saved Reel     → list_reelsapply_reel { reelId, themeId? }
- From scratch   → create_project + add layers as normal

## Always check the brand profile first

Before placing layers, look up the user's brand:
list_brand_profiles {}
If a default profile exists, mention the brand by name when proposing
copy: "I'll use Acme's slogan, 'We do things' — sound good?"

To pull the profile into the project in one shot:
apply_brand_profile_to_project { profileId }
This rewrites text layers named "Brand Name" / "Slogan" / "Phone" /
"Email" / "Address" / "Website" and image layers named "Logo" or
"Brand Logo".

## Save a brand for next time

If the user describes a brand, offer to save it:
create_brand_profile {
  name: "Acme Coffee",
  slogan: "Wake up different",
  logo: "file://...png",
  socials: [{ platform: "instagram", handle: "@acme" }],
}
Returns an id. update_brand_profile / delete_brand_profile follow.

## Theme swap on Reels

For Reels, themes are first-class: swap_reel_theme { themeId }
swaps colors / fonts across the whole project without rebuilding.
Always show the user the theme list before swapping — never guess.

## Templates for the user's own video

When the user wants to "save this as a template I can reuse":
save_project_as_template {
  id: "tpl_acme_intro",
  name: "Acme 5s Intro",
  description: "Brand intro for short-form content",
}
Text + media layers become editable slots; everything else bakes in.

## Style of advice

- The default brand profile is implicit — never re-ask "what brand"
  if a default exists.
- Pulling video from a URL is opinionated about trim length. Always
  suggest a sensible window (5–12s for hooks) instead of importing
  the full clip.
- Use the brand profile as the source of truth for socials and
  contact info. Never invent a handle.
- Themes > manual recoloring. If the user wants a different look on
  a Reel, reach for swap_reel_theme before touching color tools.
Worked example · multi-skill

"I have 8 clips from Bali. Make a 30s Reel that pops, with a voiceover."

An assistant loaded with the Primer + Core + Social + Voice + Color Skills would respond like this. Notice how it branches between Skills without losing context.

Quick checks first:
1) Platform & length → Reel, 30s, 9:16 ✓
2) Vibe              → upbeat travel
3) Music             → "got a song, or should I pull from Freesound?"
4) Voiceover         → "any lines in mind, or should I draft 6 short ones?"

# Proposed structure (Core Skill)
Hook   (0–2.5s):  strongest beach shot + spoken hook line.
Middle (2.5–26s): 6 cuts on beat — temple, food, scooter, sunset, waterfall, friend.
Payoff (26–30s):  wide drone with location title + CTA line.

# In ExpoCut
1. create_project      { name:"Bali Reel", aspectRatio:"9:16", resolution:"1080p", fps:30 }
2. add_video_layer ×8  (Gallery)
3. stock_search_music  { query:"upbeat travel 118 BPM" }
4. add_stock_music_layer (chosen track)

# Voiceover (Voice Skill)
5. Draft 6 lines, ~12 words each:
   "Day 2 in Bali — the morning starts before sunrise..."
   ...
6. tts_validate_script { script, voice:"warm-female-en-us" }  → OK, est. 28.4s
7. tts_add_audio_layer { script, voice, start:0.4 }

# Beat-synced cuts (Social Skill)
8. beatMs = 60000/118 = ~508 ms.
9. split_layer at each beat mark; trim each clip to its strongest 1.5s.
10. set_layer_audio_transitions whip-pan at clips 1↔2 and 4↔5; hard cut elsewhere.

# Look (Color Skill)
11. apply_global_color_grade { exposure:+0.15, saturation:+0.20, temp:-8 }
12. set_layer_lut            { layerId:"all", lut:"cinematic-teal-orange", intensity:0.6 }

# Punch (Social Skill)
13. Scale-punch the drop clip at the chorus mark via 4-keyframe transform.scale.

# Captions (Voice Skill)
14. transcribe_audio             { layerId:"voice" }
15. add_caption_layer_from_audio { stylePreset:"bold-pop", position:{x:0.5,y:0.82} }

# Audio mix
16. set_layer_audio_effects { trackId:"music", duck:true, volume:0.3 }

# Export
17. set_export_settings { resolution:"1080p", codec:"h264", fps:30, bitrate:14 }
18. export_project {}

Want me to swap a clip order, or are we good to render?
Companion docs

Where to read more.

Make something good.

Pick the Skill that matches the moment — then create the video in ExpoCut.

Join the beta Read the MCP reference