Talk to your room.
Watch it furnish itself.

Spatialis is an interior design tool for Snap Spectacles. Stand in your room, say “add a marble coffee table”, and it appears at true scale on your real floor. Restyle it by voice. Move and resize it by pinch.

runs in this browser · no headset, no Lens Studio, no install
SPATIALIS · LISTENING “give me a navy velvet sofa” “add a marble coffee table” “a brass floor lamp by the wall” “hang a painting on the wall” “make the sofa leather”
4
Subsystems
161
Tests passing
12
3D models
6
CLAD sessions logged
The problem

Nobody can picture a room they have not seen.

Furnishing a room is guesswork carried out at a distance. You measure a wall, you look at a photograph taken in somebody else's apartment, and you try to hold the result in your head. The sofa arrives three weeks later and it is too deep, or the wrong grey, or it blocks the window you had forgotten was there.

A tape measure and imagination

210 cm is a number. It is not a feeling. Knowing a sofa is 210 cm wide tells you almost nothing about what it will do to the room you are standing in.

Flat plans, flat answers

A planner on a laptop shows a room from above, at a scale nobody lives at, lit by nothing. It answers whether a piece fits. It cannot answer whether it belongs.

Getting it wrong is expensive

Furniture is heavy, delivery is slow, and returning it is worse. The decision is made weeks before the evidence arrives.

And the tools do not fit the glasses

On a headset there is no keyboard and no mouse. A design tool built around dragging a cursor through menus has nothing to hold on to.

What Spatialis does instead. It moves the decision into the room. You stand where the sofa would go, say what you want, and it is there at life size on your own floor, in your own light, next to your own window. You change the finish by saying so. You move it with your hands. Nothing is delivered, and nothing is imagined - you are looking at it.

Who it is for

  • Renters and homeowners deciding before they buy, at the scale they will live with
  • Interior designers and stagers showing a client options on site, not on a screen
  • Anyone rearranging what they already own without moving it twice to find out

Why voice and hands

  • They are the two inputs Spectacles already give you - nothing to learn, nothing to hold
  • Speech carries the whole intent at once: the piece, the finish, the colour and the place
  • Your hands are already how you move furniture. Pinch, drag, let go
Natural speech

No set phrases to learn. Just talk.

Real speech is “uh, put a like, dark wood coffee table over there”. The parser scans the whole sentence for a verb, a noun, a finish, a colour and a placement, then acts on whatever it found - no fixed phrasing required. Below: what you might say, and what the parser pulled out of it - the piece, its finish or colour, and where it goes.

“Put a Scandinavian lounge chair by the wall”
chairfloor · by wallscandinavian
“Add a floating marble coffee table”
coffeeTablecarrara marblefloat
“Give me a navy velvet sofa”
sofavelvetnavy
“Put a table lamp on the table”
tableLamptable
“Make the sofa leather”
restylesofatan leather
“Make it twice as big”
scale×2.0
“By the wall” is not “on the wall.” A chair asked for by the wall still stands on the floor - backed up to a wall and turned to face the room. Read as a wall mount, it would hang a chair at head height. That distinction is a separate anchoring path, and a test.
The pipeline

What happens between speaking and seeing

Four subsystems, each doing one job, sharing one registry of what is in the room; the voice and gesture controllers call into the anchor engine and material swapper through inputs wired in Lens Studio.

01 · HEAR

Voice intent

Speech recognition transcribes what you say. You see the words as they arrive, but only the finished sentence is acted on - and the recogniser's habit of sending the same result twice is filtered out.

02 · PLACE

Surface anchor

Spectacles' World Query scans the real room and reports the surface you are looking at. Its height above the estimated floor is what tells a table apart from the floor.

03 · DRESS

Realistic materials

Each piece gets its own copy of its material, then colour, shine and roughness blend together into the new finish.

04 · ADJUST

Hand gestures

Pinch to drag, two hands to scale and rotate. Release hands it back to the anchor engine to settle.

Under the hood

Four subsystems

About 3,300 lines of TypeScript, type-checked under strict, with nearly 2,900 lines of behavioural tests behind them.

Voice Intent Engine

Scripts/VoiceCommandController.ts

Turns a spoken sentence into an intent, then drives the other three.

  • Longest-alias matching - “coffee table” beats “table”
  • Precedence rules - “add a big sofa” spawns, doesn’t resize
  • Spawn, restyle, recolour, scale, delete, clear
  • Plurals, disfluency and bare nouns all resolve

Surface Anchor Engine

Scripts/SurfaceAnchorEngine.ts

Finds real surfaces and seats furniture flush against them.

  • Floor height is learned gradually - one bad depth reading can’t move the floor
  • Tries again when you were looking at the wrong kind of surface
  • Spirals outward to find a clear spot when the first one is taken
  • “By the wall” finds the wall first, then the floor in front of it

PBR Material Swapper

Scripts/PBRMaterialSwapper.ts

11 physically based (PBR) finishes and 10 tints, applied to one piece without repainting the rest of the room.

  • Per-object material clones - else one command repaints every sofa in the room
  • Every uniform write guarded for custom shaders
  • Tints preserve the finish: navy velvet stays velvet

Hand Gesture Controller

Scripts/SpatialGestureController.ts

