№ 530306August 2026 · Manhattan, NY
myNewHome
A daily apartment scrape for my girlfriend and me.Problem
nYc apartments are incredibly competitive. Winning and losing comes down usually to visibility: refreshing several listing sites every day, spotting the same unit under different neighbourhood names, and losing track of which ones we had already talked about.
Solution
Every morning it scans the web for new listings. Keeping only the ones that fit our search, the system texts me the new ones every day. The shared page lets my gf and me both star units, leave notes, see them on a map, and compare prices over time.
Tracking amenities, building health, and other post details
Each unit is labelled with the amenities we care about and checked against city records, then either of us can star it and leave a note.
Amenity flags are regex matches over listing text, with guards: laundry-in-building does not count as in-unit unless the text also says in-unit, and a unit with no text keeps null flags, shown as unknown, not a guess. Sauna also counts when the unit is a short haversine walk from a gym chain that has one. For every tracked building, three city open-data datasets are queried for open housing violations, bedbug reports and 311 complaints, cached per building and refreshed weekly. The Best tab ranks on those signals and is deliberately price-blind. The FastAPI and Jinja UI on Vercel sits behind a secret-token URL; a cookie records which of us holds this phone, so stars and notes are per person.
A polygon instead of neighbourhood names
Whether a listing is in our area is decided by where it sits on the map, not by what a site chooses to call the block.
Listing sites disagree on what to call the same block, so the target area is two hand-drawn lat/lng polygons, and membership is a Shapely point-in-polygon test. Coordinates come from the source when present, otherwise from a per-building geocode cache, falling back to Nominatim at one request per second, so a building is geocoded at most once. Citywide feeds are filtered strictly: out-of-polygon rows are dropped silently and ungeocodable ones logged as a failed run. Alert emails from listing sites already constrained the area upstream, so a miss there is more likely our own geocoding error; those listings are kept but flagged location-unverified, and the flag clears if a strict source later confirms the same unit.


