Spencer Darr.
← All work
Role — Solo build · Product + Engineering Where — On my own time Type — Decision system

A scouting report for every Brooklyn listing.

Ask anyone: finding an apartment in New York is a full-time job. I don't have full-time hours. I'm working a full-time job, prepping a cross-country move and playing in a band, while my partner is the one in Brooklyn actually going on tours. So I treated the search like any other operations problem: map the process, find the part that repeats, and build a system that does it. The result screens every listing against city records, grades the neighborhood with a scoring model of our own, and tracks the keepers like a sales pipeline. What took us fifteen-plus minutes a listing now takes three.

15 → 3 minto make the call on a listing

No sign-in. Every listing in the demo is invented.

01The constraint

The hard part wasn't finding listings. It was evaluating them. Listing photos never show what actually ruins an apartment: a building with an open bed-bug history, a bedroom that faces the Brooklyn-Queens Expressway, a "short walk" to the train that's really fourteen minutes. Most of that is knowable, since it sits in New York City's open data, but checking it meant the same routine on every listing: rats and roaches, what tenants report, distance to the BQE, the block itself, the subway walk. A stack of browser tabs, every time.

That's fifteen-plus minutes per apartment, in a market where good places go in a day or two, split between two people in two states. My partner was on the ground doing the tours; I was halfway across the country with an hour here and there. I needed a way to do real work on the search from a distance, and for both of us to see the same picture.

Beforeby hand
Rats & pests Tenant reports BQE The block Subway walk Gut
AfterScout
One card
0481216 min

Before: rats & pests · tenant reports · BQE · the block · subway walk · gut call

Fifteen minutes a listing became three. Across a week, that's hours of research cut to a few minutes a day, so our time goes to what matters: contacting agents and building relationships for the places we want.

02The system

So instead of grinding through it, I looked at how the work actually happened. It splits cleanly in two. The repeatable part (screening, scoring, sorting) can run without either of us. The judgment calls (is this worth a tour? did it feel right in person?) need a human, and need to be shared. Scout automates the first part and makes the second part fast.

COLLECT
Listing-alert emails, a broker-site scrape, the Chrome extension, or a pasted link. Duplicates merged.
SCREEN
Every address checked against city records: pests, violations, bed bugs, building data, BQE, subway.
SCORE
1.00–10.00 on our own priorities, plus a neighborhood grade. Hard fails sink.
DECIDE
One card: score, block grade, red flags, walk times. Pass or pursue.
TRACK
The keepers move through a shared pipeline, from interested to applied.

Twice a day a scheduled scan pulls in new listings and runs every check we used to run by hand:

All of it lands on one card per apartment. That card is the whole decision surface: if something doesn't help us say yes or no, it isn't on there.

From the live demoFig. 01
One listing card: a green 8.65 score ring, a B+ block-grade sign, rent, building tags, walking times to three subway stations, and one flagged note about rats seen outside that passed re-inspection.
The card. Score ring, block grade, flags and walk times: everything we used to dig out by hand, in one place.
See it for yourself: browse invented listings, open a card, move one through the pipeline.Try the demo →

03Our own neighborhood grade

Off-the-shelf walkability scores answer a generic question. Ours was narrower: is this block as good as the blocks we're competing for? So Scout grades every address on nine factors, each built from public data: subway access, safety (NYPD complaint reports nearby), groceries (licensed food stores within a 10-minute walk), restaurants, quiet (311 noise complaints), parks, nightlife, biking (Citi Bike docks and protected lanes) and culture.

How much each factor counts. The grade sits next to the score; it doesn't feed into it.

The interesting part is the curve. Each factor becomes a percentile against a reference sample of about 180 random apartment buildings. The first version sampled all of Brooklyn, and everything we looked at came out an A. Re-sampling only the 13 zip codes renters actually fight over made the letters mean something. Now an A+ is the top 3% of sought-after Brooklyn, and a genuinely nice block usually lands in the B's. A grade that flatters everything is useless as a filter.

From the live demoFig. 02
The neighborhood grade panel for a sample listing: a B+ street-sign badge, “Top 18% of blocks in sought-after Brooklyn,” and a bar per factor (subway 89, safety 48, groceries 78, restaurants 2, quiet 56, parks 78, nightlife 75, biking 96, culture 5).
A B+ block, factor by factor. Each bar is the share of sought-after Brooklyn blocks this one beats.

04The Chrome extension

Listings leave out exactly the things we care about most: whether pets are allowed, in-unit laundry, a second workspace, closets, outdoor space, a broker fee. Typing those in by hand would have rebuilt the problem I was trying to remove. So I built a Chrome extension that reads the listing page you're already on and sends those details to Scout, quoting the listing's own wording next to each value so you can check it.

It pairs with a step-through queue in the app. Scout lines up the best-scoring listings that are missing a detail; one click opens the listing, the extension reads it, and saving rescores the listing on the spot. Two rules keep it honest: it only acts when you click, or on a page opened from Scout (it never crawls), and a value someone entered by hand always beats what the extension read.

The real popupFig. 03
The Apartment Scout Chrome extension popup: “Sent 6 details to Scout. Confirm them there.” with pets allowed, in-unit laundry, a flex workspace, large closets, a small balcony and no broker fee, each with the listing's own wording quoted underneath.
One click on a listing page sends six details to Scout, each next to the listing's own wording. (Sample values.)
From the live demoFig. 04
The step-through dialog: listing 1 of 28 that needs details, asking whether the apartment has laundry, with Pass, Skip, and Save & next buttons.
The step-through. One missing detail at a time; Save & next rescores the listing on the spot.

05A pipeline for a two-city search

