← alexwang.tech

Deadbolt

Are the photos actually from the city they claim?

Facebook housing groups are full of rental scams. Someone grabs photos from a real listing in one city, reposts them as a sublease in another, and asks for a Zelle deposit before you can tour. Deadbolt is a Chrome extension that checks the photos against the claimed location and gives you a risk score with evidence you can go verify yourself.

Built at HackMIT 2026 with Valerie Eng. Source on GitHub.

Why not just reverse image search it

That's the advice everyone gives, and we started by building exactly that. Two problems. Nobody actually does it, and more importantly it answers the wrong question. Reverse image search tells you where else a photo has appeared. It doesn't tell you whether the apartment is in the city the post claims. A photo can be completely original and still not be the place you're being offered.

So Deadbolt asks the other question. Given these photos and this claimed address, is the construction in frame plausible for that place?

Try it

Click a post.

Daniel Whitfield
3 hrs · Boston / Cambridge Housing
SUBLET - ALLSTON, MA (Pratt St, off Comm Ave) Third floor of a triple decker, fully furnished 1BR, available now through Aug 31. $1,150/month, ALL utilities included, in-unit W/D, 10 min walk to BU. I'm currently working abroad in London so I can't do in-person showings. To hold the unit I just need first month + $800 deposit via Zelle, and I'll FedEx the lease and keys same day. Moving fast, had 3 people ask today. Message me directly, I don't check comments.
24 reactions · 11 comments
Priya Raghunathan
5 hrs · Boston / Cambridge Housing
Subletting my room in a 3BR near Central Sq, Cambridge from June 1 through August. $1,450/mo + utilities, own bathroom, two grad-student roommates, both pretty quiet. Building's only a few years old so there's in-unit laundry and central air. Happy to show it in person any evening this week, just DM me. Photos are the ones management gave us when we moved in.
7 reactions · 3 comments
Pick a post on the left.

Both reports above are real output, saved from live runs against the OpenAI API. This page is static so there's no key sitting on a public server, which means it replays saved results instead of analyzing new photos. Clone the repo and you can point it at any listing you want.

What it looks at

location plausibilityBuilding stock, heating type, window systems, and whatever is visible out the windows, against the claimed city. The post above claims a third-floor triple decker in Allston. The photos show floor-to-ceiling aluminum glazing and central forced-air ceiling registers. Triple deckers are 1900s wood frame with double-hung sash and steam radiators.
unit coherenceClusters photos by flooring, cabinetry and window system. Four photos of three apartments isn't a listing of the one you'd rent.
photo styleAgency real estate photography turning up on a person-to-person sublet.
text patternsPoster abroad, Zelle before viewing, keys by mail, urgency, rent under market. Every flag quotes the post.
EXIFGPS, camera, editing software. Runs locally, no API call.
perceptual hashThe same photo recropped to pad out a thin set.

How it's put together

browser tab
  content.js      point at a post, walk up the DOM to the smallest
                  container with images + text, grab that subtree
                  bytes via fetch -> service worker -> canvas
        |
        v
localhost:3000
  imaging.js      EXIF + 64-bit dhash + 1024px downscale   (local, no network)
  vision.js       one json_schema request  -----------------> OpenAI API
  analyze.js      weighted score, sorted findings
  cache/          keyed on image hash + normalized text
        |
        v
  render.js       shadow-dom panel

Post selection doesn't use selectors. We pulled up a real saved Facebook group feed and role="article" appeared exactly once in the whole page, so matching on markup was out. You point at a post instead, which has the side effect of working on Craigslist and Zillow too.

The model never returns a verdict. It returns evidence, and the scoring happens in our code with weights we set. EXIF and the hash don't touch a model at all, so a report is never empty even if the API is down.

Limits

This reports evidence, not proof. A high score means go see the place in person and don't wire anyone money. It is not an accusation against a specific person, and the tool is deliberately weighted to clear honest posts as readily as it flags bad ones. The clean listing above scores 12 with zero fraud flags.

Location checking is about plausibility, not identity. "Could this be Allston?" is answerable from an interior photo. "Where is this?" usually isn't, and a tool that guessed at it would be confidently wrong a lot.

github.com/AlexWang05/deadbolt