renda

Get started

Same account and commands from Node or Python. Agents: paste set up renda — https://renda.vochsel.com/llms.txt.

npx @rendahq/cli init            # trial or sign in, MCP + skills for your agent
npx @rendahq/cli render chair.blend --res 1920x1080

The Renda package

A small typed JSON file (*.renda.json) for what scene formats can't express: output, resolution, environment map, camera, animation, engine. Everything except scene.root is optional. JSON Schema: /api/v1/schema.json.

Examples

{
  "version": 1,
  "scene": {
    "root": "./model.glb"
  }
}

Uploading and rendering

# 1. register each file by sha256; PUT bytes if the server doesn't have them
curl -X POST $RENDA/api/v1/uploads -H "authorization: Bearer $KEY" \
  -d '{"filename":"robot.glb","size":48213,"sha256":"<hex>"}'
# → {"assetUri":"asset://<hex>","exists":false,"uploadUrl":"https://…"}
curl -X PUT --data-binary @robot.glb -H "content-type: application/octet-stream" "<uploadUrl>"

# 2. submit, using asset:// uris
curl -X POST $RENDA/api/v1/jobs -H "authorization: Bearer $KEY" \
  -d '{"package":{"scene":{"root":"asset://<hex>"},"output":{"format":"png"}}}'

# 3. poll until status is succeeded, then download outputs[].url
curl $RENDA/api/v1/jobs/<id> -H "authorization: Bearer $KEY"

The renda CLI and MCP server do the upload step for you. Full API: OpenAPI.

Fields

FieldTypeDefaultNotes
versionnumber1
namestring
assetsobject{}
sceneobject
scene.rootstringAsset id or uri of the main scene file.
scene.includeobject[][]
scene.upAxis"Y" | "Z"Defaults to the source format's convention.
scene.unitScalenumber1
scene.materialOverridesobject{}Keys are material names or "*" for all.
cameraobject | object | object{"mode":"auto","fovDeg":35,"elevationDeg":20,"azimuthDeg":35,"padding":0.1}
environmentobject
environment.hdristring | null"studio"Asset id/uri of an equirect .hdr/.exr, or "studio" | "sunset" | "night" built-ins. null = no environment lighting.
environment.intensitynumber1
environment.rotationDegnumber0
environment.background"hdri" | "transparent" | string | any[]"hdri"
lightsobject | object | object | object[][]
renderobject
render.engine"auto" | "blender-cycles" | "blender-eevee" | "blender-workbench" | "mitsuba" | "threejs""auto"
render.resolutionany[][1920,1080]
render.quality"draft" | "standard" | "final""standard"
render.samplesinteger | nullnullOverrides the quality preset.
render.denoisebooleantrue
render.seedinteger0
render.hardware"auto" | "cpu" | "gpu""auto"
animationobject
animation.framesany[]Inclusive [start, end].
animation.fpsnumber30
animation.stepinteger1
animation.turntableobjectOrbit the camera around the scene bounds.
animation.turntable.revolutionsnumber1
animation.turntable.axis"up" | "X" | "Y" | "Z""up"
outputobject
output.format"png" | "jpg" | "webp" | "exr" | "mp4" | "webm" | "gif" | "mov""png"
output.passes"beauty" | "alpha" | "depth" | "normal" | "albedo" | "mask"[]["beauty"]
output.transparentbooleanfalse
output.videoobject
output.video.codec"h264" | "h265" | "vp9" | "prores" | "gif"
output.video.crfinteger18
output.keepFramesbooleanfalseAlso return individual frames for video outputs.