The command line
The same engine as the studio in a terminal: make and edit scenes as files, render, and work with your library and agents.
puni is the studio without the screen. It edits the same scene document with the same commands, evaluates the same motion, and renders with the same renderer. Every command answers in JSON when you ask.
Inspect the Subject in the Soft Guest study. Use jq to show its identifying fields:
puni scene create --study soft-guest --output soft-guest.scene.json
puni scene inspect --file soft-guest.scene.json --ids subject --json \
| jq '.data.objects[] | {id, name, moduleId, parentId}'Captured command output:
{
"id": "subject",
"name": "Subject",
"moduleId": "structure",
"parentId": null
}#What it is for
| Use | Commands |
|---|---|
| Make a scene as a file | scene create, scene apply, scene fit, scene behavior |
| Check it | scene inspect, scene evaluate, scene validate |
| Draw it | render png, render glb, render usdz, render film |
| Work with your library | project list, pull, push, share |
| Search | search keyword, search semantic |
| Run agents | agent request, agent serve |
#Install
The command line is a preview for Puni's own team. It builds from Puni's private repository and is not published to npm, so you can run it only with access to that repository.
pnpm -C apps/cli build
node apps/cli/bin/run.js --helpNode 22 or newer. Rendering needs an installed Chrome (or lets a terminal fetch a Chromium for it); films need the local renderer.
#Sign in
puni auth login --base-url https://puni.design
puni auth status --base-url https://puni.design --jsonType the code it prints on the page it opens, then approve. A sign-in reads and writes; --scope share also shares. Every remote command names its origin with --base-url.
#Answers you can branch on
Add --json to any command. Success is one { "data", "meta" } object; failure is one { "error": { "code", "exitCode", "message" } } object with a nonzero exit. Tokens are redacted from output.
Read the Quickstart to make a scene in five commands, or the command reference for every flag.
Was this useful?