Spectacles Interaction Kit (SIK) hand tracking for pinch, drag, rotate and two-hand scale.

  • Thresholds scale to your hand - 3cm is a firm pinch on a large hand, an open grip on a small one
  • Separate close and open thresholds, so a trembling hand can’t flicker a grab on and off
  • Two hands one continues the drag, doesn’t drop
  • Lost tracking counts as a release, not a freeze
  • Crush to delete - squeeze a held piece well below its minimum and let go
Assets

Twelve pieces of furniture, built to scale

Made for this project rather than downloaded, because placing furniture correctly depends on two things stock models rarely have: a pivot at the base (wall art at its centre) - a centre pivot on a floor piece sinks it halfway into the floor - and true centimetre scale. All twelve total 1,786 triangles, with no textures.

All twelve Spatialis furniture models
Rendered by three.js - an independent glTF reader, not the generator that wrote them.
No smoke, no mirrors

What’s real, what’s simulated

The app you just launched runs in a browser - so it matters exactly which parts are the shipped Lens code and which are scaffolding standing in for hardware.

Real shipped code

The shipped Scripts/*.ts files themselves, compiled for the browser and connected exactly as Lens Studio would connect them. Not reimplementations.

  • VoiceCommandController - parse, execute, spawn animation, debounce, feedback
  • SurfaceAnchorEngine - probe queue, floor calibration, classify, retry, overlap, wall-adjacent, reseat
  • PBRMaterialSwapper - clone-once, cross-fade, guarded uniform writes
  • FURNITURE_CATALOG, SpatialisRegistry, the tween system
  • The same 12 .glb models the Lens loads (centimetre-authored here; the Lens imports the metre-authored copies)

Simulated scaffolding

Stands in for hardware the browser doesn’t have. Replaced on device.

  • The room itself, and ray hit tests against it
    World Query on device
  • Head pose, from the arrow keys
    the headset’s tracking on device
  • Mouse drag and scroll as pinch and scale
    Spectacles Interaction Kit hand tracking on device. The gesture controller itself does not run in the browser - it is covered by tests instead - but letting go still calls the real re-seating code.
  • Web Speech API
    the ASR module on device
  • three.js rendering
    the Spectacles display on device
CLAD - how it was built

Built with Claude Code, then made to prove itself

Built for the CLAD Summer Hackathon, week 4 Create: a spatial tool that helps people create something faster, easier or more intuitively. Spatialis is a Closed Loop Agentic Development project: prompt, generate, verify against something the agent cannot talk its way past, fix, repeat. Seven sessions from 31 Aug to 6 Sep 2026, every prompt and outcome in the transcript, including the places the agent was wrong and said so.

01 · PROMPT

One brief, four subsystems

A written spec named the four subsystems and the demo script. Claude Code designed the shared registry, the parser, the anchor engine, the material swapper and the gesture state machine from it.

02 · GENERATE

Code, tests, models, project

About 3,300 lines of TypeScript, 161 behavioural tests, twelve furniture models generated to scale, the browser simulator, and the Lens Studio project itself.

03 · VERIFY

Against things that don’t flatter

A type check against Snap’s real Lens Studio API, tests on every push, and the scene wired through Lens Studio’s MCP server with every input read back. Then the Lens was run in Preview and the runtime log read.

04 · FIX

What the loop caught

A 100× import scale that hid the sofa, glTF material names the swapper didn’t know, a float distance that filled the view, a retry ray aimed below the floor, and “on the table” landing on the floor. Each found by running, fixed, and re-run.

Wiring script - builds the Lens Studio scene through the editor API and verifies it by read-back
The transcript - six sessions of prompts, outcomes and retractions
Tests and CI - 161 behavioural tests, type check and simulator build on every push
The real thing

Two front doors, one codebase

The app you can launch above is the browser simulator - it hosts the shipped subsystems against a simulated room so anyone can try Spatialis without hardware. The Lens is the same Scripts/*.ts files running inside Lens Studio for Spectacles. npm run sync:lens keeps the Lens project’s copy identical to the source; nothing is forked.

Browser simulator

For judges and for anyone without a headset.

  • Real parser, anchor engine, material swapper - hosted in a page
  • Room, hit tests, head pose and pinch are simulated
  • Launch app

Lens Studio project

LensProject/ - a Lens Studio project set to the Spectacles target. The scene was wired by Claude Code through Lens Studio’s MCP server (Tools/lens-editor/wire-spatialis.ts), every input verified by read-back, then run in the editor’s Preview.

  • Open LensProject/LensProject.esproj in Lens Studio 5.23.2 or later (the version it was built and run in), sign in to My Lenses, press in Preview
  • Say “give me a navy velvet sofa” - the runtime log shows the spawn, and the sofa appears
  • No room surfaces in the desktop Preview, so pieces float. On Spectacles, World Query should anchor them - Spatialis has not yet been run on hardware, and the pinch feel is untested on a real hand
Spatialis running in Lens Studio Preview: a navy velvet sofa and a marble coffee table spawned by spoken commands
Lens Studio 5.23.2 Preview, captured through the editor’s MCP server. The preview script spoke “give me a navy velvet sofa” and “add a floating marble coffee table”; both were parsed, spawned and styled by the shipped code. The desktop Preview has no room surfaces, so both float.
Run it yourself

Node and Python 3 are the only dependencies

No Lens Studio, no headset, no account.

# clone and verify
$ git clone https://github.com/mrnetwork0001/Spatialis.git && cd Spatialis
$ npm install
$ npm run typecheck   # strict type check of all four subsystems
$ npm test            # 161 behavioural tests

# launch this page and the app
$ npm run sim         # builds the bundle, serves on :8777