Design rooms with your AI agent.
RYMS exposes a real-time 3D room planner through WebMCP. Describe a room, search real furniture, place it, move it, check whether it fits, and keep editing the same scene together.
The key idea is simple: the webpage is the shared source of truth. A human can drag a desk; the next get_room_state call sees that new position. An agent can move the same desk; the human sees it immediately without a reload.
An image can suggest a room. RYMS maintains an editable spatial model with:
- official product dimensions in centimeters;
- deterministic placement and 90° rotations;
- furniture collisions, room boundaries, door clearance, and window warnings;
- real IKEA Spain products, prices returned at lookup time, images, and links;
- real IKEA 3D models when a verified asset works;
- exact-dimension procedural furniture when it does not;
- a shopping list derived from what is actually placed.
There is no LLM or OpenAI API dependency inside RYMS. The agent lives outside the app and operates deterministic tools.
flowchart LR
Human[Human] <--> UI[RYMS UI]
ChatGPT[ChatGPT / agent] --> WebMCP[WebMCP tools]
UI <--> State[Shared Zustand room state]
WebMCP <--> State
State --> Engine[Geometry + collision engine]
State --> Scene[Three.js scene]
WebMCP --> Catalog[Catalog adapter]
UI --> Catalog
Catalog --> Mock[Local mock catalog]
Catalog --> IKEA[IKEA Spain search + product metadata]
IKEA --> Rotera[Rotera descriptor]
Scene --> Proxy[Bounded same-origin model proxy]
Proxy --> CDN[IKEA model infrastructure]
The retailer boundary is isolated under src/catalog/ikea/ and app/api/catalog/ikea/. Replacing the unofficial IKEA adapter with a future official API does not change the room engine, UI, or WebMCP contracts.
- “Create a 3.4 × 2.8 m office with a centered north window and a south door.”
- “Find two white IKEA desks under €200, no wider than 120 × 70 cm, and add storage.”
- “The KALLAX blocks the entrance. Move it and keep the layout valid.”
- Drag the KALLAX or a desk manually.
- “Does this still work?”
- “Give me the shopping list.”
Load demo builds the same reproducible room immediately. Products appear at their exact dimensions first and upgrade to verified GLBs as they load.
get_room_state, create_room, update_room, search_products, get_product, place_product, move_item, remove_item, analyze_layout, get_shopping_list, and clear_layout.
All spatial values are centimeters. Tool descriptions distinguish catalog itemNo values from placed instanceId values, document wall offsets, and return concrete recovery information after an invalid placement. If live IKEA search fails, the tool returns clearly labelled sample-catalog results so planning can continue. Browsers without WebMCP retain the complete manual planner.
For current Chrome development builds, WebMCP testing may require the experimental chrome://flags/#enable-webmcp-testing flag. RYMS feature-detects the API rather than assuming a browser version. Open ?debug=1 to inspect the tools that actually registered.
The current integration provides real IKEA data throughout search and placement. Real models are an enhancement, never a prerequisite.
In a deliberately varied spike of 36 IKEA Spain articles across 9 categories:
- 22/36 had Rotera descriptors containing a GLB reference;
- 11/36 had an asset that was downloadable, decodable, and geometrically usable at test time;
- variants of the same product family sometimes had different model URLs or no working model.
This is a sample, not a catalog-wide coverage estimate. The complete table, bounding boxes, deltas, formats, asset sizes, and reproduction notes live in DISCOVERY.md and at /discovery in the app.
npm install
npm run devQuality gate:
npm run typecheck
npm run lint
npm test
npm run test:e2e
npm run build
npm auditIKEA investigation scripts:
npm run probe:ikea-search
npm run probe:ikea-product -- 00263850 https://www.ikea.com/es/es/p/billy-libreria-blanco-00263850/
npm run probe:ikea-3d -- 00263850
npm run probe:ikea-3d-batch
npm run probe:ikea-filter -- "escritorio blanco"Downloaded experiments belong in tmp/ or .local-assets/; both are excluded from version control. IKEA model binaries are never committed or mirrored.
RYMS v0.1 intentionally supports one rectangular room, doors/windows, axis-aligned furniture, and quarter-turn rotations. It does not include accounts, a database, checkout, arbitrary floor plans, CAD precision, photorealism, stock guarantees, or an embedded chatbot. desiredPassageCm is a reporting target; full path-width navigation remains a future occupancy-grid enhancement.
RYMS is an independent open-source experiment and is not affiliated with, endorsed by, or sponsored by IKEA. The adapter uses publicly reachable but unofficial storefront and Rotera interfaces, which can change or disappear without notice. RYMS does not redistribute IKEA catalog or 3D assets. Models are requested at runtime from their originating infrastructure through a bounded same-origin proxy only when technically available; fallback geometry is generated from normalized product dimensions. Review applicable terms before any public production deployment.
The local Draco decoder is distributed under Apache-2.0; see THIRD_PARTY_NOTICES.md.
The visual identity, palette, voice, and launch copy are documented in BRAND.md. Ready-to-use launch artwork lives in public/brand/.
Hey IKEA — an official product + 3D catalog API would make this much better 👀
