Headless Blender on a cloud GPU: render from CI, cron or a script without installing Blender

Updated 2026-10-05

JANCTION Render is Blender running headless on an NVIDIA GPU behind an HTTP API: upload the scene (POST /v1/files), submit a job (POST /v1/jobs) with notify_url for a completion webhook, then download the artifacts. The CLI wraps the same calls (janction-render render scene.blend --wait). The runner needs Python or curl only; Blender 5.0 and the GPU are on our side.

From a shell or CI step

pip install janction-render
export JANCTION_RENDER_SERVER=https://render.janction.jp
export JANCTION_RENDER_API_KEY=jr_...      # from POST /v1/keys; keep it in the CI secret store
janction-render render scene.blend --frames 1-24 --size 1280x720 --samples 64 --wait --out ./out
ls out/   # output.mp4 (or frames)

The exit code is non-zero when the job fails; the JSON error has error, possible_fix and retryable, so a pipeline can decide whether to retry.

Plain HTTP (any language)

K=$(curl -s -X POST https://render.janction.jp/v1/keys -H 'Content-Type: application/json' -d '{"label":"ci"}' | jq -r .api_key)
SID=$(curl -s -X POST https://render.janction.jp/v1/files -H "X-API-Key: $K" -F [email protected] | jq -r .scene_id)
JOB=$(curl -s -X POST https://render.janction.jp/v1/jobs -H "X-API-Key: $K" -H 'Content-Type: application/json' \
  -d "{\"scene_id\":\"$SID\",\"kind\":\"final\",\"frame_start\":1,\"frame_end\":24,\"width\":1280,\"height\":720,\"samples\":64,\"output\":\"mp4\",\"notify_url\":\"https://ci.example.com/hooks/render\"}" | jq -r .job_id)
# poll GET /v1/jobs/$JOB (status, progress, eta, artifacts[]) or wait for the POST to notify_url
curl -s -H "X-API-Key: $K" https://render.janction.jp/v1/jobs/$JOB/artifacts/output.mp4 -o output.mp4

notify_url receives one JSON POST when the job finishes (https, public host). GET /v1/jobs/{id} is safe to poll every few seconds; eta.human says how long is left and whether the GPU is lent out.

Batch of variants

Upload once, submit many: the same scene_id can be rendered with different frames, sizes, samples, environment presets or orbit settings. Each job counts against the quota separately; POST /v1/estimate with the same body tells you the GPU seconds and whether it fits before you submit.

Limits that matter in automation

Connect from an agent instead

fromhow
A file on this computer (.blend, 3D file)Drop it at /upload to get a 12-hour link (no sign-up), then tell the AI "Render this file: <link>". From inside Blender use the add-on; from a terminal the CLI uploads directly
Claude.ai (web / desktop / mobile)Settings → Connectors → Add custom connector → https://render.janction.jp/mcp. "Connect" opens a page that creates a free key
ChatGPTSettings → Connectors → Advanced → Developer mode → Create → https://render.janction.jp/mcp (OAuth)
Claude Codeclaude mcp add --transport http janction-render https://render.janction.jp/mcp, then /mcp to authenticate
Codexcodex mcp add janction-render --url https://render.janction.jp/mcp
Cursor / VS CodeAdd to Cursor Add to VS Code
The button opens the editor; confirm and it is added. Manual: Streamable HTTP at https://render.janction.jp/mcp
Gemini CLI / Antigravity CLIgemini extensions install https://github.com/JasmyLab-JANCTION/janction-render
Grok / Perplexity / Le ChatAdd a custom (remote MCP) connector with https://render.janction.jp/mcp in each app's Connectors settings (Grok: New Connector → Custom; Perplexity: Pro / Max / Enterprise; Le Chat: workspace admin)
Windsurf, Cline, Goose, other MCP clientsStreamable HTTP at https://render.janction.jp/mcp; OAuth or Authorization: Bearer <api key>
Terminal (stdio, sends local files)claude mcp add janction-render -e JANCTION_RENDER_SERVER=https://render.janction.jp -- uvx --from janction-render janction-render-mcp
Inside Blender (for people)The add-on; extension repository https://render.janction.jp/extensions/index.json. Maya / Houdini / Cinema 4D: submit tools

How long it takes

jobGPU timenote
preview, 4 frames (720p split in 4 tiles, 16 samples, denoised)about 4 sround trip about 8 s; the image comes back inline
final, 24 frames at 1280x720, 64 samples → MP4about 60 smeasured 2026-09-30 / 10-01 (59 s and 58 s)
final, one 1920x1080 frame at 128 samplesabout 11 sthe estimator's baseline; heavy scenes take longer

These are individual observations of simple scenes (2026-09-30 to 10-01 UTC, NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition, 96 GB). The 4-GPU-second example used a rotating cube, four 640x360 tiles and 16 samples. GPU time includes Blender startup and scene loading; it is distinct from completion time including queue and transfers. See conditions, round trips and reproduction files. These are not speed guarantees.

render_estimate gives the number before rendering; once a scene has been rendered once, the estimate uses that scene's own measurement.

Free limits

Free beta (as of 2026-10-01): 10 GPU-minutes per key per day (20 per network), final renders up to 240 frames at 1080p. Quotas reset at 00:00 UTC (09:00 JST). New jobs exceeding the quota are rejected with HTTP 429 quota_exceeded and resets_at; they are not queued for the next day. Resubmit after the quota resets. No sign-up: connecting creates a key. Inputs and results are deleted 24 hours after last use and never used for training. Paid plans will be announced on this site and in llms.txt before they start.

FAQ

Does the CI runner need Blender or a GPU?

No. Only Python (for the CLI) or curl. Blender 5.0 and the NVIDIA GPU run on JANCTION's side.

Is there a webhook when the render finishes?

Yes: pass notify_url (https, public host) in the job; the service POSTs one JSON when the job ends. Polling GET /v1/jobs/{id} works too.

Can I keep the API key out of the repository?

Yes. Create a key with POST /v1/keys and store it in the CI secret store as JANCTION_RENDER_API_KEY; revoke it with POST /v1/keys/revoke if it leaks.

Related

Overview · llms.txt

JANCTION Render v0.4.17 · JasmyLab Inc. · Updated 2026-10-05 · Tested with Blender 5.0, JANCTION Render 0.4.17 · 日本語