Finding a good listing is half the job. Once tours, broker emails and applications start stacking up, things slip: who called back, which one she saw Thursday, whether we applied. That's a sales pipeline, and I've run plenty of those, so I built one. It's what makes the division of labor work: I screen, sort and queue from Colorado; she tours the shortlist and logs what she saw; we both see every stage change live.

Unreviewed→ Interested→ Contacted→ Tour booked→ Toured→ Applied ↘ Passed

Rented or off-market listings drop out on their own, and come back if they're relisted.

From the live demoFig. 05
Pipeline tabs with counts: To review & in play, Needs details, Unreviewed, In play, Interested, Contacted, Tour booked, Toured, Applied, Passed. Below them, verdict tiles: 9 clear, 14 check, 5 caution, 7 fail.
The board. Pipeline stages along the top, screening verdicts below.

New matches arrive by email and phone push (pushes never include an address). "Did we ever hear back from that broker?" is now a glance, not a text thread.

06Our priorities, as numbers

The score isn't a black box. It's our household's actual tradeoffs, written down. Building health outweighs everything. A large outdoor space is worth about two-thirds of a second bedroom, because it doubles as a workspace and a patch of turf for the dog. In-unit laundry is worth roughly $250 a month to us, and laundry in the building about half that.

How much each part of the score counts. A building with an active infestation lands at the bottom no matter what else it has, and an unresolved red flag caps the score at 7.

From the live demoFig. 06
An opened listing card. Left: a bar per scoring factor (building health 9.2, most others 10, laundry, closets and outdoor space at 5 because they are unknown) and city records showing zero indoor rodent violations, a passed outdoor inspection, and zero roach violations. Right: listing details and the nearest groceries, Citi Bike dock, bike lane, parks, restaurants and bars.
Open any card and the score explains itself. Details we don't know yet sit at 5.0, mid-scale (more on why below).

One early lesson changed the whole feel of it. At first, an unknown detail scored as the worst possible value, so confirming that an apartment didn't have a workspace didn't move anything. Moving unknowns to the middle of the scale meant every confirmed detail pushes the score the right way, up or down. Small rule, big difference in whether you trust the number.

07Calls worth talking about

One rule set, two copies, proven identical. The scorer lives in TypeScript, and the scan keeps a Python copy so it can still score if the scorer is down. A test fuzzes 20,000 random listings through both and must find zero differences before anything deploys. Getting to zero meant matching Python's rounding and summation quirks down to the last decimal.

Distrust the data where it's wrong. One fourteen-story building showed up as "low-rise" because the city's property records still listed the lot as vacant. Missing or vacant-lot records now say "Unknown" with a note, instead of a confident guess.

Respect the sources. The big listing site is never scraped. Its listings come in through its own alert emails, or get read from a page I already have open.

Shared, but private. Households can share listings, but each one's statuses, notes and details stay its own. Another household's entry shows up as a suggestion to accept, never a silent overwrite.

08The look

If I'm opening this thing every morning, it should be fun. So it's dressed as a Brooklyn block party: Knicks blue and orange on a sun-baked brownstone ground, jersey-trim stripes, sticker-style cards, a big score ring and a street-sign "BLOCK" grade. It's a heavy nod to Do the Right Thing, Spike Lee's five-star masterpiece and the hottest day ever put on film in Brooklyn.

From the live demoFig. 07
The Apartment Scout header: a Knicks-blue banner with the title in orange-shadowed block letters and an orange jersey-trim stripe along the bottom.
The masthead, jersey trim and all.
Knicks blue#0060AE
Knicks orange#F58426
Brownstone#FFF4E2
Block ink#1A1530

Bungee for display, Figtree for reading. A completely different system from this site — on purpose.

09Results

We've used it every day since the first version. Making the call on a listing went from fifteen-plus minutes to three or less, and the 66 real listings it screened in that first week would have been roughly sixteen hours of tab-juggling at the old pace. Hours neither of us had. Now that time goes where it counts: contacting agents and building relationships for the places we actually want. And we stopped skipping the homework. Every listing gets the full check now, including the ones we'd have dismissed, or fallen for, on photos alone. And I get to pull my weight in a search happening halfway across the country.

Per listing
~3 min
Down from 15+ by hand
Week one
66
Real listings screened & scored
Every release
20,000
Test listings checked, zero mismatches
Build
~1 wk
From idea to a live beta

10How it was built

About a week, start to live, pair-programming with Claude. I set the product direction, the priorities and every scoring value, used it daily on our real search, and fed what I found back into the next iteration. Claude wrote most of the code and tests to that direction. It started as a scheduled scan feeding a simple dashboard and, inside eight days, became a real stack: a Python scan on scheduled GitHub Actions, a Postgres database with per-household privacy rules, a shared scoring service, a one-page web app on Cloudflare, and the Chrome extension. Roughly 5,500 lines across Python, TypeScript, JavaScript and SQL, all on free, public data.

What's next: a settings page so each household can tune its own rules (today they live in the database), reading floor plans automatically, more broker sites for the extension, and opening the beta up beyond friends.

11Why it's here

Because it's how I work, start to finish. I hit a constraint (no full-time hours for a full-time search), mapped the process instead of grinding through it, and split it into the part a system should own and the part people should. Then I built the system and made it trustworthy: our real priorities as explicit numbers, a neighborhood grade calibrated against the actual competition, data problems handled in the open, a test that proves the scorer agrees with itself, and a shared pipeline so a two-city team never loses the thread. Same instincts I bring to B2B SaaS. This time the customers were two people and a dog.

Kick the tires. The demo runs the real app on invented listings, with no sign-in.Open the live demo →