What
Make keyframe easing byte-identical to CapCut's UI, and add a ken-burns convenience preset built on the corrected easing.
Why it matters
keyframe exists, but the easing curve the CLI writes doesn't match what CapCut produces from its own UI. A Cubic-Out keyframe authored by the CLI animates differently than the same move made in the app, so drafts don't round-trip faithfully. Animation params and timing are under-specified across the whole domain, which makes this hard to get right by guessing:
Hommy-master/capcut-mate#50 — in_/out_/loop_animation_duration (microseconds) undocumented.
GuanYixuan/pyJianYingDraft#176 — per-word/animation extraction fails on newer encrypted templates.
Getting the curve exactly right is what makes CLI-authored motion indistinguishable from hand-authored motion.
Where in the code
- The keyframe command handler in
src/index.ts (keyframe verb) and its spec in src/command-specs.ts.
- Wherever keyframe values/interpolation are computed (search for the keyframe write path).
Proposed approach
- Capture an oracle: make the same move in CapCut's UI, export, and record the exact keyframe values it writes for Cubic Out.
- Fix the CLI's easing math so it reproduces those values (the fork found it should be
ratio x delta, not a fixed offset).
- Lock it with a byte-identity test against the UI oracle fixture.
- Add a
ken-burns preset (slow zoom/pan) that composes the corrected easing so users don't hand-build keyframes.
Acceptance criteria
Prior art
The Davidb-2107/capcut-cli fork already landed the Cubic-Out delta-scaling fix plus a byte-identity oracle test and a ken-burns preset. Well-suited to a contributor who enjoys precise, test-anchored work.
What
Make keyframe easing byte-identical to CapCut's UI, and add a
ken-burnsconvenience preset built on the corrected easing.Why it matters
keyframeexists, but the easing curve the CLI writes doesn't match what CapCut produces from its own UI. A Cubic-Out keyframe authored by the CLI animates differently than the same move made in the app, so drafts don't round-trip faithfully. Animation params and timing are under-specified across the whole domain, which makes this hard to get right by guessing:Hommy-master/capcut-mate#50—in_/out_/loop_animation_duration(microseconds) undocumented.GuanYixuan/pyJianYingDraft#176— per-word/animation extraction fails on newer encrypted templates.Getting the curve exactly right is what makes CLI-authored motion indistinguishable from hand-authored motion.
Where in the code
src/index.ts(keyframeverb) and its spec insrc/command-specs.ts.Proposed approach
ratio x delta, not a fixed offset).ken-burnspreset (slow zoom/pan) that composes the corrected easing so users don't hand-build keyframes.Acceptance criteria
ken-burnspreset produces a smooth zoom/pan using the corrected easing.docs/command-reference.mddocuments the animation-duration units (microseconds) surfaced by capcut-mate#50.Prior art
The
Davidb-2107/capcut-clifork already landed the Cubic-Out delta-scaling fix plus a byte-identity oracle test and a ken-burns preset. Well-suited to a contributor who enjoys precise, test-anchored work.