Skip to content
PuniDocs
Open Puni

Rendering


Three ways to draw a scene: the studio's own renderer in your browser, its path tracer for a finer still, and Blender Cycles on your Mac.

Three render tiers: studio raster, path tracer, and Cycles on your Macsame evaluator, same geometrya GLB of the sampled scene01Studio rasterwhat the stage drawsbrowser, or headless ChromePNG · film · covers02Path tracersamples, soft lightthe same placePNG03CyclesBlender on your Maclocal renderer · 4317PNG · .blendGLB and USDZ come from the first tier too: the sampled scene, in metresthe stage is tier one, liveThree render tiers: studio raster, path tracer, and Cycles on your Mac01Studio rasterwhat the stage drawsbrowser, or headless ChromePNG · film · covers02Path tracersamples, soft lightthe same placePNG03CyclesBlender on your Maclocal renderer · 4317PNG · .blendthe first two draw what thestage draws
The first two draw exactly what the stage draws. Cycles takes the sampled scene and needs your Mac.

The stage you edit on is a live render. Everything past it is a choice between speed, quality, and where the work runs.

Open in Puni and choose a scene to open Export.

#The three tiers

TierWhere it runsGood for
Studio rasterYour browser, or the command line's own headless ChromeThe stage, covers, quick PNGs, films
Path tracerThe same place, with a sample countA finer still with soft shadows and real glass
CyclesBlender on your Mac, through the local rendererA print-quality still, a .blend file to keep working in

The studio raster draws exactly what the stage draws, with the same evaluator, geometry and materials. The path tracer does too for every ordinary scene, but it cannot draw a stylised surface: the flat and toon skins, ink outlines, tone mapping off, flat shading. The Render view is off for such a scene and drops out of it the moment one arrives. A sample count above 0 is refused by name (STYLISED_SKIN_PATH_TRACE). Cycles receives a GLB of the sampled scene, so procedural motion is baked at the time you chose. A GLB or USDZ cannot carry a stylised surface either, so Cycles, GLB and USDZ refuse such a scene by name (STYLISED_SKIN_CYCLES, STYLISED_SKIN_GLB, STYLISED_SKIN_USDZ). Facets on a round form are geometry and export everywhere.

Hosted preview rendering is configured for PNG stills. A connected MCP client with render access calls puni_render_view. The studio can also ask the worker for a cover when a browser cannot draw. A successful worker health check alone does not establish a completed render.

#Export from the studio

Open Share → Export, or press ⌘E on Mac (Ctrl+E on Windows).

FormatWhat you get
StillA PNG of the current frame at the width you choose
CyclesA high-quality still from Cycles through the local renderer
FilmAn MP4 of the timeline: a silent film of the saved scene where the studio offers Film on Puni's film service, otherwise a film with sound through the local renderer (see Films)
SoundThe scene's sound over its full duration
3D assetPortable geometry and materials for web, Apple and Android
ProjectEverything editable: objects, modules, actions, cameras, sources and checksums

Cycles requires a successful health check of the local renderer on this computer. Start it, then reopen Export. Where the studio offers Film on Puni's film service, the service draws it from the saved revision, not this browser. Otherwise Film needs the local renderer too, and a browser that does not draw the scene in a worker. If Film is unavailable in Export, use puni render film on a computer with the local renderer.

#The local renderer

The renderer is a small service on your computer at http://127.0.0.1:4317. It needs Node 22, FFmpeg, and Blender for Cycles work. On Apple silicon its setup script installs a pinned Blender for you.

bash
pnpm -C apps/renderer setup:blender
pnpm -C apps/renderer start

It listens on loopback only and accepts requests from Puni's own origins. Finished jobs keep their files and a receipt on disk.

#From the command line

bash
puni render png --file scene.json --output still.png --time 1 --width 1200 --height 1200 --json
puni render png --file scene.json --output traced.png --samples 128 --camera shot --json
puni render glb --file scene.json --output scene.glb --json

--samples 0 is the studio raster; 1 to 1024 uses the path tracer. --camera shot uses your authored cameras; the default is the fitted orbit view. The command needs a browser, and nothing else: no signed-in session, no running app. It uses an installed Chrome, or offers to download a Chromium once (see Render commands).

The direct-worker CLI path is for operators with their own worker, not a token copied from Settings. See Self-hosted render worker.

GIF and Video are downloads on the share page. Cycles uses the local renderer. A connected agent makes a film with puni_render_film on Puni's film service, the one the studio's Film uses where it is offered. There is no remote MCP GIF tool.

#What a render is not

scene evaluate and the agent tools' frame evaluation return numbers, not pictures. A render is the only visual proof. The command line prints the output path, its byte count and its SHA-256 so a picture can be tied to the exact document it came from.

Read Films for motion, or the render command reference for every flag. Local Cycles requires a studio build explicitly configured with NEXT_PUBLIC_PUNI_LOCAL_RENDERER=1 and a ready local renderer. Builds without this flag do not probe your local network. A build that does not offer the hosted Film can still film through that local renderer.

Was this useful?