technical specsthe record · fine print · none of it required
What leaves the factory, measured.
The home page says what mojulo does in plain words. This page is the fine print underneath it: one real room carried through the export and opened in Blender, Unreal and Godot, with the gate counts; the rack of tools an export can land in, with what each asks you to install; and the print door, with two slicers' own numbers. Every figure here was read off a real run on one machine. Where nothing has been run, the record says so instead of promising.
one export, on the recordref sk_lkypzdim4y · one room, end to end
What an export actually is, shown on one real room rather than claimed. A twelve-line recipe became a furnished lounge — walls, sofa, oak boards, nine ceiling cans — and one export wrote it out as a standard glTF binary plus a small score, wrapped with an importer script and a guide per engine. No engine-specific geometry is authored anywhere: the lights, the emissive lenses and the unit scale travel as standard extensions engines already understand. This is the recipe, whole — nothing below it was authored by hand — and the two edits the room went through: one field that lit the ceiling, and one kernel fix that turned the couch around.
{
"title": "One-room house plan — living",
"kind": "floorplan",
"width": 24, "height": 28,
"rooms": [{ "x": 2, "y": 2, "w": 20, "h": 24, "glyph": "L" }],
"doors": [{ "x": 12, "y": 26, "room": 0, "edge": "S" }],
"furnish": true,
"view": "cutaway",
"seed": 7,
"potLights": true
}
The second edit never touched the recipe. The sofa faced the door — not a recipe choice, a kernel bug: the arranger had never given it a facing, and the couch was the one piece built in world space, so a facing would have been ignored anyway. Two lines in the kernel, and every lounge in every floorplan re-renders seated toward the screen. The operator owns the recipe; the maintainer owns the kernel; neither touches an export by hand.
// floorplan-glyphs.js · arrangeLiving - { type: 'sofa', asset: 'modern-couch', anchor: [j(0.5, 0.04), 0.72], … }, + { type: 'sofa', asset: 'modern-couch', anchor: [j(0.5, 0.04), 0.72], …, facing: 'S' }, // room-assets.js · the modern-couch maker - buildModernCouchWorkbenchManifest({ x: cx, y: cy, z: base[0][2], w, d, h }) + local: true, + buildModernCouchWorkbenchManifest({ x: 0, y: 0, z: 0, w, d, h })
model.glb 694 KB · 26 nodes · 10,694 triangles · 9 spot lights (KHR_lights_punctual) score.json metersPerUnit 0.3048 → engines receive life size · spawn, eye height, lights ledger what did NOT travel: sky dome approximated · 2 cameras ride as data only
two gates, never conflated — a machine measured the handoff (unreal 5.8, stock importer: 7 of 7 checks, 9 of 9 lights, spawn in metres), and a person walked the room. the machine passed every time; the person found the scale bug — before the unit fix the room landed at 3.28× life size — and the couch with its back to the screen. both gates stay.
and since, in the other two — godot opened this room after the fact: the first open clipped every surface to white (its importer copies candela straight into light energy), and one kernel fix later a frame from inside reads like the cycles night render. one room, one pair of eyes. unity's machine gate builds what the file declares — 14 lit, 2 unlit, 9 lights — but nobody has looked at how bright the spots land, so no claim is made for it there. that's the rule the fine print below is written by.
exportsfine print · none required
Nothing below is required — the HTML page and the print files ship on their own. If you already work in one of these, this is where the handoff lands: your tool opens a file it already reads, and the recipe stays here.
travels as glTF 2.0 · KHR_lights_punctual · KHR_mesh_quantization
OpenUSD .usda / .usdz · AR Quick Look at true scale
STL / 3MF · mm, z-up, slicer-ready
VRM bone names on figures · WAV / MIDI for sound
score.json · spawn, eye height, lights, metres per unit
returns as a refined .glb, bound back with a sha256 sidecar
from a Blender pass, or a sculptor working off the greybox
stamped greybox — geometry and scale authoritative, surfaces yours
ledgered what did NOT travel, per export, in plain text
Godotgame engine
Export, open the folder in Godot, press play. No import
steps, no account; the editor is a small free download.
the setup
- free editor, ~150 MB — no account, no launcher
- open the exported folder as a project — that's the import
- machine gate runs the editor headless, optional
what you get
- a complete text-only project — scenes, GLBs, score, presets
- the mojulo-godot kernel (GDScript) performs the mechanics live
- playable on open · full mechanics vocabulary · ledger in the README
Blenderworks backstage
Headless, it bakes Cycles light into the model. Or it builds
a .blend for an artist to surface by hand, and binds the result back. Not
installed? The bake skips.
the setup
- free, ~700 MB — no account, no addon
- the bake needs no window — the agent drives it headless
- the art-pass pack opens like any .blend; tell mojulo where Blender lives
what you get
- real path-traced light (Cycles GI) baked into the geometry's own colours
- whole worlds lit in place, hero figures on plinths — bound back with provenance
- an art-pass pack — GLB, import and return scripts, a numbered guide; the hand-surfaced mesh binds back as a variant, never a recipe edit
- the baked result ships anywhere at zero runtime cost — viewers need no Blender
Unitygame engine
A numbered guide walks the import — exact UI paths, verify
before instruct. Unity's side of the bill is a multi-GB editor and an
account.
the setup
- multi-GB editor (6000.2.x) via Unity Hub + a Unity account
- a step-numbered import guide — exact UI paths, verify before instruct
- headless verify gate, pointed at your editor install
what you get
- GLBs + score + game data, and the mojulo-unity kernel — C# import + runtime scripts
- deterministic GUIDs — re-mints re-import diff-clean
- mechanics interpreted live · what didn't travel is printed, never dropped
Unrealgame engine
An editor script imports the pack; for games, a C++ plugin
your project compiles performs the mechanics. Unreal's side of the bill is
the largest editor on this rack and an Epic account.
the setup
- multi-GB editor (UE 5, gated on 5.8) via the Epic launcher + an Epic account
- a step-numbered import guide; a game pack needs your project to compile the plugin
- headless verify gate, pointed at your editor install
what you get
- GLB + score + game data, an editor Python importer (scene, colliders, PlayerStart, lights) and the MojuloKernel C++ plugin
- idempotent re-import — tagged actors cleared and rebuilt on re-run
- mechanics interpreted live · what didn't travel is printed, never dropped
the meter is setup, not quality — the disk, accounts and hands-on steps a tool asks before it gives anything back. godot asks almost nothing; unreal asks the most. a door not on this rack isn't ruled out — it's just not promised.
to the printerfine print · the near door · ref sk_hpr0rf20ik
The door that asks nothing from the rack above. A headphone hook for a desk edge — a C-shaped clamp and a swept arm, a recipe of 415 bytes — was asked for at 19 mm, measured, widened to 25 mm on the same ref, and written out as a 3MF: millimetres declared inside the file, its shading along as materials. The slicer on this machine sliced it headless and stamped what it measured beside the file. Then a person opened the file on the slicer's bed. Nothing has been printed yet, and the record below says so.
model.3mf 81 × 30 × 33 mm · closed, 0 open rims · one solid, 16,324 mm³, genus 0 · 95 basematerials
measured overhang 1,126 mm² at 90°, 26 faces under the arm · least support built along y+, on its side
thinnest sampled wall 4 mm, the jaw · 5th percentile 9.7 mm
stamp PrusaSlicer 2.9.6, headless, its own default profile · sliced · size agrees · manifold
110 layers at 0.3 mm · 48 min · 4.1 m of filament (grams need a filament profile) · supports: false
Bambu Studio 02.08, headless, the A1 0.4 nozzle profiles · sliced · size agrees · manifold
165 layers at 0.2 mm · 1 h 15 min · 3.3 m of filament · supports: false
ledger the stamp said no supports; the measured rung named the overhang anyway
opened on the slicer's bed by eye at 81 × 30 × 33 mm · not sliced by hand · not printed
the machine measured three times here — mojulo's own rung (closure, union, overhang, sampled walls) and two slicers' (does it slice, how long, supports). they disagreed once, usefully. prusaslicer said supports: false under its defaults; a person opening the file found the arm's overhang; so the measured rung was written to name it, and now the stamp carries 1,126 mm² at 90° before anyone opens anything. the slicer's overhang paint against those 26 faces is the eyes gate still open. no print has been made; the last frame is the bed.
Desk printerfdm · filament
Export a 3MF, open it in your slicer, print. The hook above went
through this door twice; a headless slice from PrusaSlicer or Bambu Studio stamps
its numbers beside the file.
the setup
- a free slicer, no account — PrusaSlicer, SuperSlicer or Bambu Studio for the stamp; any slicer to open the file
- found on its own on PATH or in /Applications; otherwise tell mojulo where it lives
- the stamp needs no window — the slice runs headless
what you get
- 3MF — millimetres declared in-file, colours as basematerials, repeats as placeable objects; STL if bare triangles are wanted
- a stamp beside the file: sliced, size agrees, manifold, layers, time, filament, supports
- the profile mojulo measures against: walls from 0.8 mm (two perimeters of a 0.4 nozzle) · 45° self-supporting · 0.2 mm layers · a 220 × 220 × 250 mm bed — override any field
- orcaslicer and cura open the same 3MF · orca shares bambu's command line but has not been run here, so no stamp is promised for it
Resinsla
The same file, read against resin's numbers: thinner walls
allowed, a steeper self-support angle, and one thing a resin part can hide — a
closed cavity that traps liquid.
the setup
- nothing on this machine — printer: { process: 'sla' } re-words the measurement
- your resin slicer takes the STL
- the numbers are design-guide defaults (Formlabs' guide is the source), not a promise about your printer — override any field
what you get
- walls from 0.5 mm · 30° self-supporting · 0.05 mm layers · a 145 × 145 × 175 mm typical bed
- overhang and sampled walls measured against those numbers, the same way as above
- a trapped-volume advisory on every export: the escape hole is yours to add — cavities are not found for you
- the STL or 3MF as before · no resin print is on the record
Powdersls · mjf · a bureau
Powder supports everything, so the overhang line goes quiet. What
it asks instead is a wall the process can hold and a hole for the powder to leave
by. Usually a bureau's printer, not yours.
the setup
- nothing on this machine — process: 'sls' or 'mjf'; the file goes to the bureau's upload as it is
- the bureau's side of the bill: an account, a quote, and the days it takes
what you get
- walls from 0.7 mm (sls) or 1.0 mm (mjf) · no self-support angle · 0.1 / 0.08 mm layers · 300 × 300 × 300 and 380 × 284 × 380 mm typical beds
- overhang reported as none — the process supports everything; walls still sampled
- a trapped-volume advisory: powder needs an escape hole of 2–3 mm; stated, not measured
- the same 3MF or STL · no powder print is on the record
A CAD toolwhen the fit matters
A thread, a press fit, a gear, a bore with a tolerance: that is a
B-rep tool's job, and mojulo says so instead of pretending. The workbench gives
the form; your CAD gives the fit; the part comes home through one bind, in
millimetres.
the setup
- a CAD tool of your own — text-to-cad, FreeCAD, Onshape, Fusion; its install is its own bill
- ask for a fit and the modeler's dictionary answers with the handoff, not a workaround
what you get
- the form, here — brackets, housings, bolt circles print form-accurate from the workbench
- the fit, there — the .step stays the source of the part
- the return — one bind with the file's unit and the tool's own bounding box; a 40 mm bracket lands as 4 cm in a cm workbench. what did not travel (b-rep exactness, mates, materials) is ledgered
- the returned part then rides every other door — a world, an engine, a print beside its own parts
a desk printer asks a free slicer; a bureau asks an account and days. one row has a slice on the record; none has a print yet. the process numbers are design-guide defaults — prusa's knowledge base, formlabs', hp's and eos's guides — not a promise about your machine.
in plain words
The short version of all of the above lives on the home page: what a recipe is, where a thing can go, and how to get started.