[object Object]

← back to Nationalrealestate

Public Records Sources page (/sources.html) — every open-data source the platform draws on, cited + coverage counts; 'use all public records' made visible; Sources nav across pages

841ad6f7779a89923cd037d34a48d650fb431753 · 2026-07-21 17:25:40 -0700 · Steve Abrams

Files touched

Diff

commit 841ad6f7779a89923cd037d34a48d650fb431753
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 21 17:25:40 2026 -0700

    Public Records Sources page (/sources.html) — every open-data source the platform draws on, cited + coverage counts; 'use all public records' made visible; Sources nav across pages
---
 public/admin.html     |   1 +
 public/brokers.html   |   1 +
 public/compare.html   |   1 +
 public/index.html     |   1 +
 public/property.html  |   1 +
 public/sources.html   | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++
 public/watchlist.html |   1 +
 7 files changed, 137 insertions(+)

diff --git a/public/admin.html b/public/admin.html
index df28ee2..96c0944 100644
--- a/public/admin.html
+++ b/public/admin.html
@@ -43,6 +43,7 @@
     <a href="/markets.html">Markets</a>
     <a href="/compare.html">Compare</a>
     <a href="/brokers.html">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/watchlist.html">Watchlist</a>
     <a href="/admin.html" class="active">Admin</a>
   </nav>
diff --git a/public/brokers.html b/public/brokers.html
index 1dc3a09..a113cb5 100644
--- a/public/brokers.html
+++ b/public/brokers.html
@@ -61,6 +61,7 @@
     <a href="/">Map</a>
     <a href="/markets.html">Markets</a>
     <a href="/brokers.html" class="active">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/watchlist.html">Watchlist</a>
     <a href="/admin.html">Admin</a>
   </nav>
diff --git a/public/compare.html b/public/compare.html
index b48ad28..07a2cf6 100644
--- a/public/compare.html
+++ b/public/compare.html
@@ -46,6 +46,7 @@
     <a href="/markets.html">Markets</a>
     <a href="/compare.html" class="active">Compare</a>
     <a href="/brokers.html">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/watchlist.html">Watchlist</a>
     <a href="/admin.html">Admin</a>
   </nav>
diff --git a/public/index.html b/public/index.html
index 196cb74..320315c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -49,6 +49,7 @@
     <a href="/markets.html">Markets</a>
     <a href="/compare.html">Compare</a>
     <a href="/brokers.html">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/watchlist.html">Watchlist</a>
     <a href="/admin.html">Admin</a>
   </nav>
diff --git a/public/property.html b/public/property.html
index 85527b1..b13f067 100644
--- a/public/property.html
+++ b/public/property.html
@@ -70,6 +70,7 @@
     <a href="/markets.html">Markets</a>
     <a href="/watchlist.html">Watchlist</a>
     <a href="/brokers.html">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/admin.html">Admin</a>
   </nav>
 </div>
