Inspiration
A friend of ours was taken in high school and was missing for a year. She wasn't found by a search; she was found because her health got so bad she had to be taken to a hospital. Dome is built for that year in between, when every photo a trafficker posts online is a clue to where it was taken, and almost nobody can read those clues fast enough.
The problem is real and growing. Online is now the main front door: in U.S. federal cases, 41% of sex trafficking survivors in 2021 were recruited on social media, and over 80% of 2020 federal sex trafficking prosecutions involved online advertising. Exploitation has also moved from hotels into apartments and short-term rentals. Tools like TraffickCam proved that matching a room photo to a place works, but they only cover hotels, and analysts still geolocate most images by hand, often from a single bedspread or window.
What it does
Dome takes public social media activity and turns it into a ranked, explained list of buildings where a trafficking ring's ad photos were most likely taken. Every result is a lead for a person to verify. Dome never contacts anyone and never acts on its own.
- Spotter scans public accounts for research-backed warning signs (vague, over-paid job or modelling offers, easy-money pitches, the same phone numbers and photos across many accounts, look-alike accounts created in batches, recruiter accounts) and flags an account only when several different signals agree. A human picks where the case starts.
- Linker finds the whole ring around that account. It links two accounts only when they share two different kinds of evidence (for example the same phone and a reworded copy of the same script), so look-alikes stay out. It also follows the money on a public Bitcoin ledger: rings pay ad platforms in crypto, so wallets that pay just minutes before ring accounts post are tied to the ring, then expanded through shared-input clustering into roles (advertiser, collectors, aggregator, cash-out).
- Zoner turns place clues in public posts into a search area, the dome, with its size shown. It's always an area, never an address.
- Lister pulls every CoStar building inside the dome and scores how well each fits the photos.
- Locator matches the ring's photos to real Matterport scans of rooms, pins the building and floor using Vexcel aerial imagery and CoStar unit data, and checks the window view against the Vexcel oblique photo of that side of the building.
- Briefer ranks each building with plain-language reasons and what to verify next. A human approves the report.
On screen, the case flies from a globe to Houston, the dome forms, the view drops onto the building on real aerial imagery, then goes inside the scanned room with the matched spot pinned next to the ad photo.
How we built it
- Agents: a LangChain deepagents supervisor served by the LangGraph server, running on Gemini. The UI starts runs and streams every agent's steps through the LangGraph SDK; two LangGraph interrupts let a human pick the starting account and approve the report. LangSmith traces every step. The supervisor can only run our agents and read files: no tool can write, contact, dispatch or publish.
- Topological core: every agent writes into one shared case complex (TopoNetX): accounts, wallets, photos, rooms and buildings; the evidence they share; events like posting bursts and payment-then-post moments; and the ring itself. Topological neural networks (TopoModelX) score suspicious accounts, rings and wallet roles on it. Rules still make every link and give every reason, and when the model and the rules disagree, the supervisor logs it.
- Linking: MinHash and sentence embeddings for copied and reworded scripts, perceptual hashes for reused photos, inverse-frequency down-weighting, Leiden clustering, and the two-kinds rule.
- Built world data: CoStar's property data indexed in SQLite (including CoStar's own links from properties to Matterport scans), Matterport's GraphQL API for panoramas, floor plans and geocoordinates, and Vexcel's API for footprints, oblique imagery and object detection.
- Vision and geolocation: DINOv2 search plus SIFT/RANSAC point matching to prove a photo shows the same room; panorama headings calibrated with epipolar geometry; a camera model we fitted for Vexcel's oblique photos; the scan's floor-plan outline fitted into Vexcel building footprints; CoStar unit numbers for the floor.
- Scoring: tiers are set by rules first (High needs a strong ring, a room match and a window match), then a score orders leads within a tier:
$$\text{Score} = 100 \cdot R \cdot (0.15\,Z + 0.10\,F + 0.45\,P + 0.30\,W)$$
where $R$ is ring confidence, $Z$ zone fit, $F$ property fit, $P$ photo match and $W$ window match. Code computes every number; the LLM plans, explains and writes the wording.
- Interface: Flask, MapLibre (globe), Cytoscape (link chart) and a 360 view of the matched scan.
Results (synthetic data, public data only)
- Ring A found 12 of 12 accounts with precision 1.00; all 150 planted look-alike accounts stayed unlinked; 3 of 3 recruiter accounts flagged.
- Account level: rules alone find 0.80 (content only), 0.80 (network only) and 0.93 (both) of ring accounts; the topological model finds 1.00.
- [FILL FROM README: Spotter precision@10, wallet attribution precision/recall, photo match P for Building A vs decoy D, final lead tier and score]
- The decoy building next door, where honest hosts reuse listing photos, stayed below the match threshold. [CONFIRM FROM FINAL RUN]
Challenges we ran into
- Matching real interiors: ad-style photos are dark, blurry and taken at odd angles. Similar-looking rooms fool embeddings, so we added geometric point matching to prove it's the same room, and we render test photos only from sweeps held out of the search index, so a match is never the same pixels.
- Indoor GPS is weak: Matterport scans don't reliably know which building or floor they're in. Fitting floor-plan outlines into Vexcel footprints gets the building; courtyard buildings and repeated facades make heading and floor harder, so CoStar's unit numbers anchor the floor.
- Finding money without cheating: we refused to put wallet addresses in the ads. Discovering wallets from payment timing, shared inputs and money shapes is harder, but it's how real investigations work.
- Avoiding false accusations: the two-kinds rule, down-weighting of common signals, planted look-alikes, a decoy building, and human approval at the start and the end all exist to keep Dome from pointing at the wrong place.
- Time: three people, 36 hours, five agents, three sponsor datasets and a topological model.
Accomplishments that we're proud of
- An end-to-end pipeline from public posts to a specific building, where every step can be opened and checked.
- A real use of all three CoStar data layers together, including Matterport's own "better geolocation" open problem.
- A money layer that finds wallets from behaviour, and a topological model of the whole case.
- Guardrails built into the code, not just the slides.
What we learned
- Explainability matters more than accuracy alone: an investigator needs to know why a building is ranked first.
- Topological models are a natural fit for investigations, because the strongest evidence involves many accounts and wallets at once, not just pairs.
- Geometry beats guesswork: point matching and camera models gave us measurable, repeatable answers where a model's opinion wouldn't.
What's next: beyond trafficking
The same two engines work elsewhere:
- Ring linking: rental and listing scams (stolen photos, reused phones, crypto deposits), crypto investment and romance scams, money mule networks, coordinated disinformation campaigns, counterfeit-seller and fake-review rings.
- Photo to place: automatic geolocation of every Matterport scan to its building and floor, listing photo verification, floor-level building information for 911 and fire crews, insurance claims and flood underwriting, view and floor premiums for pricing, and geolocating disaster photos.
Responsible use
All accounts, posts and transactions are synthetic; people never appear (grey silhouettes only). Real buildings are used only as demo locations; no real activity is implied, and no addresses are shown. Dome uses public data only, gives areas rather than addresses, needs a photo match before a building becomes a lead, and never contacts, dispatches or publishes. A person verifies every lead.