-
-
Measured on live NVIDIA Nemotron: 71 of 72 visible things found, twice in a row; about 5 cents to read 9 photos.
-
The sample family's home, rebuilt from 9 old phone photos: rooms light up as Nemotron finds what's in each one.
-
What the model decided and why: things merged or kept apart, and the parts of the house moved off the contents list.
-
The list for the insurer: every thing in its room, with a box on the photo it was seen in and a price from a store.
-
Same sofa at a birthday and at Christmas: counted once. Nemotron VL compared the two crops; both sightings stay as proof.
-
One click: State Farm's XactContents worksheet or FEMA's contents worksheet, with a store link on every row.
-
Every price shows its store, its link and the words on the page. Used, 'was' or monthly prices are thrown out by code.
Inspiration
After a fire, a flood or an earthquake, the insurance company asks the family for a list of everything they owned: what it was, how old, and what it costs to replace. Most people never made one (59% in an NAIC survey). Six months after the 2025 Los Angeles fires, 57% of the survivors United Policyholders surveyed said their insurer wanted every single item listed and described. People write these lists from memory, in a motel, for weeks, and forget most of what they had.
The home isn't completely gone, though. It's in the birthday photos, the Christmas mornings and the first day of school. Every one of those pictures shows the room behind the people.
What it does
Drop in old photos. Roomprint rebuilds the home room by room and hands back the list the insurer asked for:
- Every thing in every photo. NVIDIA Nemotron 3.5 Super VL looks past the people at the room and lists what's there, each with a box on the photo. That crop, and the date the photo was taken, become the line's evidence.
- Counted once. The same sofa at a birthday and at Christmas is one sofa; the merge is decided by comparing the two crops, and the reason is shown.
- Only contents. Kitchen cabinets, sinks and flooring go to a separate list, because policies pay for those under the building, not the contents.
- A real price, with its source. Each item is priced at today's cost of a new like-kind replacement, found with Tavily at real stores. The line shows the store, the link and the sentence on the page the price came from. If no store price survives the checks, the line says "needs a price". Nothing is guessed.
- Depreciation you can argue with. Actual cash value follows the rules State Farm prints on its own worksheet (effective age by condition, capped at 80%), with useful lives from United Policyholders; the maths is on each line.
- In the insurer's columns. One click exports State Farm's worksheet (which is Xactware's XactContents import template, the system adjusters price in) or FEMA's flood contents worksheet, with a store link per row.
- What no photo shows. Per room, the common things not yet on the list (pots and pans, clothes, tools).
- The California clock. Since 2026, after a declared disaster and a total loss, the insurer must offer 60% of the contents limit with no list. Roomprint shows that number next to what the list adds.
How we built it
Propose, check, or leave it blank: models propose, plain Python checks every proposal, and anything that fails is shown as unresolved, never filled in.
| A model proposes | Code checks |
|---|---|
| an item and its box | box inside the photo and big enough to show; not a person, pet, food, present or decoration; fixtures go to the building list |
| "same object as in that photo" | only asked for plausible pairs (same room and kind, no clashing brand, never two sightings from one photo); merged only on a confident yes |
| a price | the amount is in a sentence Tavily returned, next to the item's name; not used, refurbished, "was", "starting at" or per month; a "set of 4" becomes a unit price; second-hand marketplaces don't count; two or more stores → median, one → flagged |
| an age | taken from the photo's own date, not from the model |
| the export | totals recomputed; every line keeps its photo and its store link |
Models (NVIDIA Nemotron on Nebius Token Factory): Nemotron 3.5 Super VL (reasoning off) reads each photo and returns items with boxes in about 7–20 seconds, and compares two crops side by side for duplicates. Nemotron 3 Super reads the shop sentences and picks the fair like-kind prices. Reading nine photos and pricing the list costs about five cents in model calls; a daily cap stops calls before they happen.
Tavily does the outward-looking half: one basic search per item, and an advanced search (more of each page) when the basic one returns fewer than six priced sentences. Results are cached, so the same "65-inch TV" isn't searched twice.
Stack: Python 3.12, FastAPI, Pillow, plain JSON; front end in plain HTML/CSS/JS. Deployed with Docker on Render.
Measured
| What | Result |
|---|---|
| Things a person can clearly see in the 9 sample photos (hand-made list of 72), found by Nemotron VL | 71 / 72, in each of 2 runs |
| Room recognised | 9 / 9 |
| People, food or decorations put on the list | 0 |
| Sample family, full run | 109 things; 69 priced at real stores (19 by two or more stores, 50 by one store and flagged), 40 left "needs a price" (35 with no surviving price, 5 where stores disagreed too much) |
| Cost of the full sample run | 132 Nemotron calls, $0.05; 189 Tavily credits |
| One new photo, live | about 35–60 seconds end to end |
Challenges we ran into
- Store pages hide prices. Extracting a retailer's product page usually returns everything except the price, which is drawn by JavaScript. What works is reading the price sentences search results already carry, and then being strict about which sentences count.
- Prices lie in many ways. "Was $439.99", "starting at $395", "$37.50/mo", "Restored Dyson V8 $179.99", "set of 4 chairs $599". Each one would have put a wrong number on someone's claim; each is now a check with a test.
- The same photo, different objects. Our generated sample photos don't always agree with each other (one shows a side-by-side fridge, the other a French-door one), and the duplicate check rightly kept them apart. We left it that way rather than force a merge.
- Our own mistake. While tuning prices we used up a month of search credits in a day. We now check the remaining credits before any batch run, cache every search, and count credits per run.
Accomplishments we're proud of
- Every line on the list can be checked by a stranger in ten seconds: the photo it came from, the store, the words.
- The model is never the last word on a number.
What we learned
Vision models are already good enough to find things in ordinary family photos, boxes included. The hard part of an insurance list isn't seeing the TV; it's the price, the age and the proof, and those are better left to code that can show its working.
What's next
Video walkthroughs (a phone pan through a room), receipts and order-history emails as a second source of evidence, and a reviewer mode for public adjusters and nonprofits who help survivors with claims.
Try it
Open the live demo and press Rebuild a sample home: click any room in the house, then any line to see the photo it came from, the stores and the maths. Or press Try your own photos and add one or two photos of a room: about a minute later you get your own list, priced.
Live demo: https://roomprint.onrender.com · Code: https://github.com/mini4ai4/roomprint
Built With
- docker
- fastapi
- javascript
- nebius-token-factory
- nvidia-nemotron
- pillow
- python
- render
- tavily
Log in or sign up for Devpost to join the conversation.