diff --git a/public/sources.html b/public/sources.html
new file mode 100644
index 0000000..bf729eb
--- /dev/null
+++ b/public/sources.html
@@ -0,0 +1,131 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%230a0d13'/%3E%3Ctext x='8' y='12' font-size='10' text-anchor='middle' fill='%23c8a24b'%3EUS%3C/text%3E%3C/svg%3E">
+<title>USRealEstate — Public Records Sources</title>
+<style>
+  :root{--bg:#0a0d13;--panel:#11151d;--line:#222936;--fg:#e8ecf2;--muted:#8a93a3;--gold:#c8a24b;--green:#3fb950;}
+  *{box-sizing:border-box;} body{margin:0;background:var(--bg);color:var(--fg);font:14px/1.5 -apple-system,Segoe UI,Roboto,sans-serif;}
+  #topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:18px;padding:10px 18px;
+    background:rgba(17,21,29,.94);border-bottom:1px solid var(--line);backdrop-filter:blur(6px);}
+  #topbar .brand{font-size:16px;font-weight:700;} #topbar .brand b{color:var(--gold);}
+  nav{display:flex;gap:14px;font-size:13px;flex-wrap:wrap;} nav a{color:var(--muted);text-decoration:none;}
+  nav a:hover,nav a.active{color:var(--gold);}
+  main{max-width:1150px;margin:0 auto;padding:22px 18px 60px;}
+  h1{font-size:22px;margin:0 0 4px;} h1 b{color:var(--gold);}
+  .lede{color:var(--muted);font-size:13px;margin-bottom:6px;max-width:760px;}
+  .totals{display:flex;gap:14px;flex-wrap:wrap;margin:16px 0 24px;}
+  .tot{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 18px;text-align:center;}
+  .tot .n{font-size:22px;font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums;}
+  .tot .l{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;}
+  h2{font-size:14px;color:var(--gold);margin:26px 0 10px;text-transform:uppercase;letter-spacing:.5px;}
+  table{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden;}
+  th,td{padding:9px 14px;border-bottom:1px solid var(--line);text-align:left;font-size:13px;vertical-align:top;}
+  th{background:var(--bg);color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.4px;}
+  td.num{text-align:right;font-variant-numeric:tabular-nums;}
+  td a{color:var(--gold);text-decoration:none;} td a:hover{text-decoration:underline;}
+  .pill{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:1px 9px;font-size:11px;color:var(--muted);}
+  .pill.live{color:var(--green);border-color:#2b4d38;}
+  .empty{color:var(--muted);padding:30px;text-align:center;}
+  .foot{color:var(--muted);font-size:12px;margin-top:26px;font-style:italic;}
+</style>
+</head>
+<body>
+<div id="topbar">
+  <div class="brand"><b>USRealEstate</b> — Public Records Sources</div>
+  <nav>
+    <a href="/">Map</a><a href="/markets.html">Markets</a><a href="/compare.html">Compare</a>
+    <a href="/brokers.html">Brokers</a><a href="/sources.html" class="active">Sources</a>
+    <a href="/watchlist.html">Watchlist</a><a href="/admin.html">Admin</a>
+  </nav>
+</div>
+<main>
+  <h1><b>Every record here is public.</b></h1>
+  <div class="lede">USRealEstate is built entirely on free, open government and public-research data —
+    no licensed MLS feed, no paid data vendor. Below is every source it draws on, what it feeds,
+    and how much is loaded. All ingestion is $0.</div>
+  <div class="totals" id="totals"></div>
+
+  <h2>National coverage — every county &amp; metro</h2>
+  <table><thead><tr><th>Source</th><th>What it feeds</th><th>Cadence</th><th class="num">Rows</th></tr></thead>
+    <tbody id="national"></tbody></table>
+
+  <h2>Property-level — parcels by county</h2>
+  <table><thead><tr><th>County</th><th>Source</th><th>Fills</th><th class="num">Parcels</th></tr></thead>
+    <tbody id="parcels"></tbody></table>
+
+  <h2>Broker registry — state licensing rosters</h2>
+  <table><thead><tr><th>State roster</th><th class="num">Brokers</th></tr></thead>
+    <tbody id="brokers"></tbody></table>
+
+  <div class="foot">Attribution: Zillow Research &amp; Redfin Data Center (research use), U.S. Census Bureau,
+    FHFA, FEMA National Risk Index, HUD, and the named county/state open-data portals. Data reflects each
+    source's latest public release; see Admin for per-ingest provenance.</div>
+</main>
+<script>
+const COUNTY_LABELS = {
+  '06037':'Los Angeles, CA','36061':'Manhattan (New York), NY','36047':'Brooklyn (Kings), NY',
+  '36081':'Queens, NY','36005':'Bronx, NY','36085':'Staten Island (Richmond), NY',
+  '53033':'King (Seattle), WA','17031':'Cook (Chicago), IL',
+};
+const PARCEL_SRC = {
+  '06037':['LA County Assessor 2025 secured roll (via CRCP)','Details · Tax · recording date'],
+  '36061':['NYC MapPLUTO (NYC Open Data)','Details · Tax · Ownership · Zoning · Map'],
+  '36047':['NYC MapPLUTO (NYC Open Data)','Details · Tax · Ownership · Zoning · Map'],
+  '36081':['NYC MapPLUTO (NYC Open Data)','Details · Tax · Ownership · Zoning · Map'],
+  '36005':['NYC MapPLUTO (NYC Open Data)','Details · Tax · Ownership · Zoning · Map'],
+  '36085':['NYC MapPLUTO (NYC Open Data)','Details · Tax · Ownership · Zoning · Map'],
+  '53033':['King County Assessor EXTR bulk','Details · Tax · Sales history (deeds) · Zoning'],
+  '17031':['Cook County Assessor (Socrata)','Details · Tax (assessed) · Ownership · Map'],
+};
+const NATIONAL = [
+  ['Zillow Research (ZHVI, ZORI)','Home value + rent indices','monthly','zillow'],
+  ['Redfin Data Center','Sale price, inventory, DOM, months supply','monthly','redfin'],
+  ['U.S. Census ACS 5-yr','Income, rent, population, vacancy','annual','acs'],
+  ['FHFA House Price Index','Metro/state price index','quarterly','fhfa'],
+  ['FEMA National Risk Index','Climate/hazard risk scores','release','fema_nri'],
+  ['HUD Fair Market Rents','FMR studio–4BR','annual','hud_fmr'],
+];
+const int = n => (+n).toLocaleString();
+
+(async () => {
+  const [cov, health, bstats, runs] = await Promise.all([
+    fetch('/api/property/coverage').then(r=>r.json()),
+    fetch('/api/health').then(r=>r.json()),
+    fetch('/api/broker-stats').then(r=>r.json()),
+    fetch('/api/admin/runs').then(r=>r.json()).catch(()=>({runs:[]})),
+  ]);
+  const rowsBySource = {};
+  for (const r of runs.runs||[]) if (r.status==='ok' && !(r.source in rowsBySource)) rowsBySource[r.source]=r.rows_upserted;
+
+  const parcelTotal = (cov.counties||[]).reduce((a,c)=>a+ (+c.parcel_count||0),0);
+  const brokerTotal = bstats.total_brokers||0;
+  const regionTotal = Object.values(health.regions||{}).reduce((a,n)=>a+n,0);
+  document.getElementById('totals').innerHTML = [
+    [regionTotal,'regions'],[ (cov.counties||[]).length,'parcel counties'],
+    [parcelTotal,'parcels'],[brokerTotal,'brokers'],
+  ].map(([n,l])=>`<div class="tot"><div class="n">${int(n)}</div><div class="l">${l}</div></div>`).join('');
+
+  document.getElementById('national').innerHTML = NATIONAL.map(([name,feeds,cad,src])=>{
+    const n = rowsBySource[src];
+    return `<tr><td>${name} <span class="pill live">live</span></td><td>${feeds}</td><td>${cad}</td>
+      <td class="num">${n!=null?int(n):'—'}</td></tr>`;
+  }).join('');
+
+  const cs = (cov.counties||[]).slice().sort((a,b)=>(+b.parcel_count)-(+a.parcel_count));
+  document.getElementById('parcels').innerHTML = cs.length ? cs.map(c=>{
+    const meta = PARCEL_SRC[c.county_fips]||['—','—'];
+    return `<tr><td><a href="/property.html?county=${c.county_fips}">${COUNTY_LABELS[c.county_fips]||c.county_fips}</a></td>
+      <td>${meta[0]}</td><td>${meta[1]}</td><td class="num">${int(c.parcel_count)}</td></tr>`;
+  }).join('') : '<tr><td colspan="4" class="empty">none loaded</td></tr>';
+
+  const bs = (bstats.states||[]).slice().sort((a,b)=>b.brokers-a.brokers);
+  document.getElementById('brokers').innerHTML = bs.length ? bs.map(s=>
+    `<tr><td><a href="/brokers.html?state=${s.state}">${s.state}</a> · ${int(s.firms)} firms</td>
+      <td class="num">${int(s.brokers)}</td></tr>`).join('') : '<tr><td colspan="2" class="empty">none</td></tr>';
+})();
+</script>
+</body>
+</html>
diff --git a/public/watchlist.html b/public/watchlist.html
index 870cbe3..e693d34 100644
--- a/public/watchlist.html
+++ b/public/watchlist.html
@@ -46,6 +46,7 @@
     <a href="/markets.html">Markets</a>
     <a href="/compare.html">Compare</a>
     <a href="/brokers.html">Brokers</a>
+    <a href="/sources.html">Sources</a>
     <a href="/watchlist.html" class="active">Watchlist</a>
     <a href="/admin.html">Admin</a>
   </nav>

← a808341 Consolidate agent M-P2/wave-2 work: Cook IL parcel adapter,  ·  back to Nationalrealestate  ·  M-P2 Cook County IL (17031): 1,863,530 parcels from Assessor 7b17d35 →