AI-driven structured animation in Python.
Project description
an
AI-driven structured animation in Python. The user is the director; the AI agent is the assistant orchestrator; existing animation libraries (Manim, a custom 2D-cutout runtime, Remotion) are the executors.
pip install an
What it does (and what it doesn't, yet)
an lets you describe a scene in natural language inside a Claude Code session and — when the cutout backend lands in Phase 2 — have it rendered as an mp4. The package itself is small: a Pydantic-validated Scene IR that is the single source of truth, a dol-backed project mall for persisting characters / voices / environments / artifacts, protocols for renderers / TTS / lip-sync / verification, and a skill suite that teaches the agent how to drive it all.
Phase 1 (current): the substrate. Scene IR, composition combinators, stores, CLI, project init, dev skills. No rendering yet.
Phase 2–7 (roadmap): cutout renderer, audio pipeline (ElevenLabs + Rhubarb), the v0.1 dialogue cartoon demo, verifier implementations, the iterative edit loop, and adapter smoke tests for Manim / Remotion / whiteboard.
30-second tour
# Diagnose backend deps before you start
an check
# Create a fresh project
an init my-scene
cd my-scene
# Edit scene.md in your editor of choice...
# Then validate
an validate .
A project is a small directory: a human-editable scene.md, a Pydantic-validated ir/scene.json (the SSOT), assets/ (characters, environments, voices, styles), artifacts/ (intermediate audio, viseme tracks, per-shot mp4s), and output/ for finished renders.
3-minute tour
an separates a scene into three layers:
- Narrative —
scene.md. Human Markdown with structured fenced blocks (yaml meta,yaml shot,dialogue). This is what you and the agent edit. - Scene Graph —
ir/scene.json. Pydantic-validated, renderer-agnostic. The single source of truth for tooling. Diffable. - Render Code — generated per-backend. Disposable. Never edited by hand.
Composition is fluent in Python and flattens to a canonical timeline:
from an import sequence, parallel, tween, delay, flatten
action = sequence(
tween("charlie/torso", "rotation", to=10.0, duration=1.0),
delay(0.5),
tween("charlie/torso", "rotation", to=0.0, duration=1.0),
)
flat = flatten(action)
# [FlatAction(start=0.0, end=1.0, ...), FlatAction(start=1.5, end=2.5, ...)]
Persistence goes through a project mall, a dict of dol-backed MutableMappings:
from an import build_project_mall
mall = build_project_mall("my-scene", ensure=True)
mall["voices"]["maya-warm"] = {"provider": "elevenlabs", "voice_id": "..."}
mall["scenes"]["main"] # returns a SceneIR
Backends register against a Renderer Protocol; the orchestrator picks one per shot based on the shot's style ("cutout" | "manim" | "motion_graphics" | "whiteboard").
Designed-in but not yet shipped
- A
VerifierProtocol withHumanInTheLoopVerifierandLayoutLintVerifier(Phase 5). Future verifiers (MoVer-style formal checks, vision-LM eyeballing) implement the same interface. - A
TTSProviderandLipSyncProviderProtocol withElevenLabsTTSandRhubarbLipSyncdefaults (Phase 3). - The
anorchestrator skill that runs the spec → IR → render → verify → iterate loop (Phase 5).
Reference
- Architectural pillars and per-subsystem reading order:
CLAUDE.md. - Deep design reports (~250 KB total):
misc/docs/. - The skills the agent uses to drive an:
.claude/skills/.
Non-goals
No 3D, no prompt-to-video generative models as primary renderer, no real-time / interactive output, no SaaS hosting, no music or sound-effect generation, no in-house GUI, no editing of pre-existing video footage. an synthesizes; it does not cut.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file an-0.1.1.tar.gz.
File metadata
- Download URL: an-0.1.1.tar.gz
- Upload date:
- Size: 192.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7210622ed5e75236c3e69bec33e588b94f8b9c5ad5653bdfd9e3b3d8e99acb01
|
|
| MD5 |
d0dcfff26500a01fa2c96201f1d723b0
|
|
| BLAKE2b-256 |
956270528ddae1320ae63f4f8e35780b7820b2c2abb7e4876b67ce8e882ec872
|
File details
Details for the file an-0.1.1-py3-none-any.whl.
File metadata
- Download URL: an-0.1.1-py3-none-any.whl
- Upload date:
- Size: 89.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49be30081d4631fcee6f08bccd625ca25976f892a3051d7314e80f0eeb8980fb
|
|
| MD5 |
8afed78d8708a9766afac1a1929f9d40
|
|
| BLAKE2b-256 |
f46c31b800e0a9e1a556fca6d33dfd90d041a29878033e4d0c8462644c1d66d9
|