High quality renders of your Three.js scenes

Turn your scene into a studio-quality image, video, or baked 3D model

Delightfully simple integration

Connect your scene and call render() or renderVideo(). The SDK reads your objects, camera, materials and lights and passes them on to the renderer. The scene you ship is the scene that renders.

But it doesn’t end there. The SDK offers ways to spice up your scene or 3D model viewer, like adding rooms or environments. And psst, you can even render TSL shaders.

import { useBakery3 } from '@oeave/bakery3/r3f'

function RenderButton() {
  const { render } = useBakery3({ apiKey: 'bk_sk_…' })

  async function onClick() {
    const job = await render({ quality: 'studio' })
    const image = await job.result() // { url, width, height, cost, ... }
  }

  return <button onClick={onClick}>Render</button>
}

See what will render before you spend anything

The compatibility checker tells you which materials will render, and the estimate tells you what the render will cost. Nothing is uploaded or charged until you’re ready.

const report = bakery3.check()
const quote = await bakery3.estimate()
compatibility report
Scene compatibility: 97%

✓ 84 MeshStandardMaterials
✓ 12 MeshPhysicalMaterials
✓ HDR environment
✓ Instanced geometry

✗ 1 ShaderMaterial needs a fallback
⚠ 8192px texture slows the upload

Estimated studio render:
$0.12 (max $0.16)

Use cases

Product configurators

When your user is done configuring their sofa, render out a real, good-looking version showing their exact object with great lighting, the right materials, and maybe even in an environment.

Build this into your product configurator and increase your buyer’s confidence.

Show your product in free pre-made environments

Drop your product into a ready-made room, a backdrop or a studio floor, and render it there. No scene to build or complex lighting tweaks.

import { createPresetRoom, applyPresetRoomCamera } from '@oeave/bakery3/presets'

const room = useMemo(() => createPresetRoom('loft_golden'), [])
const camera = useThree((state) => state.camera)
useEffect(() => applyPresetRoomCamera(camera, room), [camera, room])

<primitive object={room} />
<Product position={room.userData.stand} />
A pair of sneakers on a marble pedestal in a loft at golden hour, as your Three.js viewport shows itA pair of sneakers on a marble pedestal in a loft at golden hour

Furnished rooms

12 interiors with windows, furniture and designed lighting, from midday to night. Your page shows a lightweight version of the room, and the render builds it at full quality.

createPresetRoom('loft_golden')

The same sneakers on a dark glossy ground, lit by soft cyan and magenta light, as your Three.js viewport shows itThe same sneakers on a dark glossy ground, lit by soft cyan and magenta light

Abstract backdrops

Shader-lit domes for a product with no room: four shaders, in dark, colorful or light. The glow is real light in the render, so it shows up in the reflections and on the ground.

createEnvironment({ shader: 'blobs' })

The same sneakers on an oak floor under soft studio light, as your Three.js viewport shows itThe same sneakers on an oak floor under soft studio light

Floors and pedestals

Fifteen seamless PBR materials, four pedestals and a shelf of studio HDRIs, for a clean catalog shot of your product.

createPresetMaterial('oak_floor')

Bake your scene to get the best of both worlds

Get beautiful lighting and shading AND keep the scene spinnable

Instead of getting just an image, get an optimized .glb back that shows your 3D model and environment with baked lighting.

import { createBakeSession } from '@oeave/bakery3/bake'

const session = createBakeSession({ scene })

const job = await bakery3.bake({ settings: { textureSize: 1024 } })
const { bundle } = await job.result()

await session.apply(session.addGeneration(bundle))
Baked
Baked

A ready-made room with the product on its own stand. The light is already painted onto every surface, so the warm wash down the wall and the shadow under the vase stay where they are while you spin it.

up to 2048² lightmaps·high quality·72 object(s) lit·33% of seams in view·57.0 MB to interact

Incredible realism, straight from your MeshPhysicalMaterial

The renderer uses the same concepts your application does: physical materials, HDR environments, instancing, skinned meshes

Three.js: the same scene in the viewportRendered, caustics: 'soft'Three.jsRendered, caustics: 'soft'

1024×870·ultra preset·caustics: soft

The SDK is open source

MIT licensed. Inspect exactly what leaves your application.

The protocol is published

Call inspect() to read the scene manifest before anything is uploaded.

Results are ordinary files

PNG, JPEG, WebP, GLB, EXR. Transparent background by default.

Pay for renders. No subscription needed

Renders are prepaid. Add credit to your balance and spend it whenever you need it. Your balance never expires, and failed renders are never charged.

HD preview~$0.04
2K studio~$0.10–$0.15
4K studio~$0.40–$0.60

Top up from $5. Every render is estimated first, and you can set a hard cost ceiling in code.

Scale to an entire catalog

Start a batched render with multiple variants, cameras, and formats, and be notified when done.

await renderVariants({
  key: 'fall-2026',
  variants: products,
  apply: (product) => configurator.show(product),
  cameras: ['hero', 'front', 'detail'],
  maxCost: 600
})

Our promises to you

  • The SDK is open source.
  • Your results are ordinary files.
  • Your assets stay yours.
  • Your render balance doesn’t expire.
  • No subscription required, ever.
  • Failed renders aren’t charged.
  • Prices are visible before work starts.
  • You can delete your uploads and renders at any time.
  • We don’t train models on your scenes or product assets.

Keep building in Three.js

We’ll make it look great

npm install @oeave/bakery3

Start for free. Render your first scene.

No subscription required.
No complicated workflow.
No manual export.