Map Guide
PIN COLORS (Return on Cost)
0–15% ROC
15–30% ROC
30–50% ROC
50–100% ROC
100%+ ROC (burn-lot territory)
Ghost pin — negative ROC at asking price
DEAL STATUS DOTS
Screening
Analyzing
LOI Submitted
Under Contract
Closed
Passed
OTHER MARKERS
Pulsing pin = listed within 7 days
Switch to the Assumptions tab above to tune the SFR pro forma — every parcel reprices live as you drag. The map opens on viable deals only (ROC ≥ 0% at asking price); use the ROC filter to widen.
SFR Acquisition — Strategy
We identify single-family-zoned LA County parcels — teardown or vacant — where the spread between land cost and a new-construction $/SF exit is large enough to pencil. We acquire, build one modern modular SFR per lot, and sell it. Baseline economics: $500/SF all-in ($425 hard + $75 soft, configurable) against a $1,000/SF+ target exit. Build-to-sell only. One home per lot for v1.
Market
This app covers LA County only (City + all incorporated cities). All listings, comps, and zoning data are LA-specific. Vacant Land + Single Family Residential are both admitted to the acquisition layer; vacant lots are the preferred build-to-sell target and run the pro forma off defaultHomeSf with demoCost = 0.
VHFHSZ: Very High Fire Hazard Severity Zone is an informational flag only in the SFR app, NOT a knockout. The Jan-2025 Palisades burn footprint is a priority target — post-fire vacant lots are surfaced via the burn-zone overlay (toggle in the filter bar) and the 🔥 badge on deal cards. Insurance + WUI code surcharge belong in the per-deal pro forma, not the eligibility gate.
Zoning coverage: 4-endpoint cascade (City of LA / Santa Monica / Malibu / LA County DRP) confirms zone for ~80% of slice parcels. Parcels in uncovered cities (Beverly Hills, WeHo, Culver City, Inglewood, Pasadena, Glendale, Burbank, Long Beach) fall back to the Redfin property-type mapping with a zoningUnconfirmed flag on the card.
Pro Forma Model
Every parcel runs through the SFR pro forma (see src/models/proforma.js):
Sell value = homeSf × exitPsf. sellingCosts = sellValue × sellingCostPct (default 4%).
Build cost = (hardPsf + softPsf + siteWorkPsf) × homeSf + demoCost. Defaults: $425 hard + $75 soft, $0 site / demo per Appendix C.
Financing cost = loanAmount × (rate÷12) × holdMonths × drawFactor. loanAmount = LTC × (land + build); default LTC 70%, rate 10%, hold 14 mo, drawFactor 0.60.
Total cost = landCost + buildCost + financingCost. Gross profit = sellValue − totalCost − sellingCosts.
Returns: ROC = profit ÷ totalCost. ROS = profit ÷ sellValue. ROE = profit ÷ equityNeeded (where equityNeeded = totalCost − loanAmount).
Two Land Solvers
The acquisition decision always turns on “max land price.” The model exposes both forms:
(a) Simple — target gross return on net sales (LP-facing, transparent, default heatmap metric):
maxLand = netSales − buildCost − financingCost − (netSales × targetGrossReturnPct)
Default target 20%. landPctOfValue = maxLand ÷ sellValue is the gut-check ratio (Palisades-class baseline ~25.8%).
(b) Residual — target return on cost, time-aware:
maxLand = ((sellValue − sellingCosts) − allInBuildPsf×homeSf×(1 + roc×holdMonths÷12)) / (1 + roc×holdMonths÷12)
Default target ROC 25% annualized. Plug the residual maxLand back as landCost and the deal yields exactly the target ROC.
Deal signal = maxLand vs. asking. The gap is the opportunity.
Capital Stack & Fund Fees
Debt: loanAmount sized from LTC; default 70% (range 65–80). Rate 10% (range 10–11). Origination fee 1.25%.
Equity: equityNeeded = totalCost − loanAmount. Split GP coinvest (default 0%) vs. LP.
Land draw: landDraw = max(landCost − lpEquity, 0) — portion of land returned as a draw.
Fees: Acquisition 2% of land. Construction Mgmt 5% of build. Disposition 1% of sell value.
Waterfall (§6.5 simple form)
Net distributable = netSales − loanRepayment. Distributions in order:
1. Return of LP capital — pay LP equity back first, then GP coinvest.
2. 7% LP priority return on LP capital, time-prorated by hold months.
3. Developer fees — acq + constr mgmt + disposition.
4. Remaining profit split 50/50 LP / GP (configurable via gpProfitSplitPct).
Invariant: distributions sum to net distributable (residual ≈ 0). The fuller ROC-deficit promote tier (First/Second/Third) is a future seam in computeWaterfall.
Map Tools
Draw polygon — click the pencil icon to draw a custom boundary. Only listings inside the polygon are shown. Click × to clear.
Favorites — star a deal in the deal card to save it. Toggle “Favorites only” in the filter bar to isolate saved deals. Persists across sessions.
Deal status — use the dropdown in the deal card header to track workflow (Screening → Analyzing → LOI → Under Contract → Closed / Passed). Status dots appear on pins.
URL sharing — all active filters encode into the URL hash. Copy the URL to share a filtered view.
Layer Toggles
On-Market — active listings colored by Return on Cost
Sale $/SF — sold comp dots + neighborhood grid (median exit $/SF per 0.01° cell)
Fire / Flood / Quake — hazard overlay layers from state GIS data
🏛 Historic — Toggles HPOZ (purple shaded areas) and HCM (purple dots) overlays across the full map. Historic designations are hard exclusions for build-to-sell SFR (demo + new construction is precluded). Any listing within an HPOZ or HCM boundary is flagged ‘🏛 Historic — UNQUAL’ and removed from the viable deal pool.
Deal Card (P3 layout)
Header — address, zone pill (R1 / LAND), Vacant or Teardown · N home badge, and a comp-confidence badge (High / Moderate / Low · N comps). Edit lives at the right.
Four hero metrics — Asking · Exit $/SF · Land basis $/SF · Profit (Profit tile is green). Land basis replaced the old Spread tile; per-SF reads from the same single-source proforma as everything else.
Deal-math equation — one monospace line:
Land $X + Build $Y ($/SF × home SF) + Carry $Z = $T all-in → Sell $S → Profit $P · ROC% · margin%. Drives the whole thesis at a glance.
Dims row — mini lot-shape glyph (proportional to W:D), W′ × D′ · lot SF · slope%, and an inline editable Home SF knob. Type a number, the pro forma + equation + waterfall live-reflow for that parcel.
▸ Full underwriting — collapsed by default. Expands into two columns: Land Solve (asking, max land @ target gross, max land @ target ROC, headroom gross/ROC, land/value) on the left; Cost & returns (hard/soft/site $/SF, demo, build $/SF loaded, financing, all-in $/SF, margin, ROC, ROE) + Waterfall on the right.
Footer — Sale comps · Maps · Redfin · Zillow · ★ Save · ✕ Unqual. The card body no longer embeds a comp table; click Sale comps to open the full radius-search panel (sortable, CSV export).
Address Search
Address search — type any California address to jump to it. If it matches an active listing, the deal card opens.
No match — the map pans to the geocoded point and a brief popup confirms the address is not in the current on-market set.
Edit Mode
Enter / Exit — click “✎ Edit” in the deal card header. “✓ Done” saves overrides to localStorage. “↺ Reset” clears all overrides. Press Escape to revert to pre-session values.
Editable fields — Asking Price and Exit $/SF in the hero tiles, plus Hard $/SF and Soft $/SF inside the Full Underwriting panel. Home SF is always editable inline on the dims row (no edit-mode required) and overrides the global Home Size slider for that one parcel.
Live recalc — every keystroke (debounced 150ms) re-runs the full pro forma. Hero tiles, the deal-math equation, Land Solve, Cost & Returns, and Waterfall all repaint in real time from the same single-source proforma.
Persistence — overrides saved per-AIN in localStorage (sfr_overrides_<AIN>). An “Edited” badge appears on cards with saved overrides. Internally they write _overrideHardPsf / _overrideSoftPsf — the same keys resolveDealInputs consumes, so card edits actually apply.
Bulk CSV export — the “Export” button in the sidebar generates a CSV of all visible listings. When overrides are active, exports use the override values.
Comp hiding — complementary to edit mode. The Hide toggle filters the Sale Comps panel for inspection only; exit $/SF stays at the pipeline value. To override exit $/SF, use the hero tile in edit mode.
Filters
Page-load defaults: ROC ≥ 0%, Lot Width ≥ 50 ft, Exit $/SF ≥ $1200, Slope ≤ 20%, Asking ≤ $2M, Land Basis ≤ $500/SF, Zoning = R1 + LAND.
ROC — range slider + preset chips (50%/30%/0%). Gross profit ÷ total cost at asking price. Drives pin color and is the SFR deal signal. Defaults to ≥ 0% (viable deals only).
Lot Width — defaults to ≥ 40 ft (typical detached-SFR minimum). Parcels with no width data pass through.
Acquisition price ≤ / Exit $/SF ≥ — bound the asking-price and comp-derived exit ranges. Exit $/SF defaults to ≥ $975 (the lower bound of the new-build $1,000/SF+ market thesis).
Land basis $/SF ≤ / Slope ≤ — defaults to ≤ $1000/SF and ≤ 20% slope. USGS 1m LiDAR grades are stamped on every parcel via fetch_slopes.py; drag the slider to widen. Lots with slope ≥15% show a cost-uplift warning.
Zoning — defaults to R1 + LAND (single-family build-to-sell only). R2/R3/R4/MU off by default.
Burn-zone parcels only — OFF by default. When ON, restricts the view to parcels inside the Palisades fire perimeter. Burn-zone parcels are never auto-hidden — they are TARGETS for build-to-sell SFR.
VHFHSZ, Burn-Zone & Coastal Zone (Phase 2c)
VHFHSZ is a FLAG, not a filter. Stamped via local PIP against CAL FIRE GeoJSON. Surfaced on the card as ⚠ VHFHSZ flag; never drops a parcel.
Burn-zone = l.burnZone = "Palisades". Displayed as 🔥 BURN-ZONE TARGET. Surfaced, never suppressed.
Coastal Zone = l.coastal = true for parcels inside the CA Coastal Commission boundary. Displayed as 🌊 Coastal Zone — CDP required on the deal card. Informational only — never excludes. The Coastal Development Permit (CDP) adds 3–6+ months to entitlement. Toggle the coastal zone overlay in the filter panel to visualize the CCC boundary on the map.
Home SF per parcel — the inline Home SF knob on the deal card’s dims row is always editable (no edit-mode required). Typing a number sets l._overrideHomeSf for that parcel, immediately re-runs the pro forma, and live-reflows the hero tiles, deal-math equation, Land Solve, and Waterfall. Overrides the global Home Size slider for that one deal.
Comp Confidence (Phase 2c)
The confidence badge in the deal card header (High / Moderate / Low · N comps) reflects how reliable the cluster-derived Exit $/SF is: High = ≥10 comps within 0.5 mi; Moderate = ≥5 comps within 1.5 mi; Low = <5 comps OR radius >1.5 mi. Confidence is purely informational — it never changes the exit value or the ranking.
When confidence is Low, the badge turns red. No pin color or rank change occurs. Use it to flag deals for deeper comp research before LOI.
Visual Encoding
Pin size — larger pins = bigger lots (≥15K SF = large, ≥10K SF = medium, <10K SF = small)
Land basis $/SF — green < $120, yellow $120–$160, red > $160
Lot efficiency — buildable SF ÷ lot SF. Higher = more home per square foot of land.
Heatmap Color Scale (Phase 3b-PREP)
Rescaled to the realized SFR exit-$/SF distribution observed in the SM+Palisades slice (~$840 P5 → $3,540 P95). The band discriminates inside the $1.5K–$2.5K/SF meat of the market.
$840 — blue (cool / value)
~$1.5K — cyan
~$2.2K — green (mid Westside)
~$2.9K — yellow (luxury pocket)
$3,540+ — red (ultra-luxury / Palisades-cliff)
Data Age Indicators
Colored dots in the header bar show when each dataset was last refreshed:
< 3 days old
3–7 days old
> 7 days old
Age unknown
Datasets tracked: Listings, Comps, Parcels.
Access
Invite-only access. Contact matt@lucidresi.com.
How Exit $/SF Is Calculated
Exit $/SF is the estimated sale price per square foot for a completed new-construction single-family home on this parcel. The comp universe is restricted to detached single-family residences only (no condos, no townhomes, no multi-family) and to sales within the last 24 months. Comps are classified into three condition tiers, and the exit price prefers the truest comp pool (T1-New) and falls back gracefully when that pool is thin.
prefer T1-New regression → T1-Reno regression → T1-New median → T1-Reno median → T2 regression × (1 + uplift) → T2 median × (1 + uplift)
uplift = 18% (condition adjustment for older / unrenovated comps)
No floor. No ceiling. The model output is the number. Each cluster reports its exitSrc (which tier the price came from) so confidence can be judged at a glance.
SFR Comp Universe & Three-Tier Classification
Comps are spatially clustered (0.005° ≈ 0.35 mi grid cells) and bucketed into one of three tiers:
T1-New — Built within the last 5 years — the truest comp for a new-build exit; preferred when ≥3 prints exist in the cluster
T1-Reno — Near-new finish proxy: a mid-recency build (yb 2000–2020) with non-negative residual, OR an older build (yb ≥1900) selling >$100/SF above the neighborhood median (indicating a full remodel)
T2-Existing — Older / unrenovated baseline. Used as exit anchor only when T1-New and T1-Reno are both insufficient, and only with a +18% condition uplift
A cluster needs at least 3 comps in a tier to fit a weighted size-regression. Below that, the tier median is used. T1-Reno requires no premium — recently renovated SFR finishes are comparable to new construction in $/SF terms; the gap shows up only in T2.
Sale $/SF Color Scale
The Sale $/SF grid layer and comp popup colors use a 14-bucket cold-to-hot gradient:
$1,500+
$1,400–1,500
$1,300–1,400
$1,200–1,300
$1,100–1,200
$1,000–1,100
$950–1,000
$900–950
$850–900
$800–850
$750–800
$700–750
$650–700
<$650
Size Curve
Within each cluster and each tier (with ≥3 comps), the pipeline fits a recency-weighted linear regression of price = intercept + slope × sqft across comp sale price and square footage, then predicts the price at the 3,500 SF target home size. Output is converted back to $/SF for display. Comps outside 1,200–6,000 SF are excluded from the curve fit; comps with extreme slopes (<$200 or >$1,500/SF) are rejected as bad fits.
The 3,500 SF anchor matches our default new-build SFR home size. Larger or smaller targets are interpolated from the same curve via the KEY-panel home-size override.
Recency Weights
0–6 months ago 1.00
6–12 months ago 0.85
12–18 months ago 0.70
18–24 months ago 0.50
Older than 24 months excluded
Comp Confidence
The model requires at least 5 comps. If fewer qualify, the search radius expands (up to 3.0 miles) and lower product tiers are added until 5 are found. Confidence is scored 0–100 based on comp count and method quality:
High (75+) — 10+ scored comps within search radius
Medium (50–74) — 5–9 scored comps
Low (25–49) — fewer than 5 high-quality comps; treat exit $/SF with caution
Very Low (<25) — sparse data; exit $/SF is unreliable
Outlier Rejection
The pipeline rejects regression slopes outside [$200, $1,500]/SF as bad curve fits, and excludes comps whose $/SF falls outside this same band. Comps outside 1,200–6,000 SF are excluded from the size-curve fit. Trimming is performed at the curve-fit stage, not as a post-hoc IQR pass.
T2 Condition Uplift (When Used)
When a cluster lacks enough T1-New or T1-Reno prints to anchor an exit, the model falls back to the T2 (older / unrenovated) pool with a +18% condition uplift. This adjusts for the empirical gap between an existing-condition resale and what a new SFR build in the same submarket trades for.
The uplift is applied only when exitSrc is existing+uplift or existing-median+uplift. T1-Reno prints (recently renovated) are treated as comparable to new construction in finish level and require no premium.
Exit Source Codes (Confidence Signal)
Each cluster exposes the path the exit number was derived from, so confidence can be judged at a glance:
new — Strongest: ≥3 T1-New comps in the cluster supported a size-regression fit
reno — Strong: ≥3 T1-Reno comps anchored the regression (recent renovation ≈ new finish)
new-median / reno-median — Moderate: ≥3 T1 prints exist but the regression did not pass sanity checks; tier median used
existing+uplift / existing-median+uplift — Limited: no T1 prints in the cluster; T2 baseline used with +18% condition uplift
blended+uplift — Weakest: insufficient comps in any tier; blended cluster median used with half uplift. Treat exit with caution.
Comp Exclusion (Hide Toggle)
Hiding comps filters the comp table for inspection; exit $/SF stays at the pipeline value (full re-pricing on the remaining pool is a future enhancement). Excluded comps remain visible at reduced opacity and are flagged (EXCLUDED: TRUE) in CSV exports.
Exclusions are per-deal and per-session — they reset on page reload. To override exit $/SF, use edit mode on the deal card.
Zone Eligibility
Eligible parcels are single-family-zoned and buildable. In-scope zones: A, RA, RE, RS, R1, RU, RZ, RW1, and LAND (vacant residential). All other zones are out of scope.
Hard Exclusions
Two automatic disqualifiers — no override:
Historic Resource — Parcel listed or eligible under LA HCM, HPOZ (contributing), or CA Register of Historical Resources. Cannot build new SFR on a contributing historic resource. Flagged ‘🏛 Historic — UNQUAL’ on the deal card and removed from the viable pool.
Open Space / Protected Area — Conservation easement or similar restriction on development rights.
Informational Flags (never exclusions)
🔥 VHFHSZ — Very High Fire Hazard Severity Zone. Flagged on the deal card as an insurance cost input — not a knockout. Burn-zone and Palisades-perimeter parcels are acquisition targets for new-build SFR; insurance cost realities are surfaced on the deal card.
🌊 Coastal Zone — May trigger CEQA / California Coastal Commission review. Flagged informational only.
? Zoning Unconfirmed — Zoning inferred from Redfin property type rather than confirmed via city API (affects Beverly Hills, WeHo, Culver City, Inglewood, Pasadena, Glendale, Burbank, Long Beach). Verify with the city before acting on these parcels.
Lot Type
Corner Lot — Parcel touches 2+ named streets (OSM). Corner setbacks may differ; check local code. Shown as a blue tag on the deal card.
Alley Lot — Rear/side alley access detected (OSM highway=service, service=alley). May affect utility easements and rear setbacks. Shown as a blue tag on the deal card.
Standard — Single street frontage, no alley. No tag shown (default).
Note: Classification from OpenStreetMap. Verify against assessor maps.
Site Flags
⚡ Power Lines — Overhead power infrastructure detected within 80m via OpenStreetMap. May affect rear/side setback requirements or require utility relocation. Shown as an amber tag on the deal card. Verify with utility company and local building dept.
🏛 Historic Zones — Toggles HPOZ (purple shaded areas) and HCM (purple dots) overlays across the full map. Listings within these boundaries are hard-excluded and flagged on the deal card.