Roomet

Roomet

Upload a photo of your room, pick a style, and AI re-imagines the space. Generate three variants, pick one, then edit it furniture-by-furniture until it's exactly what you want.

Type
Web
Role
Solo
Status
Active
Tech
Next.js 15 React 19 TypeScript Tailwind v4 FastAPI Gemini 3 Pro Image YOLO-World arq / Redis Supabase PostgreSQL
Started
Feb 2026

Point Roomet at a photo of a room and it gives you back three AI-generated re-designs in your chosen style. Pick one, then keep editing furniture-by-furniture — swap the couch, change the rug, repaint the walls — until you have the exact room you wanted. Every version is tracked so you can always go back.

What it does

Roomet generated room variant — a styled living room rendered from a user photo

Upload the photo on the left, describe the vibe, and Roomet gives you the three variants below. Each one is a fully re-rendered scene keeping the room’s bones (windows, doorways, floor plan) but letting the style, furniture, and palette go wherever the prompt takes them.

Variant 1Variant 2Variant 3

Before and after

The input is always a real photograph — phone pics, messy lighting, skew, whatever. Roomet handles them because Gemini 3 Pro Image is doing the heavy lifting.

Original user-provided photo — a plain room before Roomet touches it

And here’s the same room after Roomet’s first pass, with a draggable before/after slider in the real UI:

Before / after comparison 1Before / after comparison 2

The app

Three screens carry the whole experience: a landing page, the create/configure flow, and the editor.

Roomet landing pageCreate flow — upload + style pickerEditor — furniture-level edits

User flow

Roomet user flow diagram: upload → configure → generate → pick → edit → export

The /create route walks you through upload → configure → watch the shimmer animation → pick one of three variants. Picking a variant jumps you to /edit/[variantId] where the real interaction happens.

Furniture-level editing

The editor is the heart of the product. Hover any piece of furniture and a SegmentOverlay highlights it (YOLO-World + Gemini segmentation on the backend); click to select it and the bottom bar turns into a furniture-specific prompt input. Type “make this sofa cream linen” and only that sofa changes, leaving the rest of the room untouched.

If nothing is selected, your prompt applies to the whole scene.

Version history

Roomet edit history — horizontal thumbnail strip of every edit, click to roll back

Every edit produces a new version, shown as a thumbnail strip along the bottom of the editor. Click any older version to roll back without losing the later ones — the history is a DAG, not a linear undo stack. Good enough to experiment fearlessly.

Roomet reference gallery — curated rooms grouped by style

A separate gallery feed streams curated reference rooms grouped by style tag. Tap one to copy its style onto your own room.

Architecture

Frontend (Next.js 15, React 19, TypeScript, Tailwind v4):

  • App Router with four top-level routes: /, /create, /edit/[variantId], /scene/[id] (legacy redirect)
  • Canvas overlay for segmentation (SegmentOverlay.tsx) handles bounding-box hit testing and mask highlighting
  • BeforeAfterSlider, StyleCard, PillSelector, ProductQueries compose the rest of the UI
  • API client polls the backend for long-running jobs via pollJob() in lib/api.ts
  • Next.js rewrites proxy /api/* and /uploads/* to the local FastAPI backend so the browser never talks to Gemini directly

Backend (FastAPI + Gemini + arq):

  • FastAPI API with endpoints for scenes, variants, jobs, gallery, and segmentation
  • Heavy generation runs in arq workers (Redis-backed task queue) so HTTP stays snappy; graceful fallback to Python threading when Redis isn’t available
  • Gemini 3 Pro Image for generation and inpainting-style edits; YOLO-World for on-demand furniture segmentation
  • Supabase PostgreSQL with SQLAlchemy — connection pooling, versioned variant history, job status
  • Two-tier image cache: Redis (24h TTL) in front, in-memory LRU (~20 slots) on the API instance
  • Chat-session-based Gemini calls so multi-turn edits on the same variant stay context-aware

Notable bits

  • Furniture-aware editing — segmentation + inpainting lets you edit one object at a time instead of regenerating the whole image for every change. It’s the single difference that makes Roomet feel like a tool instead of a slot machine.
  • Three variants by default — one generation call produces three stylistically different takes so you pick from a real menu, not “try again until it’s right”.
  • Version DAG, not a linear undo — every edit branches off its parent. You can always roll back and take a different direction without losing the timeline you already explored.
  • Smart backend fallbacks — no Redis? threading worker. Gemini rate-limited? retries with exponential backoff. YOLO-World model not loaded? lazy-load it on first segmentation request.