Apartment Finder
A private apartment search for one group of roommates hunting in San Francisco. It crawls the rental sites every night, scores every listing for scam risk with reasons you can read, and lets you ask Claude about the whole inventory in plain English.
Five people looking for a place together generate a lot of links in a group chat and very little shared memory. This replaces the group chat. One inventory, one shortlist, one set of house rules, and one place to ask "which three-bedrooms under $7k have two baths and aren't in a neighborhood we've already ruled out?" and get an answer that only cites listings that actually exist.
It is deliberately not public. The user base is an allowlist of five email addresses; the first sign-in is a link sent to that address, and after that a password. There is no sign-up, no forgotten-password flow that emails a stranger, and the login page does nothing for anyone who isn't on the list. The source is on GitHub; the running app is ours.
What it does
- Nightly crawl into SQLite: Redfin, ApartmentList, Zumper and Rent.com are pulled at 03:00 into a database on the VPS, deduplicated conservatively by address and bed count, with the other sites' copies linked from the surviving card. Craigslist and Zillow block the server, so they stay off rather than being worked around.
- Scam signals you can audit: photo count, address shape, the same address reposted cheaper, the same lead photo under two addresses, rent far below the neighborhood median, opt-out contact mailboxes. Every card shows the checks it passed, not just a number, because a score nobody can explain is a score nobody should act on.
- Honest neighborhood context: DataSF police incidents as a rate per 100,000 residents against 2020 census block population, nearest BART / Muni / Caltrain stop as a straight-line distance, SFMTA metered parking within 250 m. No invented safety grade and no invented commute minutes; commute is a Google Maps link with the work address and leave time prefilled.
- Claude over the inventory: natural-language questions are answered by Claude reading the stored listings through a fixed set of tools, so it ranks and filters real rows and says so when a constraint (pet policy, say) isn't something any source publishes.
- Shared by the house: saved listings with notes and tour times (with overlap warnings), standing rules like neighborhoods the group has ruled out, named share groups, and a listing drops out of the feed once three roommates thumbs-down it.
What it's made of
React · TypeScript · Vite · Tailwind · Leaflet on the front; Express · SQLite (better-sqlite3) · Node 22 on the back; Claude Code (claude -p) for the assistant. One process on a VPS behind HTTPS, nightly crawl in-process, secrets in the environment and never in the repo. Listing text is treated as hostile input end to end.