# an > AI-driven structured animation in Python: scene.md to rendered video. ## Pages in this subsection - [an](an.html.md): an — AI-driven structured animation. - [an.adapters](an.adapters.html.md): Renderer adapters — facades over backends (the stage, Manim, Remotion, whiteboard). - [an.adapters.cutout](an.adapters.cutout.html.md): The cut-out backend’s old package: the stage moved to `an.stage` (an#247). - [an.adapters.cutout.cache_key](an.adapters.cutout.cache_key.html.md): Moved to `an.stage.cache_key` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.canvas_capture](an.adapters.cutout.canvas_capture.html.md): Moved to `an.stage.canvas_capture` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.channel](an.adapters.cutout.channel.html.md): Channel evaluation — moved to `an.timing.channel` (the timing kernel). - [an.adapters.cutout.clip](an.adapters.cutout.clip.html.md): Clips, loop modes and poses — moved to `an.timing.clip` (the timing kernel). - [an.adapters.cutout.compile](an.adapters.cutout.compile.html.md): Moved to `an.stage.compile` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.easing](an.adapters.cutout.easing.html.md): Moved to `an.stage.easing` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.fidelity](an.adapters.cutout.fidelity.html.md): Moved to `an.stage.fidelity` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.path](an.adapters.cutout.path.html.md): Moved to `an.stage.path_geometry` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.render](an.adapters.cutout.render.html.md): Moved to `an.stage.render` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.runtime_files](an.adapters.cutout.runtime_files.html.md): Moved to `an.stage.runtime_files` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.serialize](an.adapters.cutout.serialize.html.md): Moved to `an.stage.serialize` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.shutter](an.adapters.cutout.shutter.html.md): Moved to `an.media.shutter` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.supersample](an.adapters.cutout.supersample.html.md): Moved to `an.media.supersample` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.surface](an.adapters.cutout.surface.html.md): Moved to `an.stage.surface` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.text](an.adapters.cutout.text.html.md): Moved to `an.stage.text_layout` (an#247); this path is a LIVE alias of it. - [an.adapters.cutout.timeline](an.adapters.cutout.timeline.html.md): Moved to `an.stage.timeline` (an#247); this path is a LIVE alias of it. - [an.adapters.manim_adapter](an.adapters.manim_adapter.html.md): ManimRenderer — a whole-shot renderer for opaque Manim scene files (an#279). - [an.adapters.remotion_adapter](an.adapters.remotion_adapter.html.md): RemotionRenderer — invoke `npx remotion render` against a generated TSX project. - [an.adapters.whiteboard](an.adapters.whiteboard.html.md): WhiteboardRenderer — stub for hand-drawn / chalkboard-style animation. - [an.assemble](an.assemble.html.md): Film assembly: rendered shots → one film, with transitions and a sound layer. - [an.audio](an.audio.html.md): Audio pipeline — TTS and lip-sync providers + orchestration. - [an.audio.cli](an.audio.cli.html.md): `an voices ...` — browse a TTS provider’s voices from the shell (an#209). - [an.audio.effects](an.audio.effects.html.md): Voice effects: a deterministic transform applied to a synthesized line (an#163). - [an.audio.elevenlabs_tts](an.audio.elevenlabs_tts.html.md): ElevenLabsTTS — real speech via the ElevenLabs API. Requires ELEVEN_API_KEY. - [an.audio.lipsync](an.audio.lipsync.html.md): Lip-sync provider protocol + viseme dataclasses. - [an.audio.loudness](an.audio.loudness.html.md): Voice loudness: one integrated loudness for every voice of a film (an#315). - [an.audio.mac_say_tts](an.audio.mac_say_tts.html.md): MacSayTTS — audible offline speech via macOS’s built-in `say` command. - [an.audio.offline_tts](an.audio.offline_tts.html.md): OfflineTTS — produces silent audio of plausible duration. No network, no keys. - [an.audio.pipeline](an.audio.pipeline.html.md): Audio pipeline orchestration: dialogue → audio → visemes → IR mutation. - [an.audio.providers](an.audio.providers.html.md): Provider factory: name → concrete TTS/LipSync provider instance. - [an.audio.takes](an.audio.takes.html.md): Best-of-N takes: re-roll a line, score every take, keep the best, record the choice. - [an.audio.tts](an.audio.tts.html.md): TTS provider protocol + supporting dataclasses. - [an.audio.voices](an.audio.voices.html.md): Which voice speaks a dialogue line: the character → voice binding (an#194). - [an.base](an.base.html.md): Core types, constants, and re-exports for an. - [an.bench](an.bench.html.md): `an bench` — render a fixed corpus, compute a metrics panel, write one ledger row. - [an.bench.capture](an.bench.capture.html.md): Render one corpus fixture into a throwaway copy, and hand back its artifacts. - [an.bench.compare](an.bench.compare.html.md): `an bench --compare`: read two ledger rows, and **refuse when they are not comparable**. - [an.bench.contract](an.bench.contract.html.md): `scene_contract_sha256`: the fact that decides whether two rows are comparable. - [an.bench.core_corpus](an.bench.core_corpus.html.md): The core corpus: what `an` renders with no character and no genre (ADR 0001 decision 7). - [an.bench.corpus](an.bench.corpus.html.md): The bench corpus: which projects are measured, and what each must actually render. - [an.bench.environment](an.bench.environment.html.md): The environment tuple — the fields that decide whether two rows may be compared. - [an.bench.golden](an.bench.golden.html.md): The golden gate: committed frames, compared on **decoded pixels**. - [an.bench.imageio](an.bench.imageio.html.md): The pinned ffmpeg decodes, and the lossless leg every encode-side metric - [an.bench.ledger](an.bench.ledger.html.md): The ledger: three blocks that must never be mixed, and the guards that keep them apart. - [an.bench.masks](an.bench.masks.html.md): Every mask the panel is computed over, and the recorded operator for each. - [an.bench.metrics](an.bench.metrics.html.md): The metric panel: pure numpy, no I/O, no subprocess. - [an.bench.mutants](an.bench.mutants.html.md): The guard mutants: “I mutation-tested it” as a runnable artifact, not a claim. - [an.bench.mutations](an.bench.mutations.html.md): The levers: deliberate, declared changes through seams the shipped code already has. - [an.bench.palette](an.bench.palette.html.md): Derive the set of colours a compiled shot declared — never hand-pin it. - [an.bench.paths](an.bench.paths.html.md): Where the bench reads its corpus from and writes its ledger to. - [an.bench.png](an.bench.png.html.md): A filter-0 PNG writer and a full-filter reader — numpy and stdlib only. - [an.bench.registry](an.bench.registry.html.md): The metric declaration table — what each number is, and which way it should move. - [an.bench.run](an.bench.run.html.md): `run_bench`: render the corpus, compute the panel, write one ledger row. - [an.bench.stage](an.bench.stage.html.md): Measuring a pan: does the stage move as planes, or as one rigid image? - [an.build](an.build.html.md): Incremental re-processing: content-addressed build stages (ADR 0004). - [an.build.cli](an.build.cli.html.md): `an cache …` — the shot cache from the shell (an#274). - [an.build.derived](an.build.derived.html.md): A renderer’s derived stores, as `an cache gc` collects them (an#299). - [an.build.gc](an.build.gc.html.md): Garbage collection of the shot cache: `an cache gc` and `an cache info` (an#274). - [an.build.keys](an.build.keys.html.md): Cache keys for build stages: canonical digests, the project fallback, keyers. - [an.build.reads](an.build.reads.html.md): What a shot read: a read-recording view of the mall, and the digests of what it saw. - [an.build.shot_cache](an.build.shot_cache.html.md): The content-keyed shot cache: ADR 0004’s first slice, behind the `incremental=` seam. - [an.capabilities](an.capabilities.html.md): Capabilities: what an asset, an engine or the environment affords, and the one matcher. - [an.capabilities.subjects](an.capabilities.subjects.html.md): The core’s two non-asset subjects: the engine (a renderer) and the environment. - [an.captions](an.captions.html.md): Captions from the word timings the audio pipeline already computes (an#175). - [an.conftest](an.conftest.html.md): Collection rules for the package’s own doctests. - [an.credits](an.credits.html.md): What a rendered video owes, and to whom. - [an.data](an.data.html.md): Bundled non-Python resources (cutout JS runtime, etc.). - [an.data.cutout_runtime](an.data.cutout_runtime.html.md): Moved to `an.stage.runtime` (an#247); this path is a LIVE alias of it. - [an.determinism](an.determinism.html.md): The determinism perimeter: what must stay true for a render to be reproducible. - [an.engines](an.engines.html.md): Engines: seekable things the core drives frame by frame, and the renderer that drives them. - [an.engines.capture](an.engines.capture.html.md): The capture loop: drive a session through every frame, resolve, write – for ANY engine. - [an.engines.conformance](an.engines.conformance.html.md): Conformance of a TIME-driven engine against the timing kernel’s golden vectors. - [an.engines.frame_stage](an.engines.frame_stage.html.md): `frame_stage_renderer(engine)`: any seekable engine becomes a `Renderer`. - [an.engines.protocol](an.engines.protocol.html.md): The `Engine` protocol: a seekable thing that turns a time, or a state, into a frame. - [an.environments](an.environments.html.md): Moved to `an.stage.environments` (an#247); this path is a LIVE alias of it. - [an.formats](an.formats.html.md): Numbers as text: a declared subset of d3-format, for counters (an#342). - [an.frame_clock](an.frame_clock.html.md): The frame clock: WHEN each output frame samples scene time. - [an.genres](an.genres.html.md): Genres: what a kind of animation adds to the core, declared as one object. - [an.genres.registry](an.genres.registry.html.md): The core’s open registries: action kinds, entity kinds, semantic checks, md sugar, compile passes. - [an.ir](an.ir.html.md): Scene IR — the single source of truth for a scene. - [an.ir.assets](an.ir.assets.html.md): Where a third-party asset came from, and what its licence obliges. - [an.ir.camera](an.ir.camera.html.md): Camera semantics: the named moves, and the one resolver that expands them. - [an.ir.compose](an.ir.compose.html.md): Composition combinators for authoring action trees, plus a flattener. - [an.ir.schema](an.ir.schema.html.md): Pydantic v2 models for the Scene IR. - [an.ir.validate](an.ir.validate.html.md): Schema and semantic validation for SceneIR documents. - [an.iterate](an.iterate.html.md): Iterative edit loop — free-text instruction → IR patch via Claude → re-render. - [an.library](an.library.html.md): The asset library: reusable assets that outlive their videos (ADR 0005). - [an.library.affordances](an.library.affordances.html.md): Affordances for the library: the capability registry, re-exported from `an.capabilities`. - [an.library.api](an.library.api.html.md): The library’s verbs: `publish`, `find`, `vocabulary`, `show`, `promote`, `retire`. - [an.library.cli](an.library.cli.html.md): `an library …` — the asset library from the shell, over the same functions as Python. - [an.library.federation](an.library.federation.html.md): Libraries federated by a search path: one read view, writes to the owner (plan §1 decision 7). - [an.library.floor](an.library.floor.html.md): The rights floor of a blob: the strictest statement any library on this machine makes about its byte... - [an.library.ids](an.library.ids.html.md): Asset ids, version labels and library references — the library’s persisted names. - [an.library.kinds](an.library.kinds.html.md): Asset kinds: the `kind` facet’s vocabulary, and where each kind lives in a project. - [an.library.kits](an.library.kits.html.md): Kits: a curated, versioned set of library assets that a project checks out in one call. - [an.library.lock](an.library.lock.html.md): The project lockfile, as the asset library sees it (re-exported from `an.stores.library_lock`). - [an.library.registry](an.library.registry.html.md): The machine’s memory of its libraries: every root ever written, and every statement ever made (an#24... - [an.library.rights](an.library.rights.html.md): Rights on every version: the most restrictive licence class wins (ADR 0005 decision 10, design §9). - [an.library.root](an.library.root.html.md): Where a package’s library lives on disk: one root per package (ADR 0005 §2, plan §1 decisions 7–8). - [an.library.sheets](an.library.sheets.html.md): `an library sheet`: a contact sheet of library versions, one specimen frame each (an#347). - [an.library.stores](an.library.stores.html.md): The library mall: `records`, `versions` and `blobs`, each an injected `MutableMapping`. - [an.live_api](an.live_api.html.md): The one switch that says “yes, this run may spend money”. - [an.mcp](an.mcp.html.md): The `an` MCP server: a curated, generated surface over the vocabulary and the capability registry. - [an.mcp.server](an.mcp.server.html.md): Build and serve the `an` MCP server with `py2mcp` (the `an[mcp]` extra). - [an.mcp.tools](an.mcp.tools.html.md): The curated MCP tools: plain functions over the vocabulary, the capability registry and a project. - [an.measurements](an.measurements.html.md): Measured durations: shots whose renderer, not their author, decides their length. - [an.media](an.media.html.md): Frames to deliverables, engine-independent: the frame stage’s resolves and the sinks. - [an.media.frames](an.media.frames.html.md): The frame directory every engine writes and every sink reads. - [an.media.gif](an.media.gif.html.md): The GIF sink: ONE palette recipe, for flat 2D art. - [an.media.grid](an.media.grid.html.md): Tile images into one contact sheet: `tile()` (an#347). - [an.media.mp4](an.media.mp4.html.md): The MP4 sink: PNG frames -> the delivered H.264 mp4, with the pinned argv. - [an.media.shutter](an.media.shutter.html.md): The temporal half of the frame stage: average several instants into one frame. - [an.media.sinks](an.media.sinks.html.md): Frame sinks: a frame directory in, one deliverable out – one sink per format. - [an.media.supersample](an.media.supersample.html.md): Render bigger, then resolve back exactly — the supersample knob’s two halves. - [an.motion](an.motion.html.md): Motion presets: a named vocabulary of moves, as authoring macros. - [an.orchestrate](an.orchestrate.html.md): Orchestrator: validate → audio → render → verify. - [an.paint](an.paint.html.md): Paint: what fills a shape when one flat colour is not enough – a gradient. - [an.paths](an.paths.html.md): Moved to `an.stage.paths` (an#247); this path is a LIVE alias of it. - [an.preview](an.preview.html.md): Moved to `an.stage.preview` (an#247); this path is a LIVE alias of it. - [an.probe](an.probe.html.md): `an probe`: a shot’s frame at chosen instants, through the very path `render` draws it (an#347). - [an.project](an.project.html.md): Project init/load/save — the on-disk anatomy of an an project. - [an.props](an.props.html.md): Moved to `an.stage.props` (an#247); this path is a LIVE alias of it. - [an.props_cli](an.props_cli.html.md): `an props …` — a prop’s asset folder from the shell (an#340). - [an.raster](an.raster.html.md): Moved to `an.stage.raster` (an#247); this path is a LIVE alias of it. - [an.render](an.render.html.md): Project-level rendering: per-shot mp4 → final composited mp4 via ffmpeg concat. - [an.semantic](an.semantic.html.md): The semantic layer: one versioned vocabulary registry, methods, aspects and the matcher. - [an.semantic.describe](an.semantic.describe.html.md): Describe an asset: what it affords, and per aspect what applies and what is missing. - [an.semantic.digest](an.semantic.digest.html.md): Which vocabulary entries a shot names, at which versions: the shot’s vocabulary digest. - [an.semantic.docs](an.semantic.docs.html.md): The vocabulary section of the downstream `an` skill, generated from the registry. - [an.semantic.export](an.semantic.export.html.md): The vocabulary as a published, code-free contract file: `an/data/timing/vocabulary.json`. - [an.semantic.matcher](an.semantic.matcher.html.md): The three queries and the policy (ADR 0002 decision 4): `applicable`, `why_not`, `resolve`. - [an.semantic.prompt](an.semantic.prompt.html.md): The `an iterate` system prompt, generated from the vocabulary registry. - [an.semantic.registry](an.semantic.registry.html.md): The one vocabulary registry (ADR 0003 decision 6): entries and aspects, by owner. - [an.semantic.seeds](an.semantic.seeds.html.md): The core’s vocabulary: views over the kind and easing registries, camera moves, IR fields. - [an.semantic.views](an.semantic.views.html.md): View spaces: what a camera move moves through, defined once for every engine (an#257). - [an.sound_anchors](an.sound_anchors.html.md): Sound cues timed by the picture (an#317): `at: {when: <node>, reaches: {y: px}}` and `until:`. - [an.sound_fetch](an.sound_fetch.html.md): Add a sound from a URL, with its provenance and the cut taken (an#318). - [an.sounds](an.sounds.html.md): Sound assets: what the sound layer plays, where it came from, and a synthesizer. - [an.sounds_cli](an.sounds_cli.html.md): `an sounds …`: the project’s sounds store from the shell (an#318). - [an.stage](an.stage.html.md): The 2D stage: the default engine, shipped with `an` but outside the core (an#247). - [an.stage.cache_key](an.stage.cache_key.html.md): What a cut-out shot render reads: the keyer behind its shot-cache key (ADR 0004). - [an.stage.canvas_capture](an.stage.canvas_capture.html.md): The canvas capture path: frames read from the page, not photographed off the screen. - [an.stage.compile](an.stage.compile.html.md): Compile a top-level `Shot` (renderer=”cutout”) into a `CutoutSceneJSON`. - [an.stage.counters](an.stage.counters.html.md): A counter, lowered at compile: a number that reads as text (an#342, T2 of an#331). - [an.stage.easing](an.stage.easing.html.md): The stage engine’s easing vocabulary — a view of `an.timing.easing`. - [an.stage.environments](an.stage.environments.html.md): Environments: a stage made of planes, at declared depths. - [an.stage.fidelity](an.stage.fidelity.html.md): How faithfully a compiled scene reproduces the art it was built from. - [an.stage.gradients](an.stage.gradients.html.md): Gradient fills on the stage: a `Gradient` drawn as an inline SVG texture. - [an.stage.path_geometry](an.stage.path_geometry.html.md): Stroked-path geometry — the executable spec of `runtime.js::pathGeometry`. - [an.stage.path_wobble](an.stage.path_wobble.html.md): A hand-drawn wobble for stroked paths, applied at compile time (an#161). - [an.stage.paths](an.stage.paths.html.md): Stroked paths: routes, invasion arrows, borders, timelines, connectors. - [an.stage.preview](an.stage.preview.html.md): Live preview server: render a project’s current scene in a browser, reloading on edit. - [an.stage.prop_validate](an.stage.prop_validate.html.md): Check a prop’s asset folder offline, and say what a prop must be (an#340). - [an.stage.props](an.stage.props.html.md): Props: a rig whose art is not a person. - [an.stage.raster](an.stage.raster.html.md): Raster art: what a PNG, JPEG or WebP is, read from its header (an#211). - [an.stage.render](an.stage.render.html.md): The 2D stage engine (`runtime.js` in headless Chromium), and the cut-out renderer built on it. - [an.stage.rig](an.stage.rig.html.md): The rig model the stage draws: bones, slots, skins and attachments. - [an.stage.runtime](an.stage.runtime.html.md): Cutout JS runtime — see README.md in this directory. - [an.stage.runtime_files](an.stage.runtime_files.html.md): Locate the bundled cutout JS runtime files. - [an.stage.serialize](an.stage.serialize.html.md): JSON contract between the Python compiler and the (future) JS runtime. - [an.stage.snapshot](an.stage.snapshot.html.md): Rasterise art files to PNG in the browser the stage already uses (an#347). - [an.stage.surface](an.stage.surface.html.md): Surface treatments, compiled (an#163 gap 5): outline, paper-gap shadow, glow, grain. - [an.stage.text](an.stage.text.html.md): Words on screen: title cards, labels, and text you can animate word by word. - [an.stage.text_layout](an.stage.text_layout.html.md): A text block, compiled: one node per unit, each an SVG sprite (an#155). - [an.stage.timeline](an.stage.timeline.html.md): Stage timeline helpers: the compiled scene as a `Timeline`, and screen space. - [an.stage.tree](an.stage.tree.html.md): The scene tree’s paths: the ONE Python statement of how `runtime.js` indexes nodes (an#343). - [an.stores](an.stores.html.md): Project mall: a dict of dol-backed `MutableMapping` stores. - [an.stores.artifacts](an.stores.artifacts.html.md): Artifact stores — derived, regeneratable products of the pipeline. - [an.stores.characters](an.stores.characters.html.md): Characters store — descriptor + sidecar folder per character. - [an.stores.decisions](an.stores.decisions.html.md): Decision log — append-only JSONL of agent decisions and user approvals. - [an.stores.environments](an.stores.environments.html.md): Environments store — backgrounds, set pieces, and prop bundles. - [an.stores.library_lock](an.stores.library_lock.html.md): The project lockfile: which library version each checked-out asset came from. - [an.stores.props](an.stores.props.html.md): Props store — descriptor + sidecar folder per prop. - [an.stores.scenes](an.stores.scenes.html.md): Scenes store — wraps the project’s `scene.md` + `ir/scene.json` pair. - [an.stores.sounds](an.stores.sounds.html.md): Sounds store — one directory per sound: `sound.json` beside `audio.wav`. - [an.stores.sources](an.stores.sources.html.md): The project’s opaque scene sources: files a whole-shot renderer runs as they are. - [an.stores.styles](an.stores.styles.html.md): Styles store — visual style presets (color palette, line weight, fonts). - [an.stores.voices](an.stores.voices.html.md): Voices store — pure JSON; one entry per voice. - [an.styles](an.styles.html.md): StylePack: art direction as a document, and the first reader the styles store has had. - [an.text](an.text.html.md): Moved to `an.stage.text` (an#247); this path is a LIVE alias of it. - [an.timing](an.timing.html.md): The timing kernel: what is on screen at time `t`, as a pure function. - [an.timing.address](an.timing.address.html.md): The address grammar: one way to name an animatable value, in every genre. - [an.timing.channel](an.timing.channel.html.md): Channel: keyframes for a single (target, property) pair, evaluated at time t. - [an.timing.clip](an.timing.clip.html.md): Clip: a named bundle of channels with a duration and loop mode. - [an.timing.contract](an.timing.contract.html.md): The timing kernel’s cross-language contract: five JSON files, generated from the registries. - [an.timing.easing](an.timing.easing.html.md): The easing registry: every named timing curve, each with the solver that computes it. - [an.timing.flat](an.timing.flat.html.md): The authored flat timeline: `(start, end, address, change)` rows. - [an.timing.kinds](an.timing.kinds.html.md): Field kinds: the declared interpolator of each animatable property. - [an.timing.spaces](an.timing.spaces.html.md): Property spaces: what an entity kind’s properties ARE, declared once. - [an.timing.timeline](an.timing.timeline.html.md): Timeline: tracks of placed clips with absolute times — the compiled evaluation form. - [an.tools](an.tools.html.md): User-facing utility functions, plus the SSOT list for CLI dispatch. - [an.util](an.util.html.md): Internal helpers: file I/O, hashing, time arithmetic, light path utilities. - [an.verify](an.verify.html.md): Verification protocol — same interface for human, lint, vision-LM, MoVer. - [an.verify.human](an.verify.human.html.md): HumanInTheLoopVerifier — opens the rendered mp4 and asks for approval. - [an.verify.layout](an.verify.layout.html.md): LayoutLintVerifier — cheap pre-render checks on the IR. - [an.verify.media](an.verify.media.html.md): Media verification helpers — audio + frame quality checks for rendered mp4s. - [an.verify.media_quality](an.verify.media_quality.html.md): MediaQualityVerifier — post-render quality checks on the actual mp4. - [an.verify.prosody](an.verify.prosody.html.md): Prosody measurement: how a recorded voice delivers its words, as numbers a target can check. - [an.verify.vision](an.verify.vision.html.md): VisionLMVerifier — Claude vision looks at sampled frames and reports issues. ## Optional - [Top-level llms.txt](../llms.txt): Complete documentation index.