Unit Ready · prototype · built 15–16 Oct 2026

Is the unit ready for the next guest? Ask the walkthrough.

A cleaner films the room or snaps photos. Unit Ready samples the frames, asks Gemini one strict question per room against the host's own reference photos, and lets plain code decide PASS, FAIL or REVIEW. Every verdict points at the frame it came from.

What it is

Short-term rental hosts set a standard for each room: bed made, towels out, bin empty, toilet paper stocked. Confirming that standard before check-in means someone walks the unit or trusts the cleaner's word. Unit Ready turns a phone walkthrough into a checklist verdict with evidence, and routes everything it is not sure about to a person instead of guessing.

It is a working prototype, not a product: one command line, one JSON checklist, two HTML pages, and an evaluation harness so a change to the prompt, model or thresholds can be measured rather than eyeballed.

How it works

Frames code

Sample the video at 1 fps or read the photo folders. Drop blurry frames (Laplacian variance). Collapse near-duplicates (perceptual hash). The model only sees sharp, distinct frames. On the demo unit: 11 frames in, 5 kept.

Inspect the only model step

One Gemini 2.5 Flash call per room: reference photos, kept frames, checklist items. The answer must fit a fixed JSON schema (present / missing / unclear, confidence, evidence frame, one-line note). Schema failure is retried once with the error, then falls back to "unclear" so the unit goes to review rather than passing.

Decide code

Unclear or low confidence → REVIEW. A confident "missing" on a hard-stop item (bed, towels, toilet paper) → FAIL. A confident "missing" elsewhere → FIX, cleaner goes back. The model advises; the rules decide, and the rules are in a file the host can read.

Report code

One self-contained HTML page per unit: the verdict, a review queue worst-first, every item with its confidence and the frame the model pointed at, and the frames that were dropped and why.

Evaluate code

24 labelled frames covering every item in both states, including deliberate hard cases. Reports catch rate and false-alarm rate per item, abstains, latency and cost. Misses and false alarms are separated because they cost different people different things.

The demo unit FAIL

A stitched bedroom walkthrough (three staged frames with a slow pan and motion-blurred swings between them) plus two bathroom photos. The review queue it produced:

Open the full report →

What the evaluation says

96%accuracy on 89 decided checks
0misses (problem called ready)
4false alarms
7sent to review
73.87sp95 latency per frame
$0.041list price per unit (12 frames)
ItemChecksCatch rateFalse-alarm rateAbstain
bed_made16100%0%0
towels_present24100%0%0
bin_empty24100%12%7
surfaces_clear24100%19%0
toilet_paper8100%0%0

Where it was wrong on this run:

Open the full evaluation with every frame →

Use it

uv sync                                   # Python 3.12 + deps
echo GOOGLE_API_KEY=... > .env            # Gemini key, free tier works

uv run unit-ready frames units/demo-unit  # what the model would see, no model call
uv run unit-ready check  units/demo-unit  # -> out/demo-unit/report.html
uv run unit-ready eval   eval             # -> out/eval/eval.html
uv run unit-ready render out/demo-unit    # rebuild HTML from saved JSON

A unit is a folder: standard/<room>/ with 3–5 reference photos, then walkthrough.<room>.mp4 and/or photos/<room>/. Rooms, items, hard stops and thresholds all live in checklist.json; add an item there and nothing else changes.

Honest limits