Text→Image
Concept to plate
Qwen-Image 2.1 serving through ComfyUI. Photoreal or diagrammatic, at 1024² and up, with the prompt and seed kept alongside the output.
1024² · 20 steps · 6.9 GB diffusion weights
Private asset studio
nano-spatial takes a prompt or a photograph all the way to a finished asset — image, mesh, CAD solid, rig, video, audio — on a single machine. One queue, no render farm, and every lane reports whether it is bound before it takes a job.
Pipelines
Every lane is a registered adapter with declared inputs, outputs and runtime. Engines can be swapped without touching the job queue.
Text→Image
Qwen-Image 2.1 serving through ComfyUI. Photoreal or diagrammatic, at 1024² and up, with the prompt and seed kept alongside the output.
1024² · 20 steps · 6.9 GB diffusion weights
Image→3D mesh
TRELLIS.2 through trellis.cpp, with Vulkan and ROCm backends selectable per job. Textured GLB out, at 1024 or 512.
10 GGUF weight files · ROCm or Vulkan
Image→CAD
Zero-to-CAD on Qwen3VL-2B reads a part and emits a parametric solid — dimensions you can edit, not just a mesh you can look at.
Qwen3VL-2B · CPU lane
Mesh→Rig
SkinTokens builds a skeleton and skin weights directly from a raw mesh, so a scanned or generated model can be animated without hand-rigging.
torch 2.14 + ROCm 7.2 · gfx1151
Frames→Video
Frames to video on ffmpeg 9.0.2 — no model in the loop, so a re-render is byte-comparable and a bad frame is a bug you can fix, not a roll of the dice.
ffmpeg 9.0.2 · no GPU
Text→Audio
Stable Audio 3 medium on Vulkan renders stereo beds and stingers, sized to the cut rather than licensed by the track.
sa3.cpp · Vulkan · GGUF stack
Runtime
The suite is ten Rust crates and a Next.js console. Engines declare themselves to the registry at boot and are probed before a job can be routed to them.
—LOC
Rust engine cores
—
Crates, mesh IO to API
—GiB
Unified memory, one GPU
—
Assets, versioned
Vulkan and ROCm live side by side: the same TRELLIS weights run on either backend, and a lane that cannot bind reports itself unbound rather than failing a job quietly in the dark.
Renders are queued, not babysat. The console tracks every job, every artifact and every engine version that produced it — so a result can be reproduced, not just admired.
{
"adapter": "trellis_cpp_image_to_3d_rocm",
"input": ["image"],
"output": ["mesh"],
"valid": true,
"runtime": "trellis.cpp 0.8.1 prebuilt ROCm
(ggml 0.24.0 hip), 10 GGUF weights 16 GB"
}
Provenance
Every asset carries its sources and a ruling per use. Anything unruled defaults to review — the studio does not pretend to know what it hasn't been told.
{
"asset_id": "cad-bracket-01",
"asset_version": 2,
"source_refs": [{
"source_id": "local-stl-sha256:8e194a61…",
"commercial": "approved",
"training": "approved",
"output_reuse": "approved"
}],
"rights_rulings": [{
"operator": "cluer-studio-agent",
"reason": "geometry generated locally with
Open CASCADE; no third-party source",
"ruled_at_unix": 1793905799
}]
}
A reference is a hash, not a filename. The same bytes are the same source everywhere, and an asset can always be traced back to what actually went in.
Commercial use, training use and reuse of the output are distinct rulings. A source cleared for one is not silently cleared for the others.
Each ruling records who made it, when, and why — so a later decision replaces an earlier one with a reason attached, instead of overwriting the record.
Console
Jobs, assets, generation and rights review in one console. These are captures from the running studio, not mockups.
nano-spatial is a private studio running on one workstation. Write if you want a walkthrough, or a lane built for a pipeline you already have.