kinemo
Explanatory animations (math, algorithms, engineering, data) written in Python, with a live preview and a native core in Rust. The API was designed to be written by people and by AI without errors: one form per concept, full typing, and errors that already carry the fix.
Made with kinemo: docs/media/hero.py.
import kinemo as k
@k.scene
def hello(s: k.Scene):
title = k.Text("Hello, kinemo").place(at="center")
s.play(k.write(title))
s.play(title.to(color=k.BLUE, scale=1.5))
s.wait(1)
pip install kinemo
kinemo new my-video # a project with a first scene (then cd my-video)
kinemo dev scene.py # browser preview with hot reload and a draggable timeline
kinemo check scene.py # errors, lints and timeline summary, without rendering
kinemo render scene.py # MP4 (also webm, mov, gif, png, slides)
The live preview
kinemo dev opens the scene in your browser and rebuilds it on every save. The timeline
shows each animation with its line; drag it to any instant, and the code view follows.
Click an object to see where each value came from (the constructor, a place, an animation)
and edit the literals in place: dragging a number or picking a color writes it back to your
source file.
Why kinemo
- See it while you write it.
kinemo devre-renders on save and lets you scrub to any instant; the frame attis a pure function oft, so jumping around is instant. - Mistakes are caught before you render. Lints find text that leaves the frame, overlaps,
is too small or has too little contrast, at the instant it happens, with the fix;
kinemo check --fixapplies the safe ones. - Fast. The timeline, layout, text, math and rendering are Rust, and frames render in parallel on every core.
- Nothing else to install. Math is typeset without LaTeX, code is highlighted with tree-sitter, fonts are embedded. Video needs ffmpeg, and that is all.
- Built for agents. Typed, one way to do each thing, machine-readable checks and an MCP server: a model can write a scene, check it and fix it without looking at frames.
Compared with Manim
Manim is the reference for this kind of video, and it inspired kinemo. Choose by what you need:
| Manim | kinemo | |
|---|---|---|
| Maturity | Years of use, a large community, many tutorials and plugins | Young (pre-1.0), a small community |
| 3D | Yes | Not yet (2D only) |
| LaTeX | Needs a TeX installation | Built in (typst), no TeX |
| Preview | Render, then watch | Live preview with a scrubbable timeline |
| Time model | Animations run as the script runs | The script builds a timeline first: scrub, parallel render, caching |
| Errors | Python tracebacks | Coded diagnostics with line, instant and fix; visual lints |
| Narration | Plugins | Built in: TTS or recorded audio, word timing, subtitles |
Coming from Manim: Create, .animate and other Manim names are recognized and the error
names the kinemo form; the mental model explains the
differences.
What kinemo does
- The script runs once and produces a timeline. The frame at
tis a pure function oft: you can scrub the timeline, render in parallel and keep everything cached. - Explicit time.
s.playblocks the cursor,s.startdoes not;k.seq,k.par,k.stagger,s.during,s.tempoand clips (@k.clip) compose animations as values. - Constraint layout.
.place(above=tri),k.Row,k.Grid: the relations keep holding while the objects move. - Reactive signals.
x.to(3),k.Text(lambda: f"{x():.1f}"),ball.set(x=other.x). Lambdas and.mapare traced to native code; opaque Python only withk.python(fn). - Events and stateful systems.
k.when,@event.on,s.wait_for,k.integrate,k.simulate— resolved before rendering, up to a fixed point. - Text, code and math with addressable parts (
txt["world"],code.highlight) andk.morphbetween versions. - Charts and data.
k.Axes, plots that grow with a signal, animated zoom; data via Arrow (polars, pandas, pyarrow, duckdb) without copying. - Narration.
s.voicespeaks with a TTS provider, any voice program or recorded audio, beat by beat from a script (k.Script); animations follow the words (v.at("the slope")), music ducks under the voice, andkinemo render --subtitleswrites SRT and WebVTT. - Stable diagnostics. Every error has a code (
K0401), line, instant and fix;kinemo check --fixapplies the safe ones. Manim names (Create,.animate) are recognized and translated. - Built for agents.
kinemo check --json,kinemo inspect --json,kinemo snapand thekinemo mcpserver close the write → verify → fix loop without needing vision.
Installation
pip install kinemo
Wheels for Linux, macOS and Windows, Python ≥ 3.11. Video output needs ffmpeg:
| System | Command |
|---|---|
| macOS | brew install ffmpeg |
| Windows | winget install Gyan.FFmpeg (or choco install ffmpeg) |
| Ubuntu, Debian | sudo apt install ffmpeg |
| Fedora | sudo dnf install ffmpeg |
| Arch | sudo pacman -S ffmpeg |
kinemo doctor shows what kinemo finds (Python, ffmpeg, extras); PNG and SVG frames and
kinemo dev work without ffmpeg. pip install "kinemo[align]" adds word timing for recorded
narration (speech recognition).
Status
kinemo is before 1.0: the API can still change between minor versions. When it does,
kinemo upgrade scene.py rewrites the old forms, and the changelog says what
changed.
kinemo runs 100% on your machine: rendering is local, the kinemo dev preview listens only on
localhost, and nothing is sent anywhere (a TTS provider you configure for narration is the only
network call).
Questions and bugs
Questions, ideas and things you made go in
Discussions; bugs go in
issues (paste the output of kinemo doctor).
From source
Requirements: stable Rust, Python ≥ 3.11, uv and ffmpeg.
See CONTRIBUTING.md for the tests and conventions.
uv venv .venv
uv pip install --python .venv/bin/python maturin pytest numpy polars
source .venv/bin/activate
maturin develop
GPU preview (optional): maturin develop --features gpu compiles the Vello (wgpu) backend
and the kinemo dev server then rasterizes on the GPU when an adapter is available,
falling back to the CPU (tiny-skia) otherwise. The default build does not include wgpu. The
final render stays on the CPU, which is the reference.
Tests
cargo test --workspace # Rust core
python -m pytest -q # API, diagnostics, contracts and golden snapshots
Golden snapshots live in tests/golden/ (CPU renderer, byte-identical). To regenerate
them after an intentional change: KINEMO_UPDATE_GOLDEN=1 pytest tests/python/test_golden.py.
Architecture
The author only sees Python; everything below the IR is Rust.
python/kinemo/ public API (k.*), build phase, handlers, CLI
crates/kinemo-ir IR types (serializable scene)
crates/kinemo-eval timelines, expressions, easing, colors (OKLab)
crates/kinemo-layout geometry, containers, constraints, glyphs
crates/kinemo-text text (rustybuzz), embedded fonts
crates/kinemo-code code highlighting (tree-sitter) and diff
crates/kinemo-math LaTeX → typst, no TeX installation
crates/kinemo-resolve sampling-based visual lints
crates/kinemo-render display list, tiny-skia, morph, movies, segments
crates/kinemo-render-gpu optional Vello (wgpu) backend, tolerance tests vs tiny-skia
crates/kinemo-encode ffmpeg (mp4, webm, mov, gif)
crates/kinemo-server preview (axum + WebSocket)
crates/kinemo-py PyO3 bindings (the only crate that knows about Python)
Documentation
Start with the documentation index: numbered guides from getting started onwards, the complete API reference, examples with rendered frames, and caveats. The design document is docs/specs.md.
The same docs, with a landing page and the examples as videos, build into a static SvelteKit website: see website/README.md.
License
Licensed under either of Apache License 2.0 or MIT, at your option. Unless you state otherwise, any contribution you submit for inclusion in kinemo is dual-licensed as above, without any additional terms.
The embedded DejaVu fonts follow their license. The licenses of
the Rust crates compiled into the wheels are in THIRD_PARTY_LICENSES.md
(scripts/third_party_licenses.py regenerates it).
Metadata
Release files for kinemo 0.19.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kinemo-0.19.0.tar.gz | 708.1 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| kinemo-0.19.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| kinemo-0.19.0-cp311-abi3-manylinux_2_28_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| kinemo-0.19.0-cp311-abi3-manylinux_2_28_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| kinemo-0.19.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| kinemo-0.19.0-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 156.7 MB
Release files / kinemo-0.19.0.tar.gz
| Download URL | kinemo-0.19.0.tar.gz |
|---|---|
| Size | 708.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ce505f8ec9201b8327115c39bffa6b84ea916030b59586cda9b066cdc19cff3c
|
|
BLAKE2b-256 checksum How to use checksums |
da472ea8a259a9a72848dbf6b93332162be03fe7146751d07a95dc69bb4117f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / kinemo-0.19.0-cp311-abi3-win_amd64.whl
| Download URL | kinemo-0.19.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 29.7 MB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
ba88d1a0b87d566689221bb107ecfbd5ab2228e0c89cb026923183779b200602
|
|
BLAKE2b-256 checksum How to use checksums |
534a2756f86c266595b4e6cfd3913afe535a9814107a88086fc14808b8e24670
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / kinemo-0.19.0-cp311-abi3-manylinux_2_28_x86_64.whl
| Download URL | kinemo-0.19.0-cp311-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 31.9 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
e9eeaa16b441dc65cb73bb6cb1aaf20817504225a2868bc6e824708a4e0b49c8
|
|
BLAKE2b-256 checksum How to use checksums |
8a37b06cfcab5fbf579320c83b1364ac760b718c4ff7e14541156d3a48298aa7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / kinemo-0.19.0-cp311-abi3-manylinux_2_28_aarch64.whl
| Download URL | kinemo-0.19.0-cp311-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 33.0 MB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
8d8939ef86cee79d2ff7881f0e8bfcc6f0c4026069fa2dd6b2206001e5751858
|
|
BLAKE2b-256 checksum How to use checksums |
faaa3e315d089304c67073ac8ea1f120e8a469b9010c3d0363bcbc594e57b698
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / kinemo-0.19.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | kinemo-0.19.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 30.6 MB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1eda10f2322b958ee03056d84df057d4df631d99ea2263bd52cc5cd2d6889fa6
|
|
BLAKE2b-256 checksum How to use checksums |
48507bb96a86d16a4149493e735158aec42850f1d2c39be29141d5fbf641d903
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / kinemo-0.19.0-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | kinemo-0.19.0-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 30.8 MB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
49f76e02d6aed92a0a0c8f4d65f81622899f899c32e4f8341759485790207ffa
|
|
BLAKE2b-256 checksum How to use checksums |
e2139efe2e8832af29b9c80d0fd853057fdebc0dd19c66e5e429f96f5298997f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log