Interior Architecture Studio — 3D Room Configurator
Design a kitchen to the millimetre, then walk inside it — in the browser.
Published anonymously at the client’s request
Overview
A website for a bespoke interior architecture practice, built around a browser-based 3D room planner. Visitors set real dimensions, place cabinetry that snaps flush to the millimetre, change finishes, walk through the result, and request a priced quote.
What this proves
That a web studio can build a real tool, not a brochure. This is computational geometry running at frame rate in a browser tab.
Key features
Magnetic wall and module snapping
Drag a unit near a wall and it rotates to face into the room and pins flush. Drag it near a compatible neighbour and it latches with backs aligned and the gap closed. Auto-placement scans in priority order: extend an existing run, then free wall in 50 mm steps, then an open-floor spiral — validating every candidate against the real collision test.
Derived, self-updating worktops
Counters are never stored as objects. They are recomputed from whichever base units currently form a contiguous run, so moving one cabinet re-templates the counter across the whole row automatically. The design cannot drift out of sync with itself.
First-person walkthrough with collision
Pointer-locked movement at eye height with real collision response against the placed furniture — walking into a cabinet slides along it rather than sticking. On-screen touch controls carry the same experience to a phone.
Three synchronised view modes
A dimensioned 2D plan with live millimetre annotations, an orbiting 3D view, and the walkthrough — one scene, three cameras.
25-item catalogue, 29 live finishes
Products are pure data — adding a module is adding a row, and no component references a SKU. Any of 29 finishes applies per object with immediate visual feedback.
Bill of materials and quote enquiry
The finished design is priced into an itemised bill of materials and submitted with contact details, converting a browsing visitor into an enquiry that already carries a specification.
Undo, redo and project persistence
Named projects with thumbnails reopen on return. Whole-project snapshot history is scoped to one entry per drag gesture, and a no-op drag is popped so a click never costs an undo step.
The experience
A visitor arrives on an editorial landing page and is pushed toward a single primary action: design your space. In the Studio they set real room dimensions in millimetres, choose from a 25-item catalogue, and place modules that behave like joinery — snapping flush to walls, latching to neighbours, refusing to overlap.
They can change any of 29 finishes per object, read live dimensions in plan, orbit the room in 3D, and enter a first-person walkthrough that collides properly with the furniture. Work saves and reopens on return, every edit can be undone, and the finished design converts into a priced enquiry.
Design
A deliberately narrow material palette — paper, stone, ink and a single warm brass accent — with gradients, glass and glow explicitly prohibited in the stylesheet. Cormorant Garamond set light and large against Inter for interface text. An 11px uppercase label at 0.16em tracking carries every eyebrow, button and caption, and all measurements are set in tabular figures so digits align in columns.
The result reads as an architecture practice rather than a software product. The 3D is dressed in the language of architectural drawing — brass dimension lines, small-caps labels, tabular figures — and presented as the studio’s medium rather than as a technology demonstration. That restraint is the whole point.
Engineering
Furniture rotates to arbitrary angles, so axis-aligned boxes produce false overlaps and units that visually fit get rejected. Every module’s footprint is instead an oriented bounding box, and overlap is tested with the separating-axis theorem at a tolerance that lets snapped units touch without registering as a collision. Walkthrough collisions depenetrate along the axis of least penetration in each module’s local frame.
Mixing millimetres — the domain unit — with metres, which Three.js expects, is the classic source of silent 1000× bugs. The type module documents the contract explicitly: every persisted length is millimetres, every angle degrees, and conversion happens exactly once, at the render boundary. If you are converting in two places, one of them is a bug.
Every one of the 29 finishes is drawn to a canvas at runtime from a PRNG seeded on the material id, so a finish looks identical on every reload and the application ships zero texture or model files. Textures are shared by material and quantised tiling rather than cloned per mesh, bringing a full demo kitchen to roughly 305 draw calls, 9,800 triangles and 11 textures. Shadow maps update on demand rather than per frame, since a directional light’s shadow does not change when the camera orbits.
Routing 60fps pointer movement through React would re-render the whole scene, so a live drag writes through a module-level session object outside React entirely, and the drag controller listens on the canvas element rather than per-mesh so a fast drag that outruns the cursor keeps tracking. Storage sits behind a repository interface: swapping localStorage for a server implementation requires implementing the interface and changing nothing else.
A 25-step Playwright journey with 24 assertions drives the real production bundle in CI, covering placement, snapping distances, worktop generation, camera movement in walkthrough, save, reload, restore and quote submission. The project’s own handoff notes document eight bugs that passed both typechecking and code review and were caught only by driving a real browser.
Responsive experience
A two-step responsive design, mobile to large, with the large breakpoint carrying most of the layout logic. The walkthrough has purpose-built touch controls — a virtual movement stick and a look pad. Below the extra-large breakpoint the Studio’s side panels overlay the canvas rather than sitting in flow, a deliberate trade documented in the project’s handoff notes.
Not demonstrated by this project
Stated plainly, because a portfolio is more useful when it is precise about its limits.
- No database — persistence is browser storage behind a repository interface
- No authentication of any kind
- No multilingual support — this build is English only
- No e-commerce or payment processing
- The quote endpoint validates and logs; it does not yet deliver to an inbox or CRM
- Frame rate was measured under software rasterisation, not on real GPU hardware
Portfolio assessment
- Visual design
- 8.0 / 10
- Technical complexity
- 9.0 / 10
- Interactivity
- 9.0 / 10
- Business value
- 6.0 / 10
- Portfolio appeal
- 9.0 / 10


