One image in, a walkable 3D environment out in under five minutes. That is the pitch on neilsonnn/image-blaster — 11.8k stars, MIT, front page of Hacker News in May 2026. Built by a World Labs team member (not an official World Labs product), it chains Marble, Hunyuan 3D, nano-banana and ElevenLabs behind a Claude Code skill.
Two questions decide whether you can use it, and the eight English write-ups I could find answer neither:
- What does one run actually cost? (Short answer: the world is fixed at ~$1.34; every dynamic object adds ~$0.46.)
- Can you drop the outputs into an engine? (Short answer: not before you apply a scale correction the CLI never applies for you.)
Both answers are below, with code references and prices as of 2026-10-21.
What it actually is
Not an app — a skill pack for Claude Code. You clone the repo, run claude inside it, hand Claude two API keys (World Labs + FAL), drop an image into input/, and say blast it and confirm each step with me.
| Repo |
neilsonnn/image-blaster, MIT |
| Timeline | created 2026-04-21, last push 2026-05-15; 11,794 ★ (snapshot 2026-10-21) |
| Form |
.claude/skills/* + Node scripts |
| Requires | Claude Code CLI + World Labs key + FAL key |
| Outputs | dynamic objects .glb/.obj; static environment .spz; SFX .mp3
|
The three outputs are not the same kind of thing, and that is where every downstream problem starts:
| Output | Format | What it is | What it is not |
|---|---|---|---|
| Static environment | .spz |
a Gaussian-splat scene you can walk through | not a mesh — no faces, no UVs; needs splat render support |
| Dynamic objects |
.glb / .obj
|
one real mesh per object | not a scene — you place them yourself |
| SFX | .mp3 |
ambient loop + per-object impact | not a mixed audio system |
The pipeline, as it actually executes (read from the scripts, not the README):
input/ image
├─① clean plate / object cut-outs fal-ai/nano-banana-2/edit $0.08/img
├─② static environment World Labs marble-1.1 1,500 credits
│ └→ .spz (full_res + 500k + 100k + 150k downloaded)
│ └→ collider mesh .glb (100–200k triangles)
├─③ each dynamic object fal-ai/hunyuan-3d/v3.1/pro/... $0.375/call
│ (or .../rapid $0.225, fal-ai/meshy/v6 $0.80)
└─④ SFX fal-ai/elevenlabs/sound-effects/v2 $0.002/sec
Two details that matter and are easy to miss:
-
Every object costs one image edit before the 3D call. The
image-blast-3dskill instructs Claude to first write a cut-out prompt ("Isolate the<object>… white background, centered, tight crop"). So an object is edit + 3D, not 3D. -
SFX go through FAL, not ElevenLabs directly (
fal-ai/elevenlabs/sound-effects/v2). If you price this off ElevenLabs credit tables you will be off by an order of magnitude. The skill's defaults: ambient--loop --count 2 --duration-seconds 10, per object--count 4 --duration-seconds 1.
The bill
Prices below are the vendors' own pages, checked 2026-10-21.
| Item | Price | Source |
|---|---|---|
| World Labs credits | $1.00 = 1,250 credits; minimum purchase $5 | docs.worldlabs.ai/api/pricing |
World generation marble-1.1
|
1,500 credits = $1.20 | same |
| Pano generation (non-pano image) | +80 credits = $0.064 | same |
| HQ mesh export | 3,500 credits = $2.80 | same (this pipeline never calls it) |
Image edit nano-banana-2/edit
|
$0.08 / image (2K/4K ×1.5) | FAL model page |
Object 3D hunyuan-3d/v3.1/pro
|
$0.375 / generation | FAL model page |
Object 3D .../rapid
|
$0.225 / generation | FAL model page |
Object 3D meshy/v6
|
$0.80 / generation | FAL model page |
SFX elevenlabs/sound-effects/v2
|
$0.002 / second | FAL model page |
Which reduces to a very simple structure:
fixed per run = world 1.264 (1,500 + 80 credits) + one plate edit 0.08 ≈ $1.34
per object = cut-out edit 0.08 + 3D 0.375 + impact SFX 4s × 0.002 ≈ $0.46
| Scene | Math | Total |
|---|---|---|
| 1 object | 1.34 + 0.46 | ≈ $1.81 |
| 5 objects (one room) | 1.34 + 5 × 0.46 | ≈ $3.66 |
| 20 objects (street / level) | 1.34 + 20 × 0.46 | ≈ $10.60 |
20 objects on rapid
|
1.34 + 20 × (0.08 + 0.225 + 0.008) | ≈ $7.62 |
20 objects on meshy v6
|
1.34 + 20 × (0.08 + 0.80 + 0.008) | ≈ $19.10 |
Three non-obvious consequences:
- The world is the cheap part. Marble renders an entire environment for $1.26; five small props cost twice that. Your budget is a function of object count, not canvas size.
-
The $2.80 HQ mesh export is not in the loop.
generate-world.mjsonly pullsassets.mesh.collider_mesh_url— the 100–200k-triangle collision mesh. If you want a static mesh you can actually look at, you have to go back to Marble and export the HQ version separately: ~600k triangles with textures (or ~1M with vertex colors), up to an hour, rate-limited to 4/hour, Pro plan. -
Failures are billable. Unhappy with face count? Re-run: another $0.375. Bad cut-out? Another $0.08. This is exactly why the skill's default posture is
confirm each step with me.
Scope: these are estimates derived from the pipeline structure and public unit prices, not our own invoice. No retries, no plan differences (Free can generate worlds but cannot export; Standard covers splat/collider exports; Pro adds HQ mesh + commercial rights).
The part nobody writes about: the .spz is not in metric space
World Labs documents this in api/rendering-spz:
Marble SPZ files are exported in the generated asset coordinate frame. When you render them outside Marble, use
assets.splats.semantics_metadatato convert Gaussian centers and Gaussian sizes into metric, ground-aligned coordinates.
| Field | Job |
|---|---|
metric_scale_factor |
raw generated units → meters |
ground_plane_offset |
puts the metric ground plane at y = 0 |
flip_y (optional) |
Y-axis orientation (SPZ defaults to RUB, Unreal is Z-up) |
So: is it handled? I grepped the whole repo (2026-10-21, main):
| Location | Reads semantics_metadata? |
|---|---|
app/src/components/WorldViewer.tsx (bundled React viewer) |
Yes — metric_scale_factor, ground_plane_offset, flip_y, defaults 1 / 0 |
.claude/scripts/** (the CLI pipeline that hands you the files) |
No — downloads spz_urls and collider_mesh_url, nothing else |
Which means: it looks right in the bundled viewer because the viewer applies the correction, and it is wrong in Unity / Unreal / Blender / three.js because the exported files don't carry it. Symptoms: a door 30+ units tall, everything floating above or sunk into the floor, and props misaligned against the splat they were generated from.
// three.js: the loader reads the file, it does not fix the frame
const world = await new SPZLoader().loadAsync(url);
const m = semantics.metric_scale_factor;
world.scale.setScalar(m);
world.position.y -= semantics.ground_plane_offset;
Apply the same factor to the collider mesh (inference — the docs only spell this out for splats, but both come from the same generated frame).
What the outputs really are
| Output | Official spec | Who reads it natively |
|---|---|---|
Splat .spz (full res) |
~2M splats | three.js (SPZLoader in addons); Unity / Unreal / Blender / Houdini need community splat plugins |
Splat .spz (low res) |
~500k / 100k / 150k | same; lower res is what you actually want in-engine |
Splat .ply
|
~2M / ~500k | widest compatibility, much bigger — SPZ is roughly 10× smaller than the equivalent PLY |
Collider .glb
|
100–200k triangles | any engine; it is a physics proxy, not a render mesh |
HQ .glb (Pro) |
~600k textured / ~1M vertex-color | any engine; not produced by this pipeline |
Ten-minute acceptance checklist
| # | Check | How | If it fails |
|---|---|---|---|
| 1 | Units are meters | measure a known reference (2 m door) | apply metric_scale_factor
|
| 2 | Ground at y = 0 | splat floor on the zero plane | subtract ground_plane_offset
|
| 3 | Orientation | upside down → flip_y; rotated → world yaw |
flip / rotate |
| 4 | Splat and mesh share scale | overlay the same chair twice | use one factor for both |
| 5 | Face count holds up close | zoom to player distance | re-run with --face-count (billed again) |
| 6 | Collider ≠ render mesh | 100–200k tri file is the collider | keep both, don't swap |
| 7 | File size | prefer low-res .spz in-engine |
see the payload comparison link below |
| 8 | Licensing | code is MIT; assets are generated by third-party APIs | Marble commercial rights sit on Pro; check each vendor |
Four things that will bite you
- Static/dynamic split errors → ghosting. The splat already contains the chair; generate a mesh of the chair and now you have two. Wrong split = double image, and an extra object you didn't want costs $0.46.
- The splat/mesh boundary leaks. Splats have no geometry, cast no shadows, don't receive light like meshes. Contact shadows and occlusion at the seam won't match. (Inference: add AO blob decals under meshes, or cover the contact band with mesh.)
- The 50k default is the skill's, not the API's. Hunyuan's own default is 500,000 faces. Background props are fine; hero objects look generated up close.
-
SFX are materials, not an audio system. Two 10-second ambient loops, four 1-second impacts per object. No rolling, no sustained sounds, no material variation. Non-loop output gets trimmed and loudness-normalized by
ffmpeg; loop output is left raw for seamlessness.
When not to use it
| You want | Why not | Instead |
|---|---|---|
| One model, no scene | the $1.34 world is wasted | call the FAL model directly |
| Precise dimensions | generation isn't dimension-driven | parametric CAD workflow |
| Editable topology / clean UVs | you get "scanned" topology | rebuild from the form (Mesh2CAD route) |
| Offline / on-prem | the whole chain is two cloud APIs | local text-to-3D (e.g. TRELLIS.2 in-browser) |
| Team doesn't use Claude Code | it's a skill pack, not a GUI app | drive the scripts yourself |
| Clean commercial rights | assets come from multiple vendors | verify each license |
The one thing it is genuinely good at: you have an image — concept art, a film still, a photo of a room — and you need a prototype you can walk around in within five minutes to align the space, test framing, or show a client. For that, it beats hand-building the scene by a wide margin.
Scope and sources: repo README, `.claude/skills/ and .claude/scripts/ (2026-10-21, main); World Labs docs (api/pricing, marble/export/specs, marble/export/gaussian-splat, api/rendering-spz); FAL model pages; Niantic spz format notes and three.js SPZLoader`. **No end-to-end run was performed* — costs are structural estimates from public unit prices, and mesh/engine/license constraints come from documentation rather than our own tests. The author is a World Labs team member; this is their project, not an official World Labs product.*
More from us: the full Chinese write-up with the same billing breakdown · AI × 3D guides on BimAnt
Top comments (1)
"The .spz is not in metric space" is the part that should be in the README, not buried in a blog post.
I've seen this exact problem with other 3D generation tools: the preview looks perfect, but when you export to Unity or Unreal, everything is 30x too big and floating in the air. The fix is always the same — apply the scale factor and ground plane offset — but nobody documents it.
Curious if the author has considered a "fix everything" CLI flag. Something like
--apply-metric-correctionthat bakes the semantics_metadata into the exported files, so the user doesn't have to write a custom three.js script.