Skip to main content

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:

  1. Narrativescene.md. Human Markdown with structured fenced blocks (yaml meta, yaml shot, dialogue). This is what you and the agent edit.
  2. Scene Graphir/scene.json. Pydantic-validated, renderer-agnostic. The single source of truth for tooling. Diffable.
  3. 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 Verifier Protocol with HumanInTheLoopVerifier and LayoutLintVerifier (Phase 5). Future verifiers (MoVer-style formal checks, vision-LM eyeballing) implement the same interface.
  • A TTSProvider and LipSyncProvider Protocol with ElevenLabsTTS and RhubarbLipSync defaults (Phase 3).
  • The an orchestrator 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

an-0.1.1.tar.gz (192.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

an-0.1.1-py3-none-any.whl (89.0 kB view details)

Uploaded Python 3

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

Hashes for an-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7210622ed5e75236c3e69bec33e588b94f8b9c5ad5653bdfd9e3b3d8e99acb01
MD5 d0dcfff26500a01fa2c96201f1d723b0
BLAKE2b-256 956270528ddae1320ae63f4f8e35780b7820b2c2abb7e4876b67ce8e882ec872

See more details on using hashes here.

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

Hashes for an-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 49be30081d4631fcee6f08bccd625ca25976f892a3051d7314e80f0eeb8980fb
MD5 8afed78d8708a9766afac1a1929f9d40
BLAKE2b-256 f46c31b800e0a9e1a556fca6d33dfd90d041a29878033e4d0c8462644c1d66d9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page