Render

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

Flag
Meaning
Default
--scene ID
The asset id of a scene that finished uploading. aniso asset list prints them.
required
--frames A-B
Inclusive frame range. A reversed range is refused.
required
--gpu-type SKU
The catalogue id, exactly as the rate card prints it. A SKU no cluster offers is refused at submit, with the offered list in the error.
the deployment's card
--gpu / --no-gpu
Whether the render wants a GPU at all. --no-gpu prices the job at the CPU rate.
--gpu
--dcc
The application. Only Blender renders during the beta.
blender
--dcc-version
The Blender version. 4.2 is the only image the farm ships.
4.2
--priority
best_effort, priority or reserved. Stored with the job; scheduling by priority comes later.
best_effort
--name
Shown in the console and in the job list.
none
--project ID
Group jobs under a project. Optional.
none

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.

Pending
Created and reserved. Waiting for a machine on the cluster, or for capacity at or below the quoted rate.
Queued
A machine is assigned and starting. Most of a short job's wall time is here.
Rendering
Frames are being produced and written to your bucket as each one finishes.
Done
Every frame in range rendered. The reservation settles and any difference is refunded.
Failed
The runner gave up. The failed frame and the runner's message are on the job; frames already rendered are kept.
Cancelled
Stopped by a member of the studio. The machine is released and frames already rendered are kept.

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.

GPU · catalogue id
VRAM
Blender median · n
vs 4090
Credits / hour
USD / hour
RTX A5000NVIDIA RTX A5000
24 GB
4,628 · 256
0.40×
160
$1.60
RTX A6000NVIDIA RTX A6000
48 GB
5,287 · 207
0.45×
180
$1.80
RTX 3090NVIDIA GeForce RTX 3090
24 GB
5,786 · 8,237
0.50×
200
$2.00
RTX 6000 AdaNVIDIA RTX 6000 Ada Generation
48 GB
11,088 · 113
0.95×
380
$3.80
RTX 4090NVIDIA GeForce RTX 4090 · anchor
24 GB
11,680 · 8,921
1.00×
400
$4.00
RTX 5090NVIDIA GeForce RTX 5090
32 GB
15,060 · 3,190
1.29×
515
$5.15
RTX PRO 6000 BlackwellNVIDIA RTX PRO 6000 Blackwell Workstation Edition
96 GB
16,760 · 280
1.43×
575
$5.75
CPUno GPU
20
$0.20

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.