Turn a script into an animatic
Paste a short script or ad brief and get a timed animatic. Qwen3.8-27B breaks it into shots that each cite their script lines; code checks that every line is covered and inserts the dialogue word for word, and the grounding check flags shots that add events the script does not have. Frames come from Wan2.2-VACE-Fun-A14B, optional motion from the same model, temp dialogue from stock voices the consent ledger allows. Edit any shot and re-render just that one. The MP4 carries shot numbers, timecode, a C2PA credential and a signed record of which steps were AI and which were your edits. Previsualisation that saves a storyboard artist's first pass, not a replacement for one.
- For
- Teams in film, tv and games and creative and media.
- Time per task8.8 mintypical (median) on the sample
- Cost per task~$0.17 per animaticmeasured, at list price
- AccuracyNo accuracy eval yet
Shot list and animatic
LivePaste a scene and draft the shot list. Each shot cites the script lines it covers.
Watch: scripts broken down, checked and cut
Replay · not liveRecorded from real runs of the branch API on our server, 26 Sep 2026: Qwen3.8-27B via our gateway, frames and motion from Wan2.2-VACE-Fun-A14B on the shared studio GPU, Kokoro-82M temp voices. The API answers and progress states are as recorded; event timing in the replay is compressed.
One page, two locations. Every line lands in a shot; EDDIE is heard on the radio, never seen. This is version 3: shot 6 was given motion and shot 8 rewritten by hand, then only shot 8 was re-rendered; the record lists both edits as human.
Paste a scene and draft the shot list. Each shot cites the script lines it covers.
Get an API key
- Call the script to animatic API from your own code in minutes.
- Every model answer carries a signed receipt.
- Nothing to install; we run the models.
Run it yourself, on request
- The same open models and app, on 1× RTX PRO 6000 (96 GB): Qwen3.8-27B for the shot list, and about 34 GB for Wan2.2-VACE-Fun-A14B (fp8) in ComfyUI; the voices run on CPU.
- Data never leaves your machines, and there are no Decosa charges.
- One prompt for Claude Code or Codex assembles the whole stack.
- Early access: the container images are not public yet and the source needs access; the prompt says how to ask.
Build with it
Paste one of these into Claude Code, Codex or another coding agent. The first wires your project to the hosted API with your DECOSA_API_KEY. The second pulls our containers and runs the same stack on your own GPU, with no Decosa charges.
- Base URL
- https://api.decosa.ai
- Auth
Authorization: Bearer $DECOSA_API_KEY(or a demo session token)- Tool id
- animatic-studio
Use the hosted API
# Decosa script to animatic: use the hosted API
You are wiring Decosa's script-to-animatic into this project. It takes a short script or ad brief (up to about two
pages: screenplay, stage play or ad format), drafts a shot list where every shot cites the script lines it covers,
checks coverage and each shot's action against its lines, and, once the user has edited the shots and cast temp
voices, renders an MP4 animatic with shot numbers, timecode, subtitles and an AI label, a C2PA credential, a shot-list
CSV, a storyboard PDF and a signed record of which steps were AI and which were human edits. Model calls carry signed
receipts. Use only what is listed below. If you need something else, stop and ask me.
- Base URL: `https://api.decosa.ai`
- Health check: `GET https://api.decosa.ai/healthz`.
- Previsualisation, not finished work: frames are rough and characters only partly consistent from shot to shot.
- Send only scripts the user may share: the hosted demo keeps a run 7 days so it can be edited and re-rendered.
- Temp voices are stock synthetic voices; each is checked in the consent ledger at render time. Never promise a voice.
## Auth: API key (or a demo session)
1. Preferred: an API key (`dk_…`) from "Get an API key" on the tool page. Keep it in `DECOSA_API_KEY`, never in
code. Send `Authorization: Bearer $DECOSA_API_KEY`. A key renders 3 times per UTC day on the shared GPU.
2. Without a key: `POST https://api.decosa.ai/demo/session` with `{"vertical": "animatic-studio"}` returns `{"token", ...}`.
3 renders per session. Over a limit: HTTP 429 with `Retry-After`.
## Endpoints
- `POST /animatic/shotlist` (token). Body `{"script": "...", "title"?: "...", "style"?: "sketch"|"grey"|"colour", "stream"?: true}`.
Returns `run_id`, `lines` (`L1`… with kind, speaker), `shots` (`n`, `lines`, `framing`, `angle`, `movement`,
`characters`, `setting`, `action`, `duration_s`, `dialogue` taken word for word from the script), `characters`
(a `look` per character: the model's design choice), `coverage` (`pct`, `missing`, `dialogue_spoken_once`),
`grounding` (per shot: `supported`, `partial`, `unsupported`, `contradicted`) and `receipts`. With `stream: true`
it is SSE: `lines`, `receipt`, `shotlist`, one `grounding` per shot, `report`, `done`. 400 on an empty or oversized
script (7,000 characters, 160 lines).
- `GET /animatic/voices` (no token): voices you can cast (`identity_id`, `group`: house, cast, or roster voices whose
consent does not cover animatics).
- `POST /animatic/runs/{run_id}/render` (token). Body `{"shots"?: [...edited shots...], "characters"?: [{name, look}],
"cast"?: {"SPEAKER": "identity_id"}, "style"?: ...}`; shots are validated (every shot must cite script lines; a shot's
dialogue is always rebuilt from its line ids; `motion: true` on up to 6 shots). 202 `{version, consent: [{speaker,
allowed, code, reason, decision_id}], coverage, edits, poll}`. A refused voice is subtitled, not voiced.
- `POST /animatic/runs/{run_id}/shots/{n}/render` (token). Body `{"shot": {changed fields}}`: re-renders one shot and
re-cuts (202). Needs one full render first.
- `GET /animatic/runs/{run_id}` (token): poll every 5-10 s until `versions[-1].status` is `done` or `failed`. The latest
version has `progress` while running and, when done, `video_url` (relative: prefix `https://api.decosa.ai`), `timeline`
(per shot `tc_in`, `tc_out`, `frame_url`), `sheets`, `credential`, `receipt_url`, `label_check`, `record` and `exports`.
- `GET /animatic/runs/{run_id}/shotlist.csv` and `/shotlist.pdf` (token; `?v=N`).
- `GET /animatic/records/{run_id}-v{N}` (no token): the signed record; verify it at `POST /record/verify` with
`{"record": ...}`; `?format=md` for the readable one.
- `GET /animatic/info`, `GET /animatic/samples` (no token).
## Example: shot list, render, save the cut and the record (Python, `pip install httpx`)
```python
import httpx, os, pathlib, time
API = "https://api.decosa.ai"
H = {"Authorization": f"Bearer {os.environ['DECOSA_API_KEY']}"}
script = pathlib.Path("scene.txt").read_text()
sl = httpx.post(f"{API}/animatic/shotlist", headers=H, timeout=600, json={"script": script, "style": "sketch"})
sl.raise_for_status()
sl = sl.json()
print(sl["coverage"]["pct"], [g["label"] for g in sl["grounding"]])
run_id = sl["run_id"]
acc = httpx.post(f"{API}/animatic/runs/{run_id}/render", headers=H, timeout=120,
json={"cast": {sp: "id_house-af-heart" for sp in sl["speakers"][:1]}}).json()
while True:
time.sleep(10)
v = httpx.get(f"{API}/animatic/runs/{run_id}", headers=H, timeout=120).json()["versions"][-1]
if v["status"] in ("done", "failed"):
break
if v["status"] == "failed":
raise SystemExit(v.get("error"))
pathlib.Path("animatic.mp4").write_bytes(httpx.get(API + v["video_url"]).content)
pathlib.Path("record.md").write_text(httpx.get(API + v["record"]["markdown"]).text)
```
## Honest limits
- The model's own shot list covered every script line in 10 of 10 eval runs, and dialogue can't be invented (code
inserts it); shot descriptions can still add details, which the grounding check flags (it caught 10 of 10 planted
inventions, and it also marks harmless staging details as "partial").
- Frames aren't checked against existing characters; review for resemblance before sharing. Describe each character's
shape, colour and silhouette in its `look`: a vague look can drift towards a familiar character.
- Character consistency is partial: frames repeat each character's look in words; no identity adapter is used.
- Renders share one GPU; a full animatic takes several minutes, longer when other renders are queued.
Run it yourself (containers)
On request. The container images and the compose file aren’t public yet. Ask for self-host access and Decosa sends the registry (DECOSA_REGISTRY) and the compose file’s URL (DECOSA_COMPOSE_URL) these steps use. They are the steps we tested end to end on a fresh machine.
# Decosa script to animatic: run it yourself (containers)
You are setting up Decosa's script-to-animatic on this machine: Qwen3.8-27B for the shot list and the grounding check,
Wan2.2-VACE-Fun-A14B in ComfyUI for sheets, frames and motion, Kokoro-82M stock voices on CPU, the consent ledger, and
ffmpeg for the cut. Unreleased scripts stay here; nothing is sent to Decosa's hosted API.
Status: the container images (${DECOSA_REGISTRY}/decosa-*) and the compose file are on request while self-host is in early access (not on a public registry yet): ask at https://decosa.ai/contact?topic=self-host, and Decosa sends the registry as DECOSA_REGISTRY, the compose file URL as DECOSA_COMPOSE_URL, and pull access. If a pull fails with
"not found", "denied" or "unauthorized", stop and tell me. Don't substitute other images or models.
Ask me before any command that needs sudo, and show me the command first.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/animatic-studio.zip (2 KB, 9 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py animatic-studio` (the api image carries the same bundle under /app/rehearsal/animatic-studio/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py animatic-studio --bundle animatic-studio.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "every action, dialogue and on-screen-text line is covered by a shot", "each dialogue line is spoken exactly once, in the script's words", "the shot list has at least four shots"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## Rules first
- Every temp voice goes through the consent ledger. Never bypass it, and never clone a real person's voice.
- Keep the burned-in AI label and the C2PA credential on every cut.
## Steps
1. Docker and the NVIDIA container toolkit: if `docker compose version` or
`docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi` fails, install them from the official
instructions. The frames need about 34 GB of free VRAM while a job runs; Qwen3.8-27B NVFP4 about 57 GB (one 96 GB
card each, or a remote text endpoint).
2. ComfyUI at the pinned commit with the Wan2.2-VACE-Fun-A14B, Wan2.2-Lightning, umt5-xxl and Wan2.1 VAE weights: the
tool's assemble prompt lists the exact downloads and file names.
3. Fetch the compose file: `mkdir -p ~/decosa && cd ~/decosa && curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml`. Keep the
`llm` and `api` services. The api image needs the render layer (FFmpeg, Tesseract, DejaVu fonts, c2pa-python and a
`/opt/kokoro` venv); the assemble prompt has the Dockerfile. Use named volumes and bind every port to 127.0.0.1.
4. `docker compose up -d`, wait for the health checks, then create the C2PA signing material once:
`docker compose exec api python scripts/provenance_devcert.py && docker compose restart api`.
5. Smoke test: get a token from `POST /demo/session {"vertical":"animatic-studio"}`, draft the `night-shift-ad` sample
(`POST /animatic/shotlist`) and check `coverage.pct` is 100; render it with `{"cast":{"VO":"id_house-af-heart",
"DANA":"id_demo-ines-okafor"}}` and check DANA is refused; poll to `done` and check `credential` is `c2pa` and the
record verifies at `POST /record/verify`.
6. Report back: the signing key id (`GET /attest/signing-key`), the render time and the seconds per frame.
Run it on your own GPU
Same app, same pinned models, your hardware. Nothing goes to our servers and there are no Decosa charges.
Hardware check
Check your own hardware- CPU only, 64 GB RAMDoesn't fit
Qwen3.8-27B (NVIDIA NVFP4) needs a GPU.
- GeForce RTX 4090lite tierRuns with a smaller tier
The standard tier does not fit: Needs about 54 GB of GPU memory at the smallest settings; 24 GB available. The lite tier fits with changes.
- GeForce RTX 5090lite tierRuns with a smaller tier
The standard tier does not fit: Needs about 62 GB of GPU memory at the smallest settings; 32 GB available. The lite tier fits with changes.
- 2x GeForce RTX 5090lite tierRuns with a smaller tier
The standard tier does not fit: Wan2.2-VACE-Fun-A14B needs about 34 GB on one GPU; each GPU here has 32 GB. The lite tier fits with changes.
- L40Slite tierRuns with a smaller tier
The standard tier does not fit: Needs about 67.6 GB of GPU memory at the smallest settings; 48 GB available. The lite tier fits with changes.
- H100 80 GB (SXM)standard tierRuns
The standard tier fits with changes: Replace Qwen3.8-27B (NVIDIA NVFP4) with Qwen3.8-27B official FP8. This build is NVIDIA NVFP4, which needs a Blackwell GPU.
- RTX PRO 6000 Blackwell 96 GBstandard tierRuns
The standard tier fits (91.6 of 96 GB).
- 2x RTX PRO 6000 Blackwell 96 GBbest tierRuns
The standard tier fits (91.6 of 192 GB). The best tier fits too.
- Apple M3 Ultra (Mac Studio), 96 GBlite tierRuns with a smaller tier
The standard tier can't be checked: Wan2.2-VACE-Fun-A14B has no mapped Apple Silicon build The lite tier fits with changes.
- Apple M5 Max, 64 GBlite tierRuns with a smaller tier
The standard tier can't be checked: Wan2.2-VACE-Fun-A14B has no mapped Apple Silicon build The lite tier fits with changes.
Memory per component comes from measured footprints, the tool's stack.json, or an estimate from its parameter count, and each is labelled that way below. Only an RTX PRO 6000 and an M3 Ultra Mac Studio have actually been run.
On request. The container images and the compose file aren’t public yet. Ask for self-host access and Decosa sends the registry (DECOSA_REGISTRY) and the compose file’s URL (DECOSA_COMPOSE_URL) these steps use. They are the steps we tested end to end on a fresh machine.
- 1
Check the GPU, Docker and the NVIDIA Container Toolkit
The driver must see the GPU, and Docker must be able to pass it into a container.
nvidia-smi docker compose version docker run --rm --gpus all ubuntu nvidia-smi
- 2
Fetch the compose file
One file describes the API and the language model as services.
mkdir -p ~/decosa && cd ~/decosa curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml - 3
Pull and start
The first start downloads pinned model weights, tens of gigabytes.
docker compose pull docker compose up -d
- 4
Check health
Wait until the API reports ok with the language model loaded. Then point your app at the local base URL.
curl -fsS http://localhost:<PORT>/healthz # {"ok": true, "llm": true, ...} curl -fsS -X POST http://localhost:<PORT>/demo/session \ -H 'Content-Type: application/json' -d '{"vertical":"animatic-studio"}'
Set up with a coding agent, rehearse on mock data, then go private
- Set up with a coding agent. Paste the self-host prompt into a coding agent on the machine that will run the service. We recommend Claude Code with Claude Opus 5.5; any capable coding agent works.
- Rehearse on mock data. The agent runs the tool on a bundle of synthetic inputs and checks each answer against the bundle's
expected.json. Every check must print PASS. - Go private. Only then do you run your own data against the local API, yourself, on that machine. Never give the agent real data during setup: a coding agent that runs in the cloud sees everything in its context, so keep real data out of the chat and out of the files it reads.
docker compose exec api python scripts/rehearse.py animatic-studio
Download the mock-data bundle (2 KB, 9 checks)expected.json
A 30-second ad script for a made-up brand. The shot list must cover every action, dialogue and on-screen-text line, and each dialogue line must be spoken exactly once, in the script's own words. The render casts the voice-over with a Decosa house voice (allowed) and DANA with a fictional performer whose consent covers a different campaign (refused by the consent ledger, so her line is subtitled). The render takes a few minutes of GPU; the step polls until it is done and checks the signed record.
What the rehearsal checks
- every action, dialogue and on-screen-text line is covered by a shot
- each dialogue line is spoken exactly once, in the script's words
- the shot list has at least four shots
- the shot list and the grounding check made receipted model calls
- the house voice for the VO is allowed by the consent ledger
- the performer whose consent covers another campaign is refused
- the render finishes
- the finished cut has a signed record of AI steps and human edits
- every model call has a signed receipt
Licence: ad-script.txt: written for Decosa (CC0); Hollin Oats is a made-up brand.
Prompt for your coding agent
# Decosa script to animatic: run it yourself (containers)
You are setting up Decosa's script-to-animatic on this machine: Qwen3.8-27B for the shot list and the grounding check,
Wan2.2-VACE-Fun-A14B in ComfyUI for sheets, frames and motion, Kokoro-82M stock voices on CPU, the consent ledger, and
ffmpeg for the cut. Unreleased scripts stay here; nothing is sent to Decosa's hosted API.
Status: the container images (${DECOSA_REGISTRY}/decosa-*) and the compose file are on request while self-host is in early access (not on a public registry yet): ask at https://decosa.ai/contact?topic=self-host, and Decosa sends the registry as DECOSA_REGISTRY, the compose file URL as DECOSA_COMPOSE_URL, and pull access. If a pull fails with
"not found", "denied" or "unauthorized", stop and tell me. Don't substitute other images or models.
Ask me before any command that needs sudo, and show me the command first.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/animatic-studio.zip (2 KB, 9 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py animatic-studio` (the api image carries the same bundle under /app/rehearsal/animatic-studio/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py animatic-studio --bundle animatic-studio.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "every action, dialogue and on-screen-text line is covered by a shot", "each dialogue line is spoken exactly once, in the script's words", "the shot list has at least four shots"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## Rules first
- Every temp voice goes through the consent ledger. Never bypass it, and never clone a real person's voice.
- Keep the burned-in AI label and the C2PA credential on every cut.
## Steps
1. Docker and the NVIDIA container toolkit: if `docker compose version` or
`docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi` fails, install them from the official
instructions. The frames need about 34 GB of free VRAM while a job runs; Qwen3.8-27B NVFP4 about 57 GB (one 96 GB
card each, or a remote text endpoint).
2. ComfyUI at the pinned commit with the Wan2.2-VACE-Fun-A14B, Wan2.2-Lightning, umt5-xxl and Wan2.1 VAE weights: the
tool's assemble prompt lists the exact downloads and file names.
3. Fetch the compose file: `mkdir -p ~/decosa && cd ~/decosa && curl -fsSL "${DECOSA_COMPOSE_URL}" -o compose.yaml`. Keep the
`llm` and `api` services. The api image needs the render layer (FFmpeg, Tesseract, DejaVu fonts, c2pa-python and a
`/opt/kokoro` venv); the assemble prompt has the Dockerfile. Use named volumes and bind every port to 127.0.0.1.
4. `docker compose up -d`, wait for the health checks, then create the C2PA signing material once:
`docker compose exec api python scripts/provenance_devcert.py && docker compose restart api`.
5. Smoke test: get a token from `POST /demo/session {"vertical":"animatic-studio"}`, draft the `night-shift-ad` sample
(`POST /animatic/shotlist`) and check `coverage.pct` is 100; render it with `{"cast":{"VO":"id_house-af-heart",
"DANA":"id_demo-ines-okafor"}}` and check DANA is refused; poll to `done` and check `credential` is `c2pa` and the
record verifies at `POST /record/verify`.
6. Report back: the signing key id (`GET /attest/signing-key`), the render time and the seconds per frame.
Help me customise for my hardware
Pick your GPU or Mac, or enter its memory. You get the tier that fits, the model swaps it needs, measured speed where we have it, and a setup prompt with those choices written in.
GeForce RTX 5090: 32 GB GDDR7, 1,792 GB/s, FP8 and NVFP4. NVIDIA product page
Runs with a smaller tierScript to animatic on GeForce RTX 5090: use the Lite · breakdown only, no GPU renderer tier
The standard tier does not fit: Needs about 62 GB of GPU memory at the smallest settings; 32 GB available. The lite tier fits with changes.
Lite · breakdown only, no GPU renderer: what changesuses estimates
- Qwen3.8-27B (NVIDIA NVFP4): run it at its smallest setting (about 28 GB instead of 57.6 GB), with a shorter context and fewer parallel sessions.
Memory per component
- Drafts the shot list: Qwen3.8-27B (NVIDIA NVFP4). ~57.6 GB (at least ~28 GB), weights 21.4 GB (from stack.json). Qwen3.8-27B NVFP4: Weights 19.9 GiB (21.4 GB), measured (field stack.json). The compose file gives the server 0.60 of a 96 GB card (57.6 GB) so the rest is FP8 KV cache for several sessions. The 28 GB minimum is an estimate: weights plus a short-context KV cache, which is why several stacks list a 32 GB RTX 5090 as 'estimate'. (stack.json lists 57 GB for this component.)
Expected speed
Not measured.
Not measured on this hardware. The only measured setups are an RTX PRO 6000 Blackwell and a Mac Studio M3 Ultra.
Setup prompt for this hardware
The self-host prompt for Script to animatic, with a hardware plan for GeForce RTX 5090 added after Step 0. Loading the full prompt; until then it points your agent at the prompt's URL.
# Set up Script to animatic on my hardware Fetch https://decosa.ai/prompts/animatic-studio-selfhost.md and follow it (including Step 0: rehearse on mock data first), with the hardware plan below applied. ## Hardware plan for this machine (from https://decosa.ai/self-host/hardware?use=animatic-studio) Target machine: GeForce RTX 5090 (32 GB of GPU memory; CUDA, FP8 and NVFP4). Quality tier: Lite · breakdown only, no GPU renderer (lite). Fit check: runs with changes, about 28 GB of 32 GB used; some memory numbers are estimates, not measurements. First, check the machine: run `nvidia-smi` (or `rocm-smi`, or `sysctl hw.memsize` on a Mac) and confirm the GPUs and free memory match the line above. If they do not, stop and tell me before pulling anything. Use these components (the setup below describes the standard tier; change it to match): - Drafts the shot list: Qwen3.8-27B (NVIDIA NVFP4) (nvidia/Qwen3.8-27B-NVFP4), 57.6 GB. Change: Qwen3.8-27B (NVIDIA NVFP4): run it at its smallest setting (about 28 GB instead of 57.6 GB), with a shorter context and fewer parallel sessions. GPU placement (set each service's device and its vLLM --gpu-memory-utilization to about the share shown): - GPU 0: Qwen3.8-27B (NVIDIA NVFP4) ~28 GB (88%); about 4 GB left During the rehearsal, watch GPU memory. If a model fails to load or runs out of memory, lower its --max-model-len and --max-num-seqs first, then its memory share, and tell me what you changed. The stack's own component list and compose layout: https://decosa.ai/prompts/animatic-studio-assemble.md
Get an API key
- Call the script to animatic API from your own code in minutes.
- Every model answer carries a signed receipt.
- Nothing to install; we run the models.
Run it yourself, on request
- The same open models and app, on 1× RTX PRO 6000 (96 GB): Qwen3.8-27B for the shot list, and about 34 GB for Wan2.2-VACE-Fun-A14B (fp8) in ComfyUI; the voices run on CPU.
- Data never leaves your machines, and there are no Decosa charges.
- One prompt for Claude Code or Codex assembles the whole stack.
- Early access: the container images are not public yet and the source needs access; the prompt says how to ask.
Paste a short script or ad brief, get a timed animatic with a checked shot list, consented temp voices and a signed record of what was AI and what was you.
Qwen3.8-27B breaks a script of up to about two pages into shots that each cite their lines. Code checks coverage and inserts dialogue word for word; the grounding check flags shots that add events. Wan2.2-VACE-Fun-A14B draws a sheet per character and a frame per shot (optional motion), Kokoro-82M reads the lines in voices the consent ledger allows, and ffmpeg cuts an MP4 with shot numbers, timecode and an AI label. Edit any shot and re-render only that one. For indie filmmakers, agencies and game teams: previsualisation that saves a storyboard artist's first pass, not a replacement for one.
- Deployment
- Hosted or self-host
- Regulatory
- Not legal advice. The cut carries a burned-in "AI-generated animatic (previs)" label and a C2PA credential, and every voice is checked in the consent ledger (tool 47) first. Laws below were read on 25 Sep 2026 by the disclosure pre-flight tool (49) and not re-read for this page: EU AI Act, Regulation (EU) 2024/1689 (https://eur-lex.europa.eu/eli/reg/2024/1689/oj), Art. 50(2) machine-readable marking of synthetic video applies from 2 Aug 2026 (later for systems already on the market) and Art. 50(4) asks deployers to disclose deepfakes; New York General Business Law 396-b (https://www.nysenate.gov/legislation/bills/2025/S8420/amendment/A), in force 9 Jun 2026, requires a conspicuous disclosure when an advertisement includes a synthetic performer, which matters only if an animatic is itself run as an ad. Copyright: the US Copyright Office's report on copyrightability (29 Jan 2025, https://www.copyright.gov/ai/) says AI output is protectable only where a person determined enough of the expression; the record shows which steps were yours. Script rights are yours to have; the samples are original (CC0) or public domain.
Text description
A script goes to the decosa-api, which splits it into numbered lines. Qwen3.8-27B (Apache-2.0) drafts a shot list citing line ids, with a receipt through our gateway; code checks coverage and inserts dialogue; the grounding judge checks each shot. The person edits shots. The consent ledger checks each temp voice. The studio worker renders sheets, frames and optional motion with Wan2.2-VACE-Fun-A14B (Apache-2.0) in ComfyUI, reads the lines with Kokoro-82M (Apache-2.0) on CPU, and ffmpeg cuts the MP4 with shot numbers, timecode and an AI label. Outputs: the MP4 with a C2PA credential, a shot-list CSV, a storyboard PDF and a signed record of AI steps and human edits. Self-host keeps everything on your machine.
At a glance
- What it replaces
- The first pass: breakdown, rough frames and timing. A storyboard artist still stages, draws and cuts the real thing.
- Grounded shot list
- Every shot cites its script lines. In 10 of 10 eval runs the model's own list covered every line; dialogue is inserted word for word by code, and 10 of 10 planted invented events were flagged.
- Consent
- Every temp voice is checked in the consent ledger before the render and the decision is signed; a refused voice is subtitled instead. Stock voices only, nothing cloned.
- AI and human record
- A signed record lists the model's shot list, each of your edits by shot and field, the consent checks, frames, voices and the cut, with hashes. No script text in it.
- Cost per animatic
- A fraction of a cent of model time for the shot list and grounding (measured); rendering takes GPU-minutes on the shared card (measured), not billed in the demo.
- Data retention
- Hosted: the script, shot list, frames, voices and MP4 are kept 7 days so you can edit and re-render, then deleted. Frames and the MP4 open only through signed links that expire within hours and are given to the session or key that made the run. The signed record is public by design (anyone with its link can verify it): it holds hashes only and does not lead to your frames. Logs hold ids and counts, never script text.
- What leaves the box
- Hosted: the script goes to Decosa's API and its model server through our gateway. Self-host: nothing.
Pick the tier for the quality you need
Same app at every tier. What changes is the models, the hardware they need, and whether receipts are signed. Scores are measured with the source named, or marked not measured.
Lite
breakdown only, no GPU renderer
The checked shot list, character bible, grounding verdicts and CSV, without frames or voices.
- Models
- Qwen3.8-27B (NVIDIA NVFP4)
- Kokoro-82M
- c2pa-rs via c2pa-python
- Hardware
- The text model (or a remote endpoint); no render GPU
- Quality evidence
- Model coverage of script lines100% in 10 of 10 runsdecosa-api docs/evals/animatic-studio.md, 2026-09-26
- Planted invented events flagged by the grounding check10 of 10decosa-api docs/evals/animatic-studio.md, 2026-09-26
- Latency
- measured: seconds to under a minute per script
- Verification
- Proof: strongSelf-host onlyEvery model call is receipted.
- In the hosted demo
Standard
the hosted demo
Shot list and grounding on Qwen3.8-27B, frames and motion on Wan2.2-VACE-Fun-A14B in the shared ComfyUI, Kokoro voices, C2PA and the signed record.
- Models
- Qwen3.8-27B (NVIDIA NVFP4)
- Wan2.2-VACE-Fun-A14B
- Wan2.2-Lightning T2V 4-step LoRAs
- Kokoro-82M
- c2pa-rs via c2pa-python
- Hardware
- 1x RTX PRO 6000 96 GB for the text model plus about 34 GB of GPU for the renderer while a job runs
- Quality evidence
- Script lines covered by the model's shot list, before code repair100% in 10 of 10 runs (5 scripts, 78 required lines)decosa-api docs/evals/animatic-studio.md, 2026-09-26
- Invented dialogue in the cut0 by construction (the model cites line ids; code inserts the words); 0 quoted phrases outside the cited lines in 10 runsdecosa-api docs/evals/animatic-studio.md, 2026-09-26
- Planted invented events flagged by the grounding check10 of 10 (unsupported)decosa-api docs/evals/animatic-studio.md, 2026-09-26
- Character consistency (CLIP ViT-L/14 similarity of each frame to its character sheet)0.69 with each look repeated in every frame vs 0.53 without; nearest-sheet identification 0.75 vs 0.33 (18 frames, 3 scripts). Reference-image conditioning scored 0.81 but copied the sheet's pose, so it is off.decosa-api docs/evals/animatic-studio.md, 2026-09-26
- Render time per full animatic on the shared GPU359-726 s for 7-18 shots (6 runs); about 13 s per frame when the GPU is free; 45-47 s to re-render one shotmeasured on our server 2026-09-26
- Latency
- measured on our server: several minutes per full animatic on a shared GPU; under a minute to re-render one shot
- Verification
- Proof: partialModel calls get Decosa API receipts on the gateway route; renders carry a server-signed receipt and C2PA.
Best
self-host with LTX-2.3 or MiniMax H3 (licence pending) motion
Standard plus LTX-2.3 or MiniMax H3 (licence pending) for motion shots on your own GPU, if the licence suits you. Not wired in or measured here.
- Models
- Qwen3.8-27B (NVIDIA NVFP4)
- Wan2.2-VACE-Fun-A14B
- Wan2.2-Lightning T2V 4-step LoRAs
- Kokoro-82M
- c2pa-rs via c2pa-python
- LTX-2.3 22B
- MiniMax-H3 (licence pending)
- Hardware
- not measured
- Quality evidence
- Anynot measured yet
- Latency
- not measured
- Verification
- Proof: partialSelf-host only
Also runs on
- Reference-based consistencyQwen-Image-Editnot builtAn edit model conditioned on each character sheet (Qwen-Image-Edit, Apache-2.0) to hold faces and costumes across shots. Not installed here. Hardware: 1x 96 GB card (a 20B edit model; not measured).
We host these ourselves when needed: small models get more of our own compute unless we detect a shortage, so they need no community providers.
Every model in the stack
| Model | Tiers | Params · VRAM | Verification | Details |
|---|---|---|---|---|
Drafts the shot list (line ids, framing, action, duration) and a look per character; the same model is the grounding judge that checks each shot against its linesQwen3.8-27B (NVIDIA NVFP4)nvidia/Qwen3.8-27B-NVFP4 on Hugging Face (opens in a new tab) 27.8B · 57 GBProof: strongIn the hosted demo | LiteStandardBest | 27.8B · 57 GB | Proof: strongIn the hosted demo | |
| ||||
Character sheets, one still per shot (text only: every frame repeats each visible character's look), and optional image-to-video motion from a shot's stillWan2.2-VACE-Fun-A14Balibaba-pai/Wan2.2-VACE-Fun-A14B on Hugging Face (opens in a new tab) A14B (two 14B experts, high and low noise) (14B per step active)Proof: partialIn the hosted demo | StandardBest | A14B (two 14B experts, high and low noise) (14B per step active) | Proof: partialIn the hosted demo | |
| ||||
4-step distillation LoRAs for Wan2.2 (used at 6 steps, cfg 2 for stills)Wan2.2-Lightning T2V 4-step LoRAslightx2v/Wan2.2-Lightning on Hugging Face (opens in a new tab) Proof: partialIn the hosted demo | StandardBest | n/a | Proof: partialIn the hosted demo | |
| ||||
Temp dialogue in stock voicepacks, only for speakers the consent ledger allowsKokoro-82Mhexgrad/Kokoro-82M on Hugging Face (opens in a new tab) 82M · 0 GBProof: partialIn the hosted demo | LiteStandardBest | 82M · 0 GB | Proof: partialIn the hosted demo | |
| ||||
C2PA content credential on the MP4, with the consent-ledger links of the voiced speakersc2pa-rs via c2pa-python 0 GBNo proof yetIn the hosted demo | LiteStandardBest | 0 GB | No proof yetIn the hosted demo | |
| ||||
Longer, higher-resolution motion shots on your own GPULTX-2.3 22BLightricks/LTX-2.3 on Hugging Face (opens in a new tab) 22BNo proof yetSelf-host only | Best | 22B | No proof yetSelf-host only | |
| ||||
Reference-image editing to keep a character's face and costume from the sheetQwen-Image-EditQwen/Qwen-Image-Edit on Hugging Face (opens in a new tab) 20BNo proof yetSelf-host only | Alternate | 20B | No proof yetSelf-host only | |
| ||||
Motion shots with native audio from a shot's still (image-to-video)MiniMax-H3 (licence pending)MiniMaxAI/MiniMax-H3 on Hugging Face (opens in a new tab) 33.1B (transformer) + 33.4B (text encoder) · about 133 GB (estimate)No proof yetSelf-host only | Best | 33.1B (transformer) + 33.4B (text encoder) · about 133 GB (estimate) | No proof yetSelf-host only | |
| ||||
Tools, services and hardware
Tools
- ComfyUI (opens in a new tab)GPL-3.0
Runs the Wan2.2-VACE graphs for the studio worker, one job at a time.
- FFmpeg (opens in a new tab)LGPL-2.1+ (GPL build on our server)
Assembly: slate, per-shot segments, subtitles, shot numbers, timecode, AI label, AAC dialogue track.
- Tesseract OCR (opens in a new tab)Apache-2.0
The disclosure pre-flight label check (49): is the AI label readable on sampled frames?
- Pillow (opens in a new tab)MIT-CMU (HPND)
The sketch filter and the storyboard PDF.
- Project Gutenberg texts (opens in a new tab)Public domain in the US (Wilde 1895; Glaspell 1916, eBook #10623)
The public-domain sample (Earnest) and an eval script (Trifles).
Services
- decosa-api:8445
${DECOSA_REGISTRY}/decosa-api:<tag> (publishing soon)GET /animatic/info, /animatic/samples, /animatic/voices; POST /animatic/shotlist, /animatic/runs/{id}/render, /animatic/runs/{id}/shots/{n}/render; GET /animatic/runs/{id}, /animatic/runs/{id}/shotlist.csv|pdf, /animatic/records/{id}. Runs the studio worker (needs ffmpeg and tesseract in the image).
- comfyui:8188
Wan2.2-VACE-Fun-A14B stills and motion for the studio worker (built from source; see the studio tool).
- decosa-llm:8114
${DECOSA_REGISTRY}/decosa-llm:0.1.0Qwen3.8-27B OpenAI endpoint (hosted: behind our gateway).
Hardware
- 1x RTX PRO 6000 Blackwell 96 GB, shared Fits
Measured on our server 2026-09-26: the frames render in the studio ComfyUI on GPU0 next to the live services (about 34 GB for Wan2.2-VACE fp8 while a job runs); Qwen3.8-27B runs on GPU1; voices on CPU.
- 1x 24-32 GB card
Not tested. The shot list, grounding and CSV (lite tier) need only the text model or a remote endpoint.
- CPU only Does not fit
Parsing, coverage, voices, assembly and exports run on CPU; frames need a GPU.
Latency per lane
- Script to checked shot list (model call plus one grounding call per shot)20.5 s
Measuredmeasured on our server 2026-09-26: 7.9-29.6 s over 10 runs of 5 scripts (8-24 shots), gateway route under load
- Full render, 15 shots with 1 motion shot (49 s of animatic)359.0 s
Measuredmeasured on our server 2026-09-26: one run, shared GPU0 quiet
- Full render, 18 shots (154 s of animatic)409.0 s
Measuredmeasured on our server 2026-09-26: one run, shared GPU0
- Full render, 7 shots (25 s), GPU busy with other renders726.0 s
Measuredmeasured on our server 2026-09-26: one run while sibling jobs held the studio ComfyUI
- Re-render one shot and re-cut47.0 s
Measuredmeasured on our server 2026-09-26: one run (model load included)
Notes
- Dialogue is never written by the model: it cites line ids and code inserts the script's words, so invented dialogue is impossible by construction; action text can still add things, which the grounding check flags.
- Character consistency comes from repeating each character's look in every frame prompt; there is no identity adapter. Reference-image conditioning in Wan2.2-VACE was tried and measured (eval) and is not the default.
- The sketch look is a code filter (grayscale, colour dodge) over the model's frame, applied the same way to motion clips.
- LTX-2.3 motion is self-host only (community licence) and is not wired into this pipeline yet.
- Frames aren't checked against existing characters; review for resemblance before sharing. Spell out each character's shape, colour and silhouette.
Run this exact stack on your machine
Paste into Claude Code / Codex to assemble this stack locally. The prompt checks your GPU, pulls the pinned models, writes the compose file and runs a smoke test.
# Assemble Decosa script-to-animatic on this machine
You are setting up a script-to-animatic pipeline: a short script (up to about two pages) goes in; out come a shot list
where every shot cites its script lines, a frame per shot (optional motion), temp dialogue in consented stock voices,
an MP4 with shot numbers, timecode and an AI label, a shot-list CSV, a storyboard PDF, a C2PA credential and a signed
record of which steps were AI and which were human edits. Work step by step, show me each command before you run
anything with `sudo`, and stop to ask if a check fails.
## Step 0: set up with a coding agent, rehearse on mock data, then go private
This prompt is for a coding agent running on the machine that will host the service. We recommend Claude Code with
Claude Opus 5.5; any capable coding agent works. Work in this order:
1. Set up on mock data only. During the whole setup you (the agent) work with the synthetic sample bundle below and
nothing else. Do not ask me for real data, and do not open, read, list or copy files that hold real data, even to
"test with something realistic".
2. Rehearse. When the steps below are done and the service is healthy, fetch the mock-data bundle for this tool,
https://decosa.ai/samples/animatic-studio.zip (2 KB, 9 checks, synthetic or openly licensed: see `licence` in expected.json),
show me what is in it, and run the rehearsal against the local API:
`docker compose exec api python scripts/rehearse.py animatic-studio` (the api image carries the same bundle under /app/rehearsal/animatic-studio/;
with no key set, the script asks the local API for a short demo token). From a decosa-api checkout instead:
`python scripts/rehearse.py animatic-studio --bundle animatic-studio.zip --base-url http://127.0.0.1:<PORT>`.
It sends the mock inputs to the local API and prints PASS or FAIL for each expected property (for example: "every action, dialogue and on-screen-text line is covered by a shot", "each dialogue line is spoken exactly once, in the script's words", "the shot list has at least four shots"). Show me
the full output. Every check must pass. If one fails, fix the install and run it again; never edit `expected.json`
to make a check pass.
3. Stop there. Once the rehearsal passes, tell me, and I will run my own data against the local API myself, on this
machine.
For the person running this: a coding agent that runs in the cloud sees everything in its context, including files it
reads, command output and anything pasted into the chat. Keep real data out of the chat and out of anything the agent
can read. Switch to your own data only after the rehearsal has passed and the agent's work is done.
## 0. Ground rules and licences
- Models, all Apache-2.0: Qwen3.8-27B (shot list and grounding check), Wan2.2-VACE-Fun-A14B with the Wan2.2-Lightning
4-step LoRAs (sheets, frames, motion), the Wan2.1 VAE and umt5-xxl encoder, Kokoro-82M (temp voices, CPU).
- LTX-2.3 (LTX-2 Community License) is not part of this pipeline. Do not add it without asking me.
- Temp voices are stock Kokoro voicepacks. Never clone a real person's voice. Every voice goes through the consent
ledger (tool 47) before a render; a refused voice is subtitled instead. Enrol a real performer only with their
recorded consent and a specific description of the use.
- Keep the burned-in "AI-generated animatic (previs)" label and the C2PA credential on every cut.
- Bind every port to 127.0.0.1. Logs carry ids and counts, never script text; keep it that way.
## 1. Check the machine
1. `nvidia-smi`: the frames need about 34 GB of free VRAM while a job runs (Wan2.2-VACE fp8, measured on an RTX PRO
6000 96 GB). Qwen3.8-27B NVFP4 needs its own ~57 GB, or point it at a server you already run.
2. `docker --version`, `docker compose version`. If Docker or the NVIDIA container toolkit is missing, ask me, then
install them from the official repositories and run `docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi`.
3. Disk: about 110 GB (VACE experts 2 x 34.7 GB, umt5-xxl 11 GB, Qwen3.8-27B NVFP4 about 20 GB, the rest small).
## 2. ComfyUI and the Wan2.2-VACE weights
Follow the Decosa **studio** assemble prompt for ComfyUI at commit `30bdda1ef13a3a34fce2cd2fec633f15d832122a`, answering
on `http://127.0.0.1:8188`. Then, in its `models/` folder:
- `hf download alibaba-pai/Wan2.2-VACE-Fun-A14B --revision 4438caabbfdd7437bbb0283d86cb200d1b7223ba --local-dir vace`
and link `vace/high_noise_model/*.safetensors` to `diffusion_models/vace-fun-a14b-high-noise.safetensors`, the low
noise one to `diffusion_models/vace-fun-a14b-low-noise.safetensors`.
- `hf download lightx2v/Wan2.2-Lightning --local-dir lightning --include "Wan2.2-T2V-A14B-4steps-lora-250928/*"`, linked as
`loras/wan22_lightning_t2v_4step_250928_high.safetensors` and `_low.safetensors`. Record the revision you got.
- `hf download Comfy-Org/Wan_2.1_ComfyUI_repackaged --revision 123acf1cc74bccbb9bfff8ac1ee72edc08c2341d --include
"split_files/text_encoders/umt5_xxl_fp16.safetensors" "split_files/vae/wan_2.1_vae.safetensors"`, linked as
`text_encoders/umt5_xxl_fp16.safetensors` and `vae/Wan2.1_VAE.pth` (the graphs use these names).
## 3. Images
- `${DECOSA_REGISTRY}/decosa-api:<tag>` (**publishing soon**). If the pull fails, build from source:
`git clone <decosa-api source: on request at https://decosa.ai/contact?topic=self-host>` (access required), check out a release that contains
`decosa_api/verticals/animatic/`, and `docker build -f docker/api/Dockerfile -t decosa-api:local .`.
- The studio worker needs FFmpeg, Tesseract (the label check), DejaVu fonts, c2pa-python and a Kokoro venv. Add a layer
(the image runs as uid 10001; install as root, then switch back):
```dockerfile
# ./api-animatic/Dockerfile
FROM decosa-api:local
USER root
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg tesseract-ocr fonts-dejavu-core espeak-ng \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir "c2pa-python>=0.37" "pillow>=10" "numpy>=1.26"
RUN python -m venv /opt/kokoro && /opt/kokoro/bin/pip install --no-cache-dir torch --index-url https://download.pytorch.org/whl/cpu \
&& /opt/kokoro/bin/pip install --no-cache-dir kokoro==0.9.4 soundfile && /opt/kokoro/bin/python -m spacy download en_core_web_sm
ENV HF_HOME=/opt/hf
RUN /opt/kokoro/bin/python -c "from huggingface_hub import hf_hub_download as d; [d('hexgrad/Kokoro-82M', f) for f in ['kokoro-v1_0.pth', 'config.json'] + ['voices/%s.pt' % v for v in ('af_heart','am_michael','bf_alice','bf_isabella','bm_lewis','af_nicole','am_puck')]]" \
&& chmod -R a+rX /opt/hf
USER decosa
```
`docker build -t decosa-api:animatic ./api-animatic`.
## 4. docker-compose.yml
Write this in `~/decosa/animatic/`. `network_mode: host` lets the api reach ComfyUI and your model server on 127.0.0.1.
```yaml
services:
api:
image: decosa-api:animatic
network_mode: host
environment:
DECOSA_HOST: 127.0.0.1
DECOSA_PORT: "8445"
DECOSA_DATA_DIR: /data
DECOSA_LLM_ROUTE: direct
DECOSA_LLM_URL: http://127.0.0.1:8114/v1 # your Qwen3.8-27B server (vLLM, served name qwen3.8-27b)
DECOSA_LLM_MODEL: qwen3.8-27b
DECOSA_STUDIO_WORKER: command
DECOSA_STUDIO_WORKER_CMD: python /app/scripts/studio_worker.py
DECOSA_STUDIO_COMFY_URL: http://127.0.0.1:8188
DECOSA_STUDIO_WORK_DIR: /work
DECOSA_ANIMATIC_TTS_PYTHON: /opt/kokoro/bin/python
DECOSA_ANIMATIC_KEEP_DAYS: "7"
DECOSA_PROVENANCE_DIR: /provenance
HF_HUB_OFFLINE: "1"
volumes: ["decosa-data:/data", "decosa-work:/work", "decosa-provenance:/provenance"]
healthcheck: { test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8445/animatic/info', timeout=4)"], interval: 30s, retries: 10 }
volumes:
decosa-data:
decosa-work:
decosa-provenance:
```
Use named volumes, never host folders: the api runs as uid 10001 and a host folder Docker creates is root's.
`docker compose up -d`, wait for the health check, then create the C2PA signing material once and restart:
`docker compose exec api python scripts/provenance_devcert.py && docker compose restart api`. `GET /provenance/status`
must show `"c2pa": true` (a development CA: validators show the issuer as untrusted). The api creates this box's
Ed25519 key in `/data/attest/` on first start: back it up (`docker compose cp api:/data/attest ./attest-backup`) and
never print it. Records, consent decisions and render receipts are signed with it.
## 5. Smoke test
```bash
B=http://127.0.0.1:8445
T=$(curl -s -XPOST $B/demo/session -H 'content-type: application/json' -d '{"vertical":"animatic-studio"}' | jq -r .token)
S=$(curl -s $B/animatic/samples | jq -r '.[] | select(.id=="night-shift-ad") | .script')
R=$(jq -n --arg s "$S" '{script:$s, title:"Smoke", style:"grey"}' | curl -s -XPOST $B/animatic/shotlist \
-H "authorization: Bearer $T" -H 'content-type: application/json' -d @- | tee /tmp/sl.json | jq -r .run_id)
jq '{coverage: .coverage.pct, once: .coverage.dialogue_spoken_once, shots: (.shots|length), grounding: .grounding_summary.counts}' /tmp/sl.json
curl -s -XPOST $B/animatic/runs/$R/render -H "authorization: Bearer $T" -H 'content-type: application/json' \
-d '{"cast":{"VO":"id_house-af-heart","DANA":"id_demo-ines-okafor"}}' | jq '[.consent[] | {speaker, allowed, code}]'
until curl -s $B/animatic/runs/$R -H "authorization: Bearer $T" | jq -e '.versions[-1].status=="done" or .versions[-1].status=="failed"' >/dev/null; do sleep 10; done
curl -s $B/animatic/runs/$R -H "authorization: Bearer $T" | jq '.versions[-1] | {status, duration_s, credential, label_check, record, timings}'
```
Expect: coverage 100 with every dialogue line spoken once; VO allowed and DANA refused (`project_not_in_scope`); the
render `done` with `credential: "c2pa"` and a record whose JSON verifies at `POST /record/verify` (body `{"record": ...}`).
On our RTX PRO 6000 (shared) a 7-shot ad rendered in 6-12 minutes and a still took about 13 s once the model was loaded.
Report the times you measure.
## 6. Your own voices and projects
Enrol your temp-voice performers in your own consent ledger (`POST /consent/entries`, tool 47), with project
`decosa-animatic` (or your own slug) and purpose `character_dialogue`, and list them in a voices.json like
`decosa_api/verticals/animatic/data/voices.json`; point `DECOSA_ANIMATIC_VOICES` at it.
## 7. Point the app at the local API
Set `NEXT_PUBLIC_DECOSA_API=http://127.0.0.1:8445` in the site's `.env.local`. Contract: `API_CONTRACT.md`, section
"Script to animatic".What it does, in shortWho it's for, where it runs and the key results
Paste a short script or ad brief and get a timed animatic. Qwen3.8-27B breaks it into shots that each cite their script lines; code checks that every line is covered and inserts the dialogue word for word, and the grounding check flags shots that add events the script does not have. Frames come from Wan2.2-VACE-Fun-A14B, optional motion from the same model, temp dialogue from stock voices the consent ledger allows. Edit any shot and re-render just that one. The MP4 carries shot numbers, timecode, a C2PA credential and a signed record of which steps were AI and which were your edits. Previsualisation that saves a storyboard artist's first pass, not a replacement for one.
In short
Last reviewed
- What it is
- Paste a short script or ad brief, get a timed animatic with a checked shot list, consented temp voices and a signed record of what was AI and what was you.
- Who it's for
- Teams in film, tv and games and creative and media.
- Where it runs
- Hosted for sample and original scripts; self-host keeps unreleased scripts in-house
- Key numbers
- 100% in 10 of 10 runs Shot-list coverage of lines needing a shot, before any code repair (synthetic, n = 10)
- 0 Invented dialogue (synthetic, n = 10)
- 128 / 17 / 3 / 3 Grounding verdicts on shot actions: supported / partial / unsupported / contradicted (synthetic, n = 151)
- 531.0 s Median end-to-end run, hosted (QA sweep 2026-09-26)
How we tested itEnd-to-end checks, hosted and self-hosted, with dates
Verified end to end
Hosted: verified 26 Sep 2026 · measured 26 Sep 2026: · p50 531 s · ~$0.007 per run · 16 receipts
Loading the nightly status…
Self-host: verified 26 Sep 2026 · Fresh clone of the branch into a clean directory, docker build of the api image plus the Kokoro layer from the assemble prompt, compose with named volumes, pointed at the already-running local Qwen3.8-27B (direct route) and ComfyUI; the rehearsal bundle; then torn down.
Measured cost to run: about $0.17 per animatic (hosted, 26 Sep 2026). Self-hosting is free: the code is open and the models are open-weight. You pay only for your own hardware and power.
9 of 9 rehearsal checks passed (render 576 s, C2PA stamped, record verified), no script text in the container logs. Found on the way: frames could not be moved from the work volume to the data volume (cross-device rename); fixed with a regression test.
Known limits (6)
- Frames are rough and characters are only partly consistent from shot to shot (no identity adapter).
- Frames aren't checked against existing characters; review for resemblance before sharing. A vague look can drift towards a familiar character (in testing, a one-line robot description came out close to a well-known film robot).
- Long speeches stretch their shots past the drafted length; the timeline shows by how much.
- The grounding check also marks harmless staging details as partial; a person decides.
- Renders share one GPU with other demos: several minutes per animatic, longer when the queue is busy.
- C2PA credentials use a development certificate, so public validators show the issuer as untrusted.
Eval results, nightly checks and cost per run · eval not held out
Rules and regulations it checks againstDated, linked to the primary source; not legal advice
Regulation watch
Loading the watch status…
3 laws, rules and guidance pages cited; 2 watched nightly at the primary source. A change marks this page for a human re-check; nothing is edited automatically. What we cite and how it is watched
Technical detailsModels, where it runs, labels, what it is built from
- Models
- Qwen3.8-27B · Wan2.2-VACE-Fun-A14B · Kokoro-82M
- Where
- Hosted for sample and original scripts; self-host keeps unreleased scripts in-house
- Checks
- Receipt per model call (shot list and grounding); render receipt and C2PA credential on the MP4; signed consent decisions; a signed record of AI steps and human edits
- Industry
- Film, TV and games · Creative and media
- Input
- Text and documents
- Output
- Media · Signed record or verdict
- Data
- Confidential business data
- Hardware
- 1× 96 GB GPU
- Licence
- Permissive (Apache-2.0, MIT)
- Part of
- Decosa Studio: Film
- Runs in
- Decosa hosted · Self-host
- Built from
- Grounding · Studio render · Consent gate · Content credentials · Signed record
Every result carries a signed record of which model produced it, so you can check it later. How that works
Questions people ask
Does it replace a storyboard artist?
No. It saves the first pass: breakdown, rough frames and timing. The frames are rough and characters are only partly consistent from shot to shot; a storyboard artist still stages, draws and cuts the real thing.
How does it stick to the script?
Every shot cites its script lines. Code checks that every line is covered and inserts the dialogue word for word, and the grounding check flags shots that add events the script does not have. In the eval, 10 of 10 planted invented actions were flagged.
Where do the temp voices come from?
Stock synthetic voices only, nothing cloned. Every voice is checked in the consent ledger before the render and the decision is signed; a refused voice is subtitled instead.
What does the record show?
A signed record lists the model's shot list, each of your edits by shot and field, the consent checks, frames, voices and the cut, with hashes. No script text is in it. The MP4 also carries a burned-in AI label and a C2PA credential.
What does it cost and how long does it take?
About $0.004-0.013 of model time for the shot list and grounding, and 6-12 GPU-minutes to render on the shared card (measured). One shot re-renders in under a minute.
Can I keep scripts private?
Self-hosted, nothing leaves your machine. Hosted, the script, shot list, frames, voices and MP4 are kept 7 days so you can edit and re-render, then deleted. Frames and the MP4 open only through expiring signed links given to you; the public signed record holds hashes only.
Ask a question or leave feedbackWe read every message and publish useful answers
Ask about Script to animatic
We read every message. Questions, comments and our answers show here once we have reviewed and approved them.
Loading questions…