Upload a room photo. Click a chair. It's gone — and now you can move it.
AVRoom is an AI-driven interior design workspace. Point at furniture in a photo, and it's segmented out and the background is inpainted as if it was never there. The removed object survives as a draggable cutout you can reposition, rotate, and copy — all in the browser.
Stable Diffusion refines a native-resolution crop, never the full image — avoids the hallucinations and reimagining of the full room Stable diffusion would otherwise perform.
Inpainting is checked, not trusted. LaMa fills the hole, Stable Diffusion refines the texture, then Gemini looks at a before/after crop and decides whether any ghost of the object survived. If it did, it hands back a corrected prompt and generation parameters and the pass runs again — up to three retries before the last candidate is kept.
Metric3D produces a surface-normal map of the room, so when an object is dropped in smart paste mode, it knows which way the wall or floor under it faces and can turn to match, not just rescale.
graph TB
subgraph Frontend["react-front — React 19 + Vite SPA"]
FE[Workspace / Dashboard / Projects UI]
end
subgraph Backend["fastApi-app — FastAPI (IPE)"]
API[REST API]
JQ[(Job dispatcher<br>queued segment/inpaint/3D)]
PG[(Postgres<br>sessions, objects, jobs)]
Blobs[(Local disk<br>cutouts, GLBs, caches)]
end
subgraph Pipeline["TestModules — avroom_object_removal"]
AI[ObjectRemover<br>depth · SAM · inpaint · 3D]
end
FE -- fetch --> API
API --> JQ --> AI
API --> PG
API --> Blobs
The AI pipeline is imported in-process (pip install -e ./TestModules), not a separate service.
Metadata (sessions, objects, jobs) lives in Postgres; blob artifacts (cutout PNGs, GLBs, novel-view
caches) stay on local disk.
# 1. Start Postgres + Mailpit
docker compose up -d --wait db mailpit
# 2. Python deps (repo root)
python -m venv .venv && .venv\Scripts\activate # or source .venv/bin/activate
pip install -r requirements.txt
# 3. Apply DB schema
cd fastApi-app
alembic upgrade head
# 4. Run backend + frontend
uvicorn main:app --reload # http://127.0.0.1:8000
cd ../react-front && npm install && npm run dev # http://localhost:5173
Windows: run.bat does all of the above in one shot (Postgres/Mailpit → migrations → both dev
servers, each in its own terminal).
| Service | Port |
|---|---|
| FastAPI | 8000 |
| Vite dev server | 5173 |
| Mailpit (email preview) | 8025 |
| Postgres | 5433 (not 5432 — see fastApi-app/.env.example) |
Copy fastApi-app/.env.example to fastApi-app/.env. Everything has a sane local default; the
knobs that matter most:
| Var | Purpose |
|---|---|
HF_TOKEN | Hugging Face token — required for 3D reconstruction (Hunyuan3D-2.1 Space) |
GEMINI_API_KEY | Key for the inpaint verification pass (restrict it to generativelanguage.googleapis.com) |
INFERENCE_WORKERS | 0 = inline with a process GPU lock, N = N parallel inference workers |
VALIDATE | Gate upload validation (technical + content checks); false to skip |
AUTH_MODE | single_user (default, no login) or jwt (real accounts) |
DATABASE_URL | Defaults to the docker-compose Postgres on localhost:5433 |
avroom/
├── TestModules/ # AI pipeline (avroom_object_removal): depth, segmentation, inpainting, 3D
├── fastApi-app/ # FastAPI backend — API routes, job dispatcher, Postgres models
└── react-front/ # React + TypeScript frontend
168 commits
129 commits
Python
72.4%
TypeScript
23.6%
CSS
3.3%
Upload a room photo. Click a chair. It's gone — and now you can move it.
AVRoom is an AI-driven interior design workspace. Point at furniture in a photo, and it's segmented out and the background is inpainted as if it was never there. The removed object survives as a draggable cutout you can reposition, rotate, and copy — all in the browser.
Stable Diffusion refines a native-resolution crop, never the full image — avoids the hallucinations and reimagining of the full room Stable diffusion would otherwise perform.
Inpainting is checked, not trusted. LaMa fills the hole, Stable Diffusion refines the texture, then Gemini looks at a before/after crop and decides whether any ghost of the object survived. If it did, it hands back a corrected prompt and generation parameters and the pass runs again — up to three retries before the last candidate is kept.
Metric3D produces a surface-normal map of the room, so when an object is dropped in smart paste mode, it knows which way the wall or floor under it faces and can turn to match, not just rescale.
graph TB
subgraph Frontend["react-front — React 19 + Vite SPA"]
FE[Workspace / Dashboard / Projects UI]
end
subgraph Backend["fastApi-app — FastAPI (IPE)"]
API[REST API]
JQ[(Job dispatcher<br>queued segment/inpaint/3D)]
PG[(Postgres<br>sessions, objects, jobs)]
Blobs[(Local disk<br>cutouts, GLBs, caches)]
end
subgraph Pipeline["TestModules — avroom_object_removal"]
AI[ObjectRemover<br>depth · SAM · inpaint · 3D]
end
FE -- fetch --> API
API --> JQ --> AI
API --> PG
API --> Blobs
The AI pipeline is imported in-process (pip install -e ./TestModules), not a separate service.
Metadata (sessions, objects, jobs) lives in Postgres; blob artifacts (cutout PNGs, GLBs, novel-view
caches) stay on local disk.
# 1. Start Postgres + Mailpit
docker compose up -d --wait db mailpit
# 2. Python deps (repo root)
python -m venv .venv && .venv\Scripts\activate # or source .venv/bin/activate
pip install -r requirements.txt
# 3. Apply DB schema
cd fastApi-app
alembic upgrade head
# 4. Run backend + frontend
uvicorn main:app --reload # http://127.0.0.1:8000
cd ../react-front && npm install && npm run dev # http://localhost:5173
Windows: run.bat does all of the above in one shot (Postgres/Mailpit → migrations → both dev
servers, each in its own terminal).
| Service | Port |
|---|---|
| FastAPI | 8000 |
| Vite dev server | 5173 |
| Mailpit (email preview) | 8025 |
| Postgres | 5433 (not 5432 — see fastApi-app/.env.example) |
Copy fastApi-app/.env.example to fastApi-app/.env. Everything has a sane local default; the
knobs that matter most:
| Var | Purpose |
|---|---|
HF_TOKEN | Hugging Face token — required for 3D reconstruction (Hunyuan3D-2.1 Space) |
GEMINI_API_KEY | Key for the inpaint verification pass (restrict it to generativelanguage.googleapis.com) |
INFERENCE_WORKERS | 0 = inline with a process GPU lock, N = N parallel inference workers |
VALIDATE | Gate upload validation (technical + content checks); false to skip |
AUTH_MODE | single_user (default, no login) or jwt (real accounts) |
DATABASE_URL | Defaults to the docker-compose Postgres on localhost:5433 |
avroom/
├── TestModules/ # AI pipeline (avroom_object_removal): depth, segmentation, inpainting, 3D
├── fastApi-app/ # FastAPI backend — API routes, job dispatcher, Postgres models
└── react-front/ # React + TypeScript frontend
168 commits
129 commits
Python
72.4%
TypeScript
23.6%
CSS
3.3%