Motion graphics
without touching a timeline UI.
Declare what things look like at specific times. Go interpolates every frame in between and hands it to ffmpeg — no timeline dragging, no callback wiring, just numbers in a script.
Made with kyfram
Real renders from examples/. Tap to pause.
4 clips, under 400KB total
Every example
Tap a card to preview, tap again for source.
Install
One line. Prebuilt for your OS. ffmpeg is the only requirement, for mp4 output.
curl -fsSL https://kyfram-site-68056d.gitlab.io/install.sh | sh
Quickstart
One script. Two ways to see it.
scene(2, 30)
shape("ball", "circle", table{
"0": table{x: 100, y: 160, r: 80, color: "#e64c40"},
"2": table{x: 320, y: 160, r: 80, color: "#e64c40"},
})
text("caption", table{
"0": table{content: "hello kyfram", x: 320, y: 300, size: 28, color: "#ffffff"},
})
Times are quoted seconds. Past the last keyframe, values hold — no extrapolation.
What it does
Timeline, then interpolate, then gg, then ffmpeg. Nothing else.
Declarative keyframes
Times are quoted strings, sorted by engine. Numbers lerp, colors lerp per channel, text snaps.
Easing per segment
linear, easeIn/Out/InOut, cubicIn/Out, sine. Declare it on the earlier key.
Rich primitives
Twelve kinds: circle, rect, roundRect, polygon, star, wave, path, image, text. Plus gradients and multiply/screen/add.
Groups and camera
group() keeps local x/y, children scale and rotate with it. camera() pans and zooms the whole scene.
Audio and voice
audio() muxes tracks. tts() goes Edge neural, then espeak-ng, then beeps, and returns word timings for captions.
Built for batch
text_file() plus --var k=v turns one script into many renders. kyfram view is hot reload, render is cold.
CLI
Two verbs. render writes mp4 or png, view opens localhost with scrub.
| Command | Does what |
|---|---|
| kyfram render [flags] <script.lgv> | Render to mp4 or png |
| kyfram view [--port n] <script.lgv> | Live preview with scrub |
| kyfram help [command] | Structured help |
| kyfram --version | Print version |
flags: --out --fps --width --height --crf --preset --format --var k=v
Use kyfram with your agent
A skill file that teaches your coding agent every declaration, kind, flag, and gotcha. Docs
curl -fsSL https://kyfram-site-68056d.gitlab.io/skills/kyfram/SKILL.md -o SKILL.md
# Claude Code: place at .claude/skills/kyfram/SKILL.md
# Pi: place at .pi/skills/kyfram/SKILL.md