2026 · REAL ESTATE INTEL

DealFinder

Pre-MLS lead intelligence for San Diego real-estate wholesaling: fragmented distress signals unified into explainable lead scoring. Full MVP in 7 days; paused unlaunched.

PAUSED
130COMMITS
23PULL REQUESTS
7BUILD DAYS
SOURCE: GITHUB COMMIT HISTORY · 2026-06-12
Build cadence — commits per active day
May 20 Heaviest day: 59 commits · May 22 May 27

Overview

Pre-MLS lead intelligence for San Diego County real-estate wholesaling: tax delinquency, pre-foreclosure, probate, absentee ownership, and code violations aggregated into one operator dashboard with explainable lead scoring — intelligence only, no automated outreach. 130 commits, 26 database migrations, and five external data integrations in 7 days; paused before launch.

Project Design

Planned through the same adversarial-review pipeline as the projects before it — the PRD reached v4 before any code, and the review reshaped the product: the scoring model was swapped for an explainable one, and an entire signal class was removed on fair-housing grounds. When the county-scale tax scraper kept dying as a local script, it moved to a serverless function with cursor checkpoints, circuit breakers, and sanity checks against silent data corruption.

Pre-MLS lead pipeline — Next.js dashboard, Supabase + PostGIS, scheduled ingest
Frontend
Next.js 14 (App Router)React + TypeScriptLeaflet mapZod validation
API / edge
Next.js API routes5 Supabase Edge Functions (Deno)pg_cron scheduled jobs
Data
Postgres + PostGIS (26 migrations)Append-only audit/activity logsPer-user row-level security
External
Tracerfy + ATTOM + Smarty (property/lead data)Google Street View + Claude Vision (experimental scan)

Key modules

Pipeline

Scoring engine

Additive, explainable lead score (0–100) from weighted distress signals with confidence multipliers.

Data

Entity resolution

Deduplicates the same parcel arriving as APN, address variant, or trust/LLC name on bulk ingest.

Pipeline

Ingest pipelines

Five edge workers populate and refresh properties from parcel, tax, and lead sources.

Pipeline

Tax-delinquency scraper

A county-scale scraper on pg_cron with cursor checkpoints and a circuit breaker against corrupt data.

Auth

Compliance & audit

Append-only audit trail, per-user RLS, and DNC screening before any contact export.

UI

Property dashboard

Lead table, signal filters, map view, notes, and an activity timeline for operators.

Key features

County-scale scraping that fails safe

The strongest distress signal — prior-year property-tax delinquency — has no API; it lives behind a county lookup page spanning roughly 566,000 parcels. The first version was a local script that died every time the laptop slept. It moved to a scheduled serverless function that walks parcels by cursor (not offset, so a restart resumes exactly where it stopped), runs every few minutes, and writes results in batches. Two guards keep bad data out: a circuit breaker trips after 50 consecutive failures, and a sanity check halts the run if an implausibly high share of a batch comes back delinquent — the signature of a stale or corrupted source page.

pg_cron tickFetch parcel batch by cursorParse + classify each resultSanity + circuit-breaker checkBatch upsert + rescoreAdvance cursor
Anomalous batch or 50 straight failures → the run halts before corrupt data lands

Security & ops decisions

Fair-housing-gated scoring
Distress signals · 11 sources
Fair-housing gate at design time: the owner-age signal was removed entirely; divorce was demoted to manual per-deal review
Additive scoring with confidence multipliers (High 1.0 / Med 0.75 / Low 0.5), weights locked in migration code
Explainable output: every lead score breaks down to the inputs that produced it

Builder notes

Lessons learned

What carried forward

Compliance shaping scope at design time — a fair-housing review removed an entire signal class before any code existed — and the checkpoint-and-circuit-breaker pattern for fragile, county-scale scrapers.

Posts from this project

Case study in progress.

"A written rule is a suggestion. A gate is a control."
The operating principle behind every project here. The same bug shipped three times past written rules — and zero times past a CI gate. Deterministic enforcement beats advisory documentation, in agent harnesses and security programs alike.