Render a Blender scene on AnIso
A job is a scene, a frame range and a GPU. The API quotes it before it runs, reserves exactly that quote, and settles against measured seconds when it ends.
Getting started
Create a studio in the console, then work from either surface: the console and the CLI are two clients of the same API, and neither can do arithmetic the other cannot see.
- Create a studio — you own the studio you create, and you invite the rest of it.
- During the beta, credits are granted by us rather than bought; the console's balance says which it is.
- Blender 4.2 is the only renderer, and a job runs on one GPU with its frames in sequence.
Install the CLI
The CLI is a Python package in the repository under cli/. It needs Python 3.12 or newer and talks to the same API the console does.
$ pip install ./cli $ aniso --help
Configuration lives in ~/.aniso/config.json — the API URL, the portal URL that issues tokens, and the token itself. The file is written owner-readable only.
Sign in
The portal issues the API's tokens, so the CLI signs in there and stores the JWT it gets back. A token lasts an hour; sign in again when one expires.
$ aniso login --email you@studio.example Password: ******** Logged in as you@studio.example
--api-url and --portal-url point it at another deployment; both are remembered in the config file.
Upload a scene
A scene goes straight to object storage on a presigned URL — the API never proxies the bytes. The server issues the URL, the CLI PUTs the file, and the upload is confirmed with its size before the asset can be rendered.
$ aniso asset push shot.blend Uploading shot.blend … Uploaded: shot.blend Asset ID: 4c0e8b2f-1d7a-4b3e-9f61-2a8c5d0e7b14 Use --scene 4c0e8b2f-1d7a-4b3e-9f61-2a8c5d0e7b14 when submitting a job.
Pass --project ID to file the asset under a project. aniso asset list prints every asset in the studio with its id, size and state.
Submit a job
Give aniso job submit an uploaded scene, a frame range and a GPU. The job is created and the estimate is reserved in the same call; POST /jobs/estimate returns the same arithmetic without creating anything.
$ aniso job submit --scene 4c0e8b2f-1d7a-4b3e-9f61-2a8c5d0e7b14 \ --frames 1-240 --gpu-type "NVIDIA GeForce RTX 4090" \ --name "sh0310 lighting v08" Job submitted: 3f9c2a7e-6b1d-4e8a-9c2f-0d7a5e41b8c3 Status : PENDING Frames : 1–240 DCC : blender 4.2 $ aniso job status 3f9c2a7e-6b1d-4e8a-9c2f-0d7a5e41b8c3 Job : 3f9c2a7e-6b1d-4e8a-9c2f-0d7a5e41b8c3 Status : RUNNING DCC : blender 4.2 Frames : 1–240 GPU : NVIDIA GeForce RTX 4090 Priority: best_effort Progress: 97/240 frames done
Flags
Job states
A job moves forward through the states below. If the machine fails rather than the render, the job returns to PENDING and dispatch tries another; that is never reported as FAILED.
What the estimate is
The estimate is the reservation. It is computed once, by the same function, and returned in full so you can check it: rate × machines × frames × seconds per frame ÷ 3600, rounded up to 0.0001 credits. Seconds per frame is assumed at 120 until a job has measured itself.
$ curl -s -X POST $ANISO_API/jobs/estimate \ -H "Authorization: Bearer $TOKEN" \ -d '{"asset_id": "4c0e8b2f-1d7a-4b3e-9f61-2a8c5d0e7b14", "dcc": "blender", "dcc_version": "4.2", "frame_start": 1, "frame_end": 240, "gpu": true, "gpu_type": "NVIDIA GeForce RTX 4090"}' { "estimate": { "resource": "NVIDIA GeForce RTX 4090", "units": 1, "frames": 240, "seconds_per_frame": 120, "rate_per_hour": "400.0000", "credits": "3200.0000" }, "balance": "…", "sufficient": true, "shortfall": "0.0000", "enforced": false }
sufficient and shortfall compare the quote against the studio's balance; enforced says whether a balance that cannot cover the quote actually blocks the submit on this deployment.
Credits and the ledger
One credit is one cent, always. Submitting reserves the quoted credits as a ledger line of its own; when the job reaches a terminal state the reservation is settled and the difference comes back as a second line, so the arithmetic stays readable after the fact.
$ aniso credits balance $ aniso credits history
history prints every entry — date, type, amount and the note that says which job it belongs to. During the beta credits arrive as grants, and a grant carries the operator and the reason on the ledger itself.
Rate card
Every rate is derived from the Blender Open Data median for that card: credits/hour = median × 400 ÷ 11,680, rounded to the nearest 5 and anchored on the RTX 4090. Pass the catalogue id in the left column to --gpu-type exactly as it prints.
The reasoning, the packs and a calculator you can run before you have an account are on pricing.
CLI reference
aniso asset
push <path> [--project ID] uploads a file and prints the asset id to submit with. list prints the studio's assets.
aniso job
submit takes the flags above. list [--status STATUS] prints jobs as a table. status <job id> prints one job with its frame progress. cancel <job id> stops a pending or running job and releases the machine. logs <job id> reports the job's status today; container logs arrive with the runner work.
aniso credits
balance prints the studio's balance. history prints the ledger.
aniso queue
status counts the studio's jobs by state — pending, queued, rendering, done, failed, cancelled.