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.

prebuilt for linux + darwin, amd64 + arm64 ffmpeg required for mp4, everything else optional

Made with kyfram

Real renders from examples/. Tap to pause.

4 clips, under 400KB total

intro.lgvball glide, 2s
wave.lgvmorphing wave, 4s
groups.lgvorbit, 3s
dash.lgvproduct cut, 10s, sound on

Every example

Tap a card to preview, tap again for source.

Open docs

Render it:

Install

One line. Prebuilt for your OS. ffmpeg is the only requirement, for mp4 output.

sh -s -- v0.4.1 pins a version edge-tts optional, for neural voices
terminal
curl -fsSL https://kyfram-site-68056d.gitlab.io/install.sh | sh
$ kyfram --version v0.4.1

Quickstart

One script. Two ways to see it.

examples/intro.lgv
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.

CommandDoes 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 --versionPrint 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

Download SKILL.md
Claude Code / Pi
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

Declare the states
let the engine own the middle