Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

KineticKit

Domain-neutral engine for precise, deterministic 2D and 3D animation.

KineticKit owns its scene model, animation model, rendering ports, interaction model and animation output. It depends on no visualization package: anything can take part by being translated into KineticKit points, lines, paths, shapes, text assets, meshes and surfaces.

One scene and one timeline drive three outputs:

Output Capability Install
Animated SVG (native vector, 2D; 3D as projection) vector kinetickit
GIF (streamed, up to 1200 DPI) raster kinetickit[raster]
Self-contained interactive HTML (2D and 3D) interactive kinetickit[interactive]

kinetickit[studio] installs the raster and interactive capabilities together. Python 3.10–3.13.

Status: 1.0 beta. The contracts listed in docs/compatibility.md are intended to be stable; they may still change between pre-releases, always with a changelog entry. See CHANGELOG.md.

Quick start

from kinetickit import Animation, Bounds2D, Point2D, Scene2D, Vec2, ease

dot = Point2D(id="dot", position=Vec2(1, 1), size=8, color="#e4572e")
scene = Scene2D(dot)
scene = scene.bind({scene.camera.ref("view"): Bounds2D(Vec2(0, 0), Vec2(10, 10))})

motion = dot.animate.position.to(Vec2(9, 9), duration=1.5, easing=ease.out_cubic)
animation = Animation(scene, motion)

animation.save("dot.svg", width=400, height=400)  # native Animated SVG
animation.save("dot.gif", width=400, height=400, fps=30)  # needs kinetickit[raster]
animation.save("dot.html", width=400, height=440)  # needs kinetickit[interactive]

Everything is an immutable value: nodes, scenes, motions and snapshots. A motion is composed with .then() / .with_() / .delay() / .repeat() / .yoyo() / .reverse() / .trim(), and the same scene and time always give the same state, independent of any renderer or wall clock.

motion = (
    a.animate.position.to(Vec2(5, 5), duration=1.0)
    .then(b.animate.opacity.to(1.0, duration=0.5).with_(c.animate.size.to(9, duration=0.5)))
    .mark("settled")
)

3D uses the same builders:

from kinetickit import Camera3D, Scene3D, Surface3D, Vec3

scene = Scene3D(surface, camera=Camera3D(position=Vec3(5, -6, 4), target=Vec3(0, 0, 0)))
Animation(scene, scene.camera.animate.position.to(Vec3(-5, -6, 4), duration=2.0)).save("orbit.html")

What you get

  • Timing: deterministic frames (N = max(2, round(D·fps)), both endpoints included), easing families plus cubic Bézier, an extensible interpolator registry, keyframes, markers.
  • Scenes: precise 2D points, lines, paths, shapes, groups (transform, clip), overlay and camera; 3D points, polylines, meshes, surfaces, lights, perspective/orthographic cameras.
  • Morphing: automatic path normalization, mesh/surface correspondence with explicit overrides and diagnostics, and SceneTransition between scenes by stable ids.
  • Interaction: portable events and data-only actions bound to node ids, playback state machine, controls; required bindings fail before output, optional ones degrade explicitly.
  • Accessibility: per-object roles/labels/descriptions/reading order, reduced-motion policy, text alternatives and keyboard-operable controls.
  • Typography: text arrives as a neutral TextAsset; the optional GlyphKit adapter turns caller-provided fonts into assets and embeds permission-checked subsets.
  • Quality: conformance fixtures and suites, golden artifacts, performance budgets.

Outputs, fallbacks and what each format preserves or degrades: docs/outputs.md. Migrating from MosaicKit or utility-viz animation: docs/migration.md.

Architecture

Layer May know Must not know
Motion core (easing, interpolation, timeline, tween, keyframes) time, values, protocols scenes, renderers
Scene model (geometry, scene, styles, morph, transitions) geometry, styles, object ids backend objects
Renderers (renderers.vector / raster / interactive) scene snapshots, capabilities consumer domain models
Exporters (exporters) frames, artifacts, destinations visualization logic

Boundaries are enforced by import-linter contracts and AST tests. Third-party engines (Matplotlib, Plotly, Pillow) live only in private _* modules and never appear in public API.

Development

uv sync --all-extras
uv run pytest
uv run ruff check . && uv run ruff format --check . && uv run mypy && uv run lint-imports
uv run python -m kinetickit.conformance      # shared suites + performance budgets

Examples live in examples/ and use only public API.

Metadata

Release files for kinetickit 1.0.0b1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kinetickit 1.0.0b1
File Size Uploaded Provenance Actions
kinetickit-1.0.0b1.tar.gz 188.8 kB With provenance Details for kinetickit-1.0.0b1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for kinetickit 1.0.0b1
File Interpreter ABI Platform Actions
kinetickit-1.0.0b1-py3-none-any.whl Python 3 none any Details for kinetickit-1.0.0b1-py3-none-any.whl

Total release size: 357.7 kB

Release files / kinetickit-1.0.0b1.tar.gz

Download URL kinetickit-1.0.0b1.tar.gz
Size 188.8 kB
Tags Source
SHA-256 checksum
How to use checksums
fbed679ba8b74033b1541b33da60bb4d1cfdbaef9e781de3ebfbda83c93ff11b
BLAKE2b-256 checksum
How to use checksums
d711f45b3fbc0983c48863edcf9663cef8e36fa86eb3383f87484438d45ebd65
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 13, 2026.

Transparency log

Release files / kinetickit-1.0.0b1-py3-none-any.whl

Download URL kinetickit-1.0.0b1-py3-none-any.whl
Size 168.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7cd87e9fe2c2fa51298f2f714ad8f250f8e8e5ede10fc032fbf0b7027df96850
BLAKE2b-256 checksum
How to use checksums
504283e862f1d10a34e43da06ddc859a9bf9166da155a145d2a23b4fbd81f287
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 13, 2026.

Transparency log

Security for kinetickit 1.0.0b1

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for kinetickit-1.0.0b1.tar.gz

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 13, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page