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. Every installation includes glyphkit>=1.0.0b2,<2 for font processing.

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 included 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. GlyphKit owns font loading, matching, shaping, layout, outlines, subsetting and embedding permissions. Only kinetickit.integrations.glyphkit imports it; importing KineticKit's core does not load GlyphKit. KineticKit retains its neutral text assets and typography protocols, and GlyphKit remains independent of KineticKit.

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.0b2

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.0b2
File Size Uploaded Provenance Actions
kinetickit-1.0.0b2.tar.gz 190.5 kB With provenance Details for kinetickit-1.0.0b2.tar.gz

Built distribution (wheel)

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

Total release size: 360.2 kB

Release files / kinetickit-1.0.0b2.tar.gz

Download URL kinetickit-1.0.0b2.tar.gz
Size 190.5 kB
Tags Source
SHA-256 checksum
How to use checksums
a5a5b8e507907a39af695f7c5300e8f0f5c714e0160b4d943f4e6ed10f26ed1f
BLAKE2b-256 checksum
How to use checksums
59a2fd296fc82b22cce5527d700ae126f08fea032a8bf95432973013d4d80b83
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 19, 2026.

Transparency log

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

Download URL kinetickit-1.0.0b2-py3-none-any.whl
Size 169.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e3ffe5221fe77789ad4330d878aea53ad7148697fdf0fe2b120e6b6c3aeb0004
BLAKE2b-256 checksum
How to use checksums
2992165c82be6ac166654d74835a142d983e5214d8c09fe220bc828be6f841c6
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 19, 2026.

Transparency log

Security for kinetickit 1.0.0b2

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.0b2.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 19, 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