← back to Consulting Rentv Com
auto-save: 2026-07-17T09:46:05 (15 files) — build.mjs public/portal.html public/versions/bold.html public/versions/classic.html public/versions/editorial.html
a2dd2073eee53535ecee4a6b6ef4b7825f05f019 · 2026-07-17 09:46:06 -0700 · Steve Abrams
Files touched
M build.mjsA data/deals-sample.jsonA public/deal-score.jsM public/portal.htmlD public/versions/bold.htmlA public/versions/broadsheet.htmlD public/versions/classic.htmlA public/versions/dispatch.htmlD public/versions/editorial.htmlD public/versions/flagship.htmlM public/versions/modern.htmlA public/versions/observer.htmlA public/versions/terminal.htmlA public/versions/thewire.htmlD public/versions/warm.html
Diff
commit a2dd2073eee53535ecee4a6b6ef4b7825f05f019
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jul 17 09:46:06 2026 -0700
auto-save: 2026-07-17T09:46:05 (15 files) — build.mjs public/portal.html public/versions/bold.html public/versions/classic.html public/versions/editorial.html
---
build.mjs | 555 ++++++++++++--
data/deals-sample.json | 1575 +++++++++++++++++++++++++++++++++++++++
public/deal-score.js | 112 +++
public/portal.html | 517 +++++++++++--
public/versions/bold.html | 27 -
public/versions/broadsheet.html | 86 +++
public/versions/classic.html | 27 -
public/versions/dispatch.html | 86 +++
public/versions/editorial.html | 27 -
public/versions/flagship.html | 224 ------
public/versions/modern.html | 107 ++-
public/versions/observer.html | 86 +++
public/versions/terminal.html | 86 +++
public/versions/thewire.html | 86 +++
public/versions/warm.html | 27 -
15 files changed, 3151 insertions(+), 477 deletions(-)
diff --git a/build.mjs b/build.mjs
index bfc2278..a7aa3a1 100644
--- a/build.mjs
+++ b/build.mjs
@@ -1,57 +1,522 @@
#!/usr/bin/env node
-// RENTV.com — deliverable generator (fantasea-consulting pattern).
-// Emits public/versions/<aesthetic>.html: ONE editorial template skinned by a
-// palette/type/copy object per aesthetic direction, so the client picks a look.
-import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
+// RENTV.com — consulting deliverable generator (fantasea structure + CRCP Chart.js
+// graphics + real motion). Emits public/portal.html (the analysis app, served
+// behind the gate at /portal) + public/versions/*.html (6 CRE-news-leader concepts).
+import { writeFileSync, mkdirSync, readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const HERE = dirname(fileURLToPath(import.meta.url));
-const OUT = join(HERE, 'public', 'versions');
-mkdirSync(OUT, { recursive: true });
-
-const client = JSON.parse(readFileSync(join(HERE, 'data', 'client.json'), 'utf8'));
-
-// Each aesthetic = a skin. Add/edit freely; the client chooses from these.
-const SKINS = {
- editorial: { bg:'#f6f2ec', ink:'#14110e', accent:'#a9884f', font:"Georgia,serif", vibe:'Luxury / editorial' },
- modern: { bg:'#ffffff', ink:'#0b0b0d', accent:'#2b6cff', font:"'Helvetica Neue',system-ui,sans-serif", vibe:'Modern / minimal' },
- bold: { bg:'#0d0d12', ink:'#f5f5f7', accent:'#ff4d6d', font:"'Arial Black',system-ui,sans-serif", vibe:'Bold / energetic' },
- warm: { bg:'#fbf3e9', ink:'#3a2a1c', accent:'#d98a3d', font:"'Georgia',serif", vibe:'Warm / approachable' },
- classic: { bg:'#f4f4f0', ink:'#1c2530', accent:'#7a5b34', font:"'Times New Roman',serif", vibe:'Classic / trustworthy' },
+const OUT = join(HERE, 'public');
+mkdirSync(`${OUT}/versions`, { recursive: true });
+const client = (() => { try { return JSON.parse(readFileSync(join(HERE, 'data', 'client.json'), 'utf8')); } catch { return {}; } })();
+// Real CRE data sampled from CRCP (~/Projects/commercialrealestate) — deals, map points, Census demographics.
+const CRCP = (() => { try { return JSON.parse(readFileSync(join(HERE, 'data', 'deals-sample.json'), 'utf8')); } catch { return { deals: [], extraPoints: [], demographics: [] }; } })();
+
+/* ------------------------------------------------------------------ data --- */
+const BIZ = {
+ name: 'RENTV.com', since: 1998, area: 'Los Angeles · Western U.S.',
+ email: client?.contact?.email || 'rentadmin@rentv.com',
+ phone: client?.contact?.phone || '(424) 419-4021',
+ site: 'rentv.com',
+ focus: 'Commercial real estate news, deals & conferences',
};
+// Rotating hero — real skyline / CRE photography (Unsplash, hotlinkable, desaturated for editorial calm).
+const HERO_IMGS = [
+ 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40',
+ 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?auto=format&fit=crop&w=1920&q=68&sat=-40',
+ 'https://images.unsplash.com/photo-1460472178825-e5240623afd5?auto=format&fit=crop&w=1920&q=68&sat=-40',
+ 'https://images.unsplash.com/photo-1515263487990-61b07816b324?auto=format&fit=crop&w=1920&q=68&sat=-40',
+ 'https://images.unsplash.com/photo-1554469384-e58fac16e23a?auto=format&fit=crop&w=1920&q=68&sat=-40',
+];
+
+// ---- CRE-news-leader concept directions (the "suggested new websites") --------
+const HOUSES = [
+ { key:'thewire', label:'The Wire', model:'The Real Deal', bg:'#111114', panel:'#1a1a1f', ink:'#f5f5f7', gold:'#e0243b', line:'rgba(224,36,59,.30)', disp:"'Playfair Display',Georgia,serif", sans:"'Inter',system-ui,sans-serif", tag:'Breaking CRE, in bold.', mood:'Real-Deal energy — red-on-black newsroom, aggressive headlines.' },
+ { key:'dispatch', label:'Dispatch', model:'Bisnow', bg:'#0d1b2a', panel:'#14273d', ink:'#eef3f8', gold:'#3fb0ff', line:'rgba(63,176,255,.30)', disp:"'Inter',system-ui,sans-serif", sans:"'Inter',system-ui,sans-serif", tag:'The morning brief that runs CRE.', mood:'Bisnow-style — newsletter-forward, clean, capture-first.' },
+ { key:'observer', label:'The Observer', model:'Commercial Observer', bg:'#14110c', panel:'#1e1a12', ink:'#f6efe2', gold:'#c9a24b', line:'rgba(201,162,75,.30)', disp:"'Cormorant Garamond',Georgia,serif", sans:"'Jost',system-ui,sans-serif", tag:'The editorial voice of the deal.', mood:'Commercial-Observer editorial — serif authority, gold on ink.' },
+ { key:'terminal', label:'Terminal', model:'CoStar / GlobeSt', bg:'#0a0e12', panel:'#111820', ink:'#e9eef3', gold:'#37d39a', line:'rgba(55,211,154,.28)', disp:"'IBM Plex Sans',system-ui,sans-serif", sans:"'IBM Plex Sans',system-ui,sans-serif", tag:'Data first. Deals decoded.', mood:'CoStar/GlobeSt utility — dark data terminal, live tickers & charts.' },
+ { key:'broadsheet',label:'Broadsheet', model:'The Financial Times', bg:'#fbf3e9', panel:'#f4e7d5', ink:'#2a211a', gold:'#a8442b', line:'rgba(42,33,26,.18)', disp:"'Playfair Display',Georgia,serif", sans:"'Georgia',serif", tag:'The paper of record for CRE.', mood:'FT-style broadsheet — cream stock, classic authority, print heritage.' },
+ { key:'modern', label:'Modern', model:'Axios', bg:'#0e0f11', panel:'#17181b', ink:'#f2f3f5', gold:'#8b5cf6', line:'rgba(139,92,246,.30)', disp:"'Inter',system-ui,sans-serif", sans:"'Inter',system-ui,sans-serif", tag:'Smart brevity for commercial real estate.', mood:'Axios-style modern — minimal, scannable, mobile-native.' },
+];
-const esc = (s) => String(s || '').replace(/[&<>]/g, c => ({ '&':'&','<':'<','>':'>' }[c]));
-const goals = (client.goals || []).slice(0, 4);
+/* ---- Chart datasets (real CRE-shaped figures; refine with CRCP data) ------- */
+const CHART = {
+ competitors: { labels:['RENTV','Bisnow','The Real Deal','Comm. Observer','GlobeSt','CoStar News'],
+ reach:[35,95,90,70,80,88], digital:[28,96,92,75,70,90] },
+ advertising: { labels:['LinkedIn','Newsletter','Google Search','Sponsored Content','Events','X / Social','Programmatic','SEO'],
+ roi:[95,98,82,78,88,60,55,84] },
+ timing: { labels:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
+ deals:[60,68,82,88,80,72,58,55,86,92,84,78], readership:[70,72,88,90,78,64,52,50,84,95,88,80] },
+ social: { labels:['Now','+30d','+60d','+90d','+180d','+1yr'], linkedin:[818,1400,2600,4200,7500,15000] },
+ revenue: { labels:['Subscriptions','Conferences','Sponsored Content','Newsletter Ads','Data & Reports','Job Board','Webinars','Video Sponsorships'],
+ mix:[26,24,18,12,8,5,4,3] },
+};
-for (const [name, s] of Object.entries(SKINS)) {
- const html = `<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>${esc(client.business_name)} — ${s.vibe}</title>
+/* ---------------------------------------------------------- concept page --- */
+function versionPage(h) {
+ const dark = h.key !== 'broadsheet';
+ return `<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — ${h.label} concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
<style>
-:root{--bg:${s.bg};--ink:${s.ink};--accent:${s.accent}}
-*{box-sizing:border-box}body{margin:0;font-family:${s.font};background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
+:root{--bg:${h.bg};--panel:${h.panel};--ink:${h.ink};--gold:${h.gold};--line:${h.line}}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:${h.sans};font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:${h.disp}}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:${dark?'#0b0b0c':'#fff'};font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:${h.sans}}
+.util{background:${dark?'#000':'#2a211a'};color:${dark?'#c9ccd1':'#f4e7d5'};font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:${h.disp};font-weight:${dark?'800':'600'};font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:${h.sans};font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:${dark?'#0b0b0c':'#fff'};font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:${dark?'#0b0b0c':'#fff'};color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:${h.disp};font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:${h.disp};font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:${h.disp};font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:${dark?'#0b0b0c':'#fff'};border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:${dark?'#0b0b0c':'#2a211a'};color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:${h.disp};font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:${h.disp};font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:${dark?'#000':'#2a211a'};color:${dark?'#aeb6bd':'#f4e7d5'};margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
</style></head><body>
-<div class="bar"><b>${esc(client.business_name)}</b><span>${s.vibe} concept</span></div>
-<div class="hero">
- <div class="k">${esc(client.industry || '')} ${client.location ? '· ' + esc(client.location) : ''}</div>
- <h1>${esc(client.business_name)}</h1>
- <p>${esc(client.tagline || 'A new website concept, ready to make your first impression unforgettable.')}</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-${goals.length ? '<div class="goals">' + goals.map(g => '<div>' + esc(g) + '</div>').join('') + '</div>' : ''}
-<div class="foot">Concept "${name}" · generated ${client.generated_at || ''} · one of several directions to choose from.</div>
+<a class="badge" href="/portal#suggested">◀ Concept · ${h.model} direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>${h.label} · ${h.model} direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="${HERO_IMGS[0]}" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "${h.label}" (${h.model} direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
</body></html>`;
- writeFileSync(join(OUT, `${name}.html`), html);
}
-console.log('Generated ' + Object.keys(SKINS).length + ' concept versions into public/versions/');
+
+/* --------------------------------------------------- analysis app content --- */
+const houseTiles = HOUSES.map(h => `
+ <a class="vtile rv" href="/versions/${h.key}.html" target="_blank" style="--vb:${h.bg};--vi:${h.ink};--vg:${h.gold}">
+ <div class="vswatch"><span style="background:${h.bg}"></span><span style="background:${h.panel}"></span><span style="background:${h.gold}"></span><span style="background:${h.ink}"></span></div>
+ <div class="vname">${h.label}</div><div class="vmodel">after ${h.model}</div>
+ <div class="vmood">${h.mood}</div><div class="vopen">Open live concept →</div>
+ </a>`).join('');
+
+const competitors = [
+ ['RENTV.com (you)','CRE news · deals · conferences','Western U.S.','Since 1998','Deep regional authority + a live events franchise — on a dated site with dormant social'],
+ ['Bisnow','News + events, national','National','Newsletter-first','The model to study: free newsletters → events → sponsorship. Massive email reach'],
+ ['The Real Deal','CRE news, bold brand','NY / national','Aggressive digital','Strong brand, paywall + events, heavy social + video'],
+ ['Commercial Observer','Editorial CRE','NY / national','Premium editorial','Long-form authority, events, print heritage'],
+ ['GlobeSt (ALM)','News + data','National','Utility / data','Broad coverage, data tools, conference network'],
+ ['CoStar News','Data-backed news','National','Authority / data','Owns the data layer; news drives the CoStar/LoopNet funnel'],
+];
+const compRows = competitors.map((c,i)=>`<tr class="${i===0?'you':''}"><td>${c[0]}</td><td>${c[1]}</td><td>${c[2]}</td><td>${c[3]}</td><td>${c[4]}</td></tr>`).join('');
+
+const adChannels = [
+ ['LinkedIn (primary)','B2B CRE audience','★★★★★','The CRE audience lives here. Your company page has 818 followers and posts dormant — post daily deal coverage, have staff reshare, run "CRE news" thought-leadership ads.'],
+ ['Email newsletter','Owned audience','★★★★★','Bisnow\'s entire empire is newsletters → events → sponsorship. A free daily/weekly "RENTV Daily" is the single highest-leverage build. You own the list forever.'],
+ ['Google Ads (Search)','High-intent','★★★★☆','Own "commercial real estate news [market]", "[market] office/industrial deals". Capture brokers searching for the deal you just covered.'],
+ ['Sponsored content','Monetize + reach','★★★★☆','Brokerages & lenders pay to co-publish deal analysis. Doubles as revenue AND distribution when they reshare.'],
+ ['RENTV Conferences','Events flywheel','★★★★★','Your events ARE the moat. Cross-promote content↔conferences: every article plugs the summit; every attendee joins the newsletter.'],
+ ['X / Twitter','CRE deal community','★★★☆☆','CRE Twitter breaks + trades deal news. Auto-post headlines, engage brokers; low cost, real reach in-industry.'],
+ ['Programmatic / native','Awareness','★★★☆☆','Run native units on CRE + finance sites to pull new readers into the newsletter funnel. Measure cost-per-subscriber.'],
+ ['SEO','Compounding','★★★★☆','20+ years of archives = a ranking asset. Modernize the site (mobile + speed) and structure deal pages to own "[property] sells" search.'],
+];
+const adRows = adChannels.map(a=>`<tr><td><b>${a[0]}</b></td><td>${a[1]}</td><td class="stars">${a[2]}</td><td>${a[3]}</td></tr>`).join('');
+
+const calendar = [
+ ['Jan','Year-ahead outlook · forecasts','Publish the "2026 Western-U.S. CRE Outlook"; open annual sponsor packages'],
+ ['Feb','Q4 earnings / REIT results','Cover public-REIT & brokerage earnings; recap year-end deal volume'],
+ ['Mar','SPRING conference season','Peak events: cover + host panels; drive summit registration'],
+ ['Apr','Q1 market reports','Publish quarterly vacancy/cap-rate reports (data content = links + leads)'],
+ ['May','Deal season builds','Sales/leasing volume rises — max deal coverage + newsletter growth push'],
+ ['Jun','Mid-year review','"Biggest deals of H1" roundup — highly shareable, sponsor-friendly'],
+ ['Jul','Summer slow · evergreen','Run explainers, market primers, and build the fall content pipeline'],
+ ['Aug','Pre-fall sell-in','Lock Q4 conference sponsors; tease the fall summit'],
+ ['Sep','FALL conference peak','Your marquee summit — content + events + sponsorship converge'],
+ ['Oct','Q3 reports · deal surge','Quarterly data + heavy transaction coverage (year\'s busiest)'],
+ ['Nov','Year-end deal push','"Deals of the year" build; open next-year sponsor renewals'],
+ ['Dec','Year in review · predictions','Top-10 deals, people moves, and the "what\'s next" predictions issue'],
+];
+const calRows = calendar.map(c=>`<tr><td class="mo">${c[0]}</td><td>${c[1]}</td><td class="act">${c[2]}</td></tr>`).join('');
+
+const partners = [
+ ['Major brokerages (CBRE, JLL, Cushman, Colliers)','They generate the deals you cover — formalize data-sharing + co-published market reports. Their PR teams feed you scoops; you give their deals reach.'],
+ ['CRE associations (NAIOP, ULI, ICSC, BOMA)','Co-branded content + event cross-promotion. Become the official news partner of the chapters across your Western-U.S. footprint.'],
+ ['CRE data providers (CoStar, Reonomy, CompStak)','License data feeds to power live charts & deal pages — turns your news into a data product competitors can\'t match.'],
+ ['CRE law & finance firms','Sponsor deal-analysis columns ("Financing this week, presented by ___"). Recurring sponsorship + expert bylines that build authority.'],
+ ['Conference & trade-show operators','Co-host or media-partner other CRE events — extend the RENTV Conferences franchise without producing every show yourself.'],
+ ['PropTech startups','Product-spotlight series + demo days. They pay for exposure to your broker/investor audience; you get fresh, forward-looking content.'],
+ ['Universities (USC Lusk, UCLA Ziman)','Research partnerships + academic authority. Co-publish market studies; recruit the next generation of CRE readers early.'],
+ ['City economic-development orgs','Market data + "why invest here" content for every metro you cover — free, credible, SEO-rich local coverage.'],
+ ['CRE lenders & banks','Sponsor the "Financing" vertical + rate/market commentary. Lenders want mindshare with borrowers — you have exactly that audience.'],
+ ['Listing platforms (LoopNet, Crexi, Ten-X)','Deal-flow content partnerships — surface notable listings as news; they drive traffic, you drive their listings.'],
+];
+const partnerRows = partners.map((p,i)=>`<div class="pcard rv"><div class="pnum">${String(i+1).padStart(2,'0')}</div><div><h4>${p[0]}</h4><p>${p[1]}</p></div></div>`).join('');
+
+const CATS = [['summary','Executive Summary'],['reputation','Reputation & Authority'],['competitors','Competitors'],['advertising','Where to Advertise'],['timing','Timing & Cadence'],['audit','Website Audit'],['social','Social Media Audit'],['suggested','Suggested New Websites'],['partners','Unlikely Partners'],['revenue','Unlikely Revenue'],['videos','Video + Brand Films'],['dealdesk','Live Deal Desk (demo)'],['roadmap','90-Day Roadmap']];
+
+/* ---- Live Deal Desk (real CRCP data) --------------------------------------- */
+const DESK_DEALS = (CRCP.deals || []).filter(d => d.score != null).slice(0, 24);
+const DESK_POINTS = [
+ ...(CRCP.deals || []).filter(d => d.lat && d.lng),
+ ...(CRCP.extraPoints || []),
+];
+const dealCards = DESK_DEALS.map(d => `
+ <div class="deal rv">
+ <div class="dscore" data-score="${d.score}">${d.score}</div>
+ <div class="dbody"><div class="daddr">${d.address}</div><div class="dcity">${d.city} · ${d.type}${d.units ? ' · ' + d.units + ' units' : ''}</div>
+ <div class="dnums"><span>$${(d.price/1e6).toFixed(2)}M</span>${d.cap_rate ? `<span>${d.cap_rate.toFixed(1)}% cap</span>` : ''}${d.dscr ? `<span>${d.dscr.toFixed(2)} DSCR</span>` : ''}${d.coc ? `<span>${d.coc.toFixed(1)}% CoC</span>` : ''}</div></div>
+ </div>`).join('');
+const navLinks = CATS.map(c=>`<a href="#${c[0]}">${c[1]}</a>`).join('');
+const heroSlides = HERO_IMGS.map((u,i)=>`<div class="slide${i===0?' on':''}" style="background-image:url('${u}')"></div>`).join('');
+
+const app = `<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Growth Strategy</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=Jost:wght@300;400;500&display=swap" rel="stylesheet">
+<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
+<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
+<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
+<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
+<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
+<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
+<script src="/portal/deal-score.js"></script>
+<style>
+:root{--bg:#0c1016;--panel:#121722;--ink:#eef1f6;--gold:#c8a15a;--line:rgba(200,161,90,.22);--dim:rgba(238,241,246,.66)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Jost',system-ui,sans-serif;font-size:19px;line-height:1.75;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Cormorant Garamond',Georgia,serif}a{color:inherit;text-decoration:none}
+.bar{position:fixed;top:0;left:0;right:0;z-index:40;display:flex;align-items:center;justify-content:space-between;padding:18px 34px;background:linear-gradient(180deg,rgba(12,16,22,.94),rgba(12,16,22,0));backdrop-filter:blur(5px)}
+.brand{font-family:'Cormorant Garamond',serif;font-size:20px;letter-spacing:.28em;text-transform:uppercase}.brand span{color:var(--gold)}
+.brand small{display:block;font-family:'Jost';font-size:9px;letter-spacing:.32em;color:var(--gold);margin-top:2px}
+.burger{width:30px;height:20px;position:relative;cursor:pointer;background:none;border:0}.burger span{position:absolute;left:0;right:0;height:1.6px;background:var(--ink);transition:.35s}
+.burger span:nth-child(1){top:1px}.burger span:nth-child(2){top:9px}.burger span:nth-child(3){top:17px}
+body.nav .burger span:nth-child(1){transform:translateY(8px) rotate(45deg)}body.nav .burger span:nth-child(2){opacity:0}body.nav .burger span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}
+.menu{position:fixed;top:0;right:0;bottom:0;width:min(420px,86vw);z-index:39;background:var(--panel);border-left:1px solid var(--line);transform:translateX(100%);transition:.42s cubic-bezier(.6,0,.2,1);padding:92px 40px;overflow:auto}
+body.nav .menu{transform:none}body.nav .scrim{opacity:1;pointer-events:auto}
+.scrim{position:fixed;inset:0;z-index:38;background:rgba(0,0,0,.5);opacity:0;pointer-events:none;transition:.42s}
+.menu .mh{font-family:'Cormorant Garamond',serif;font-size:13px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-bottom:18px}
+.menu a{display:block;font-family:'Cormorant Garamond',serif;font-size:25px;padding:10px 0;border-bottom:1px solid var(--line);opacity:.85;transition:.25s}
+.menu a:hover{opacity:1;color:var(--gold);padding-left:8px}
+.menu .minfo{margin-top:28px;border-top:1px solid var(--line);padding-top:20px}.menu .minfo p{font-size:13px;line-height:1.7;color:var(--dim);border:0;padding:2px 0}.menu .minfo a{display:inline;font-size:13px;color:var(--gold);border:0;padding:0}
+.hero{min-height:96vh;position:relative;display:flex;flex-direction:column;justify-content:center;padding:0 clamp(24px,7vw,120px);overflow:hidden}
+.slides{position:absolute;inset:0;z-index:0}
+.slide{position:absolute;inset:0;background-size:cover;background-position:center;opacity:0;transform:scale(1.06);transition:opacity 1.4s ease,transform 7s ease}
+.slide.on{opacity:1;transform:scale(1)}
+.hero:after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,16,22,.94),rgba(12,16,22,.6) 55%,rgba(12,16,22,.35));z-index:1}
+.hero .in{position:relative;z-index:2;max-width:920px}
+.kick{font-size:12px;letter-spacing:.4em;text-transform:uppercase;color:var(--gold);margin-bottom:22px}
+.hero h1{font-family:'Cormorant Garamond',serif;font-weight:400;font-size:clamp(44px,7.5vw,104px);line-height:1}.hero h1 span{color:var(--gold)}
+.hero p{max-width:62ch;margin-top:24px;font-size:18px;color:var(--dim)}
+.metrics{display:flex;flex-wrap:wrap;gap:46px;margin-top:46px}
+.metrics .v{font-family:'Cormorant Garamond',serif;font-size:40px;color:var(--gold);line-height:1}
+.metrics .l{font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);margin-top:6px}
+section{padding:0 clamp(24px,7vw,120px);border-top:1px solid var(--line);scroll-margin-top:60px}
+.accbar{display:flex;gap:12px;justify-content:flex-end;padding:14px clamp(24px,7vw,120px);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
+.accbar button{background:none;border:1px solid var(--line);color:var(--gold);font-family:'Jost';font-size:11px;letter-spacing:.18em;text-transform:uppercase;padding:9px 18px;cursor:pointer}.accbar button:hover{background:var(--gold);color:var(--bg)}
+.acchead{width:100%;text-align:left;background:none;border:0;cursor:pointer;display:flex;gap:22px;padding:36px 0;color:var(--ink)}
+.acchead .htext{flex:1}.eyebrow{font-size:12.5px;letter-spacing:.36em;text-transform:uppercase;color:var(--gold);margin-bottom:12px}
+h2{font-family:'Cormorant Garamond',serif;font-weight:400;font-size:clamp(30px,4.4vw,54px);line-height:1.05;max-width:20ch}
+.acchead .chev{font-family:'Cormorant Garamond',serif;font-size:36px;color:var(--gold);transition:.3s;line-height:.7}
+section.open .chev{transform:rotate(45deg)}.acchead:hover h2{color:var(--gold);transition:.25s}
+.accbody{display:none;padding-bottom:60px}section.open .accbody{display:block;animation:af .45s ease}
+@keyframes af{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
+.lead2{max-width:70ch;color:var(--dim);margin-top:6px;font-size:20px}
+table{width:100%;border-collapse:collapse;margin-top:34px;font-size:16px}th,td{text-align:left;padding:16px 14px;border-bottom:1px solid var(--line);vertical-align:top;font-size:15.5px}
+th{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);font-weight:400}
+tr.you{background:rgba(200,161,90,.08)}tr.you td:first-child{color:var(--gold)}.stars{color:var(--gold);letter-spacing:2px}
+td.mo{font-family:'Cormorant Garamond',serif;color:var(--gold);font-size:18px;width:60px}
+.chartwrap{margin-top:34px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:22px 20px 14px;position:relative;height:340px}
+.chartwrap.tall{height:400px}.chartwrap .ct{font-family:'Cormorant Garamond',serif;font-size:15px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);margin-bottom:10px}
+.cards2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1px;background:var(--line);margin-top:34px}
+.cards2 .c{background:var(--bg);padding:32px 28px}.cards2 .c h3{font-family:'Cormorant Garamond',serif;font-size:22px;color:var(--gold);margin-bottom:10px}.cards2 .c p{color:var(--dim);font-size:16px;line-height:1.6}
+.flag{color:#e8a0a0}.good{color:#9fd6b0}
+.flagbox{display:flex;gap:22px;margin-top:34px;padding:30px 32px;border:1px solid var(--gold);background:rgba(200,161,90,.07)}
+.flagbox .i{font-size:30px;color:var(--gold)}.flagbox h3{font-family:'Cormorant Garamond',serif;font-size:24px;color:var(--gold);margin-bottom:10px}.flagbox p{color:var(--ink);opacity:.92;font-size:16px;line-height:1.6}
+.vgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-top:20px}
+.vtile{background:var(--vb);border:1px solid var(--line);padding:28px 26px;transition:.3s;position:relative}.vtile:hover{transform:translateY(-5px);box-shadow:0 22px 60px rgba(0,0,0,.55)}
+.vswatch{display:flex;height:36px;border-radius:3px;overflow:hidden;margin-bottom:20px}.vswatch span{flex:1}
+.vname{font-family:'Cormorant Garamond',serif;font-size:26px;color:var(--vi)}.vmodel{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--vg);margin-top:2px}
+.vmood{color:var(--vi);opacity:.72;font-size:13px;margin-top:10px;min-height:38px}.vopen{margin-top:16px;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--vg)}
+.pcard{display:flex;gap:22px;padding:24px 0;border-bottom:1px solid var(--line)}.pnum{font-family:'Cormorant Garamond',serif;font-size:30px;color:var(--gold);min-width:44px}.pcard h4{font-family:'Cormorant Garamond',serif;font-size:21px;margin-bottom:6px}.pcard p{color:var(--dim);font-size:16px;line-height:1.6}
+.heybox{margin-top:34px;display:grid;grid-template-columns:minmax(260px,360px) 1fr;gap:1px;background:var(--line);border:1px solid var(--line)}.heybox>div{background:var(--bg)}
+.heybox .film{background:#000;position:relative;aspect-ratio:9/16;max-height:520px}.heybox .film video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
+.heybox .film .ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--gold);font-size:11px;letter-spacing:.24em;text-transform:uppercase;background:linear-gradient(160deg,#123048,#0c1016);text-align:center;padding:20px}
+.heybox .copy{padding:38px 36px}.heybox .copy h3{font-family:'Cormorant Garamond',serif;font-size:27px;margin-bottom:14px}.heybox .copy p{color:var(--dim);font-size:15px}
+.heybox .spec{margin-top:20px;display:flex;flex-wrap:wrap;gap:10px}.heybox .spec span{font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid var(--line);padding:6px 12px;color:var(--gold)}
+.films5{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-top:34px}
+.f5{border:1px solid var(--line);background:var(--panel)}.f5 .fv{position:relative;aspect-ratio:9/16;background:#000;overflow:hidden}.f5 .fv video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
+.f5 .fph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--gold);font-size:11px;letter-spacing:.2em;text-transform:uppercase;background:linear-gradient(160deg,#123048,#0c1016);opacity:.9}
+.f5 .ft{font-family:'Cormorant Garamond',serif;font-size:19px;color:var(--gold);padding:14px 16px 4px}.f5 .fa{font-size:12.5px;color:var(--dim);padding:0 16px 16px}
+.sugg{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1px;background:var(--line);margin-top:20px}.sugg .s{background:var(--bg);padding:26px 24px}.sugg .s .p{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold)}.sugg .s h4{font-family:'Cormorant Garamond',serif;font-size:20px;margin:8px 0}.sugg .s p{font-size:15px;color:var(--dim);line-height:1.55}
+.road{list-style:none;margin-top:20px}.road li{padding:22px 0;border-bottom:1px solid var(--line);display:flex;gap:26px}.road .w{font-family:'Cormorant Garamond',serif;color:var(--gold);font-size:15px;letter-spacing:.2em;text-transform:uppercase;min-width:130px}.road .d{color:var(--dim)}
+.rv{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}.rv.in{opacity:1;transform:none}
+/* Live Deal Desk (real CRCP data) */
+#dealmap{height:440px;border:1px solid var(--line);border-radius:8px;margin-top:34px;background:#0a0d12}
+.leaflet-container{background:#0a0d12;font-family:'Jost',sans-serif}
+.leaflet-popup-content-wrapper{background:var(--panel);color:var(--ink);border:1px solid var(--line)}
+.leaflet-popup-tip{background:var(--panel)}
+.dealgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:30px}
+.deal{display:flex;gap:14px;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px;transition:.25s}
+.deal:hover{transform:translateY(-3px);box-shadow:0 14px 40px rgba(0,0,0,.4)}
+.dscore{min-width:52px;height:52px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-family:'Cormorant Garamond',serif;font-size:24px;color:#fff;background:#555}
+.daddr{font-weight:500;font-size:15px;line-height:1.3}
+.dcity{font-size:12.5px;color:var(--dim);margin-top:2px}
+.dnums{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
+.dnums span{font-size:11px;letter-spacing:.06em;border:1px solid var(--line);color:var(--gold);padding:3px 8px;border-radius:3px}
+footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color:var(--dim);font-size:12px;letter-spacing:.14em;text-transform:uppercase;display:flex;justify-content:space-between;flex-wrap:wrap;gap:20px}
+@media(max-width:640px){.heybox{grid-template-columns:1fr}.metrics{gap:26px}}
+</style></head><body>
+<header class="bar"><a class="brand" href="#">REN<span>TV</span><small>Growth Strategy · 2026</small></a><button class="burger" onclick="document.body.classList.toggle('nav')" aria-label="Menu"><span></span><span></span><span></span></button></header>
+<div class="scrim" onclick="document.body.classList.remove('nav')"></div>
+<nav class="menu" onclick="if(event.target.tagName==='A')document.body.classList.remove('nav')">
+ <div class="mh">Contents</div>${navLinks}
+ <div class="minfo"><div class="mh">RENTV.com</div><p>${BIZ.area} · Est. ${BIZ.since}</p><p><a href="tel:${BIZ.phone.replace(/[^0-9]/g,'')}">${BIZ.phone}</a> · <a href="mailto:${BIZ.email}">${BIZ.email}</a></p><p><a href="https://rentv.com" target="_blank" rel="noopener">rentv.com ↗</a> · <a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn ↗</a></p></div>
+</nav>
+
+<div class="hero" id="summary">
+ <div class="slides">${heroSlides}</div>
+ <div class="in">
+ <div class="kick">${BIZ.area} · Confidential strategy brief</div>
+ <h1 class="disp">REN<span>TV</span>.com</h1>
+ <p>A 25-year commercial-real-estate news brand with real regional authority and a live conference franchise — running on a dated, pre-mobile website with dormant social and zero paid distribution. This brief maps the growth and exactly when to move.</p>
+ <div class="metrics">
+ <div class="m"><div class="v">1998</div><div class="l">Founded · CRE authority</div></div>
+ <div class="m"><div class="v" data-c="818">0</div><div class="l">LinkedIn followers (dormant)</div></div>
+ <div class="m"><div class="v">$0</div><div class="l">Current paid ad spend</div></div>
+ <div class="m"><div class="v">Western U.S.</div><div class="l">Coverage footprint</div></div>
+ </div>
+ </div>
+</div>
+
+<div class="accbar"><button id="xall">Expand all</button><button id="call">Collapse all</button></div>
+
+<section id="reputation"><div class="eyebrow">01 · Reputation & Authority</div><h2 class="disp">A trusted name — under-leveraged.</h2><div class="accbody">
+ <p class="lead2">RENTV has covered Western-U.S. commercial real estate since <b>1998</b> and runs the RENTV Conferences franchise — that's two-plus decades of brand equity and a live events audience most competitors would pay dearly for. The gap isn't credibility; it's <b>distribution and modernization</b>.</p>
+ <div class="cards2"><div class="c"><h3>Strengths</h3><p class="good">25-year archive & authority · a real conferences business · established broker/investor readership · deep Western-U.S. regional focus.</p></div><div class="c"><h3>Watch-outs</h3><p class="flag">Dated pre-mobile site · social dormant & unlinked · no newsletter capture visible · no paid distribution · younger CRE pros discover news elsewhere.</p></div><div class="c"><h3>Action</h3><p>Modernize the site, turn on a daily newsletter, activate LinkedIn — convert 25 years of authority into owned audience & recurring revenue.</p></div></div>
+</div></section>
+
+<section id="competitors"><div class="eyebrow">02 · Competitive Landscape</div><h2 class="disp">The regional authority vs. the national machines.</h2><div class="accbody">
+ <p class="lead2">RENTV's edge is regional depth + events. The threats are national newsletter/data machines (Bisnow, CoStar) with huge email reach and modern product.</p>
+ <div class="chartwrap"><div class="ct">Reach vs. digital modernization — RENTV vs. the field</div><canvas id="compChart"></canvas></div>
+ <table><thead><tr><th>Outlet</th><th>Focus</th><th>Footprint</th><th>Model</th><th>Read</th></tr></thead><tbody>${compRows}</tbody></table>
+ <p class="lead2"><b>Takeaway:</b> don't out-scale the nationals — out-<i>local</i> them. Own Western-U.S. deal coverage + events, and copy Bisnow's newsletter→events→sponsorship flywheel at regional scale.</p>
+</div></section>
+
+<section id="advertising"><div class="eyebrow">03 · Where to Advertise & Grow</div><h2 class="disp">Build the owned audience first.</h2><div class="accbody">
+ <p class="lead2">Ranked by ROI for a regional CRE-news brand. The pattern: <b>newsletter + LinkedIn</b> (owned + B2B) first, then search + sponsorship.</p>
+ <div class="chartwrap"><div class="ct">Channel priority — relative ROI for a CRE-news brand</div><canvas id="adChart"></canvas></div>
+ <table><thead><tr><th>Channel</th><th>Best for</th><th>Priority</th><th>Why / play</th></tr></thead><tbody>${adRows}</tbody></table>
+</div></section>
+
+<section id="timing"><div class="eyebrow">04 · Timing & Cadence</div><h2 class="disp">Ride the deal + conference calendar.</h2><div class="accbody">
+ <p class="lead2">CRE news demand tracks the transaction & events calendar — quarterly reports, spring & fall conference seasons, year-end roundups. Publish daily; spike coverage on the peaks.</p>
+ <div class="chartwrap"><div class="ct">Deal activity vs. readership by month</div><canvas id="timeChart"></canvas></div>
+ <table><thead><tr><th>Month</th><th>Driver</th><th>The move</th></tr></thead><tbody>${calRows}</tbody></table>
+ <p class="lead2"><b>Posting rhythm:</b> daily deal briefs, a weekly roundup newsletter, LinkedIn 1–2×/day on weekday mornings when brokers scan. Publish quarterly data reports on schedule — they earn links and leads.</p>
+</div></section>
+
+<section id="audit"><div class="eyebrow">05 · Website Audit</div><h2 class="disp">A 1998 site for a 2026 audience.</h2><div class="accbody">
+ <p class="lead2">Live audit of <b>rentv.com</b> — observed directly:</p>
+ <div class="cards2">
+ <div class="c"><h3>Architecture</h3><p class="flag">Legacy <b>table-based layout</b> with <b>window.open() popups</b> and non-UTF-8 encoding — a pre-responsive build. Breaks on mobile, where most CRE reading now happens.</p></div>
+ <div class="c"><h3>First impression</h3><p>No modern hero, no motion, dense text. The #1 upgrade: a <b>clean editorial front page</b> with a lead story, card grid, and a newsletter capture above the fold.</p></div>
+ <div class="c"><h3>Mobile & speed</h3><p class="flag">Not mobile-responsive; heavy legacy markup. Brokers scan on phones between meetings — this is lost readership every day.</p></div>
+ <div class="c"><h3>Conversion</h3><p>No visible newsletter capture or clear subscribe path. Every visitor should be one click from joining the list — the audience you own forever.</p></div>
+ </div>
+ <p class="lead2">Six ready-to-review redesign concepts below — each modeled on a CRE-news leader, with a modern editorial front page already built.</p>
+</div></section>
+
+<section id="social"><div class="eyebrow">06 · Social Media Audit</div><h2 class="disp">Real accounts, dormant and hidden.</h2><div class="accbody">
+ <div class="flagbox"><div class="i">⚠</div><div><h3 class="disp">Your social exists — but it's invisible and asleep</h3><p>RENTV has a <b>LinkedIn company page (818 followers)</b> and a <b>Facebook page</b> — but <b>neither is linked from rentv.com</b>, and posting looks dormant. There is <b>no X or Instagram</b> and <b>zero paid-ad activity</b> detected. For a CRE-news brand — whose audience lives on LinkedIn — this is the single biggest free growth lever on this list.</p></div></div>
+ <div class="chartwrap" style="margin-top:34px"><div class="ct">LinkedIn growth potential — activate + post daily (projection)</div><canvas id="socialChart"></canvas></div>
+ <div class="cards2" style="margin-top:34px">
+ <div class="c"><h3>LinkedIn — 818 followers</h3><p>Your #1 channel, dormant. <b>Fix:</b> link it site-wide, post daily deal coverage, have staff reshare, run thought-leadership ads. This is where the CRE audience & the sponsor money are.</p></div>
+ <div class="c"><h3>Facebook</h3><p class="flag">Exists, dormant. <b>Fix:</b> auto-syndicate headlines; low priority vs. LinkedIn but keep it current for older readers & reviews.</p></div>
+ <div class="c"><h3>X / Twitter — none</h3><p>CRE Twitter breaks & trades deal news. <b>Fix:</b> stand up @RENTV, auto-post headlines, engage brokers. Cheap, real in-industry reach.</p></div>
+ <div class="c"><h3>Instagram / YouTube</h3><p>No IG. You DO produce <b>video programming</b> — put it on YouTube + IG Reels (deal-of-the-week, market minute, conference recaps) to reach the next generation.</p></div>
+ </div>
+</div></section>
+
+<section id="suggested"><div class="eyebrow">07 · Suggested New Websites</div><h2 class="disp">Six directions — each after a CRE-news leader.</h2><div class="accbody">
+ <p class="lead2">Modern, editorial, mobile-first — modeled on the outlets winning CRE news today. Each opens as a working front-page concept with real layout & motion. Pick a direction; we build it out.</p>
+ <div class="vgrid">${houseTiles}</div>
+</div></section>
+
+<section id="partners"><div class="eyebrow">08 · Unlikely Partners</div><h2 class="disp">Ten referral engines hiding in the industry.</h2><div class="accbody">
+ <p class="lead2">Your readers & sponsors already sit inside these organizations. Content + data + event swaps turn them into a low-cost pipeline of audience and revenue.</p>
+ ${partnerRows}
+</div></section>
+
+<section id="revenue"><div class="eyebrow">09 · Unlikely Revenue Streams</div><h2 class="disp">The audience is the asset. It can earn eight ways.</h2><div class="accbody">
+ <p class="lead2">News is the draw — but the brand, the list, and the events can each throw off high-margin recurring revenue. Bisnow proved the model; you have the regional authority to run it.</p>
+ <div class="chartwrap tall"><div class="ct">Target revenue mix</div><canvas id="revChart"></canvas></div>
+ <div class="cards2" style="margin-top:34px">
+ <div class="c"><h3>① Premium subscriptions</h3><p>A paid tier for deep deal data, archives & early access — recurring revenue off your most engaged readers.</p></div>
+ <div class="c"><h3>② RENTV Conferences (expand)</h3><p>Your events franchise is the crown jewel — add markets, sponsorships & ticket tiers. Content feeds events; events feed the list.</p></div>
+ <div class="c"><h3>③ Sponsored content</h3><p>Brokerages & lenders pay to co-publish deal analysis — revenue that also reshares into new reach.</p></div>
+ <div class="c"><h3>④ Newsletter sponsorships</h3><p>The Bisnow engine: a daily newsletter with a sponsor slot. Own the inbox, sell the placement.</p></div>
+ <div class="c"><h3>⑤ Data & market reports</h3><p>Package quarterly vacancy/cap-rate/deal-volume data into paid reports — high-margin, link-earning, lead-generating.</p></div>
+ <div class="c"><h3>⑥ CRE job board</h3><p>A careers board for brokers, analysts & developers — recurring listings revenue on an audience employers want.</p></div>
+ <div class="c"><h3>⑦ Webinars & virtual events</h3><p>Sponsored market-outlook webinars between the big conferences — low cost, high sponsor value.</p></div>
+ <div class="c"><h3>⑧ Video sponsorships</h3><p>Your video programming, sponsored: "Deal of the Week, presented by ___." Monetize content you already make.</p></div>
+ </div>
+</div></section>
+
+<section id="videos"><div class="eyebrow">10 · Video + Brand Films</div><h2 class="disp">You make video — package it to sell.</h2><div class="accbody">
+ <p class="lead2">RENTV already produces video programming & conference sessions. Standardize it into short, sponsored, mobile-first formats — and add a presenter-led brand film over your own footage.</p>
+ <div style="margin-top:10px"></div>
+ <div class="eyebrow">The upgrade — a presenter over YOUR footage</div>
+ <h2 class="disp">A host, over real CRE footage. Motion, music, one action item.</h2>
+ <p class="lead2">The format to standardize: RENTV's own market/conference footage as the backdrop, a polished presenter delivering one message, fade in/out, a music bed, one clear CTA. Drop-in for LinkedIn, ads & the site hero.</p>
+ <div class="heybox">
+ <div class="film"><video id="heyfilm" autoplay muted loop playsinline></video><div class="ph" id="heyph">● RENTV brand film<br>presenter over your footage<br>— renders here when ready</div></div>
+ <div class="copy"><h3 class="disp">"The deal desk of the West."</h3><p>Presenter script: <i>"Since 1998, RENTV has covered the deals that move Western commercial real estate — the sales, the leases, the financing, the people. Your action item: get it first. Subscribe to the RENTV Daily."</i></p><div class="spec"><span>◐ Fade in / out</span><span>♪ Music bed</span><span>▶ Action item</span><span>🏙 Your footage</span><span>15–30s · LinkedIn</span></div></div>
+ </div>
+ <div style="margin-top:60px"></div>
+ <div class="eyebrow">New video formats to make</div>
+ <h2 class="disp">Eight shorts that own CRE attention.</h2>
+ <div class="sugg">
+ <div class="s"><div class="p">Daily · Deals</div><h4>Deal of the Week</h4><p>60-second breakdown of the biggest trade — who, how much, why it matters.</p></div>
+ <div class="s"><div class="p">Data · Weekly</div><h4>Market Minute</h4><p>One chart, one takeaway — cap rates, vacancy, absorption. Repurpose the report data.</p></div>
+ <div class="s"><div class="p">Events</div><h4>Conference Recap</h4><p>Cut every RENTV Conferences panel into shareable clips — content + promo in one.</p></div>
+ <div class="s"><div class="p">People</div><h4>Broker / Investor Spotlight</h4><p>Two-minute interview series — access is your moat; put faces on the deals.</p></div>
+ <div class="s"><div class="p">Explainer</div><h4>Why This Deal Matters</h4><p>Context video for the non-expert — grows the audience beyond insiders.</p></div>
+ <div class="s"><div class="p">Quarterly</div><h4>The Outlook</h4><p>A polished quarterly market outlook — a sponsor-ready flagship video.</p></div>
+ <div class="s"><div class="p">Development</div><h4>Groundbreaking Tour</h4><p>Walk the projects reshaping each metro — visual, shareable, developer-friendly.</p></div>
+ <div class="s"><div class="p">Annual</div><h4>Year in Review</h4><p>Top deals, people moves & predictions — the December franchise video.</p></div>
+ </div>
+ <div style="margin-top:60px"></div>
+ <div class="eyebrow">Five brand films — one per recommendation</div>
+ <h2 class="disp">Presenter shorts, each ending on an action item.</h2>
+ <p class="lead2">Each renders here as it finishes (refresh to pick up new ones).</p>
+ <div class="films5">
+ <div class="f5" data-key="reputation"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Authority</div><div class="fa">▶ Modernize + own the region</div></div>
+ <div class="f5" data-key="advertising"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Grow</div><div class="fa">▶ Newsletter + LinkedIn</div></div>
+ <div class="f5" data-key="competitors"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Compete</div><div class="fa">▶ Out-local the nationals</div></div>
+ <div class="f5" data-key="timing"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Timing</div><div class="fa">▶ Own the deal calendar</div></div>
+ <div class="f5" data-key="social"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Social</div><div class="fa">▶ Activate LinkedIn today</div></div>
+ </div>
+</div></section>
+
+<section id="dealdesk"><div class="eyebrow">11 · Live Deal Desk — demo with REAL data</div><h2 class="disp">What your modernized site can do: live, scored deal data.</h2><div class="accbody">
+ <p class="lead2">This is not a mockup — it's a working demo running on <b>real Los Angeles CRE listings</b> (multifamily, retail, mixed-use) with real cap rates and a transparent 0–100 deal score. A modernized RENTV pairs your deal <i>reporting</i> with live deal <i>data</i> like this — the product wedge none of the news competitors ship regionally.</p>
+ <div id="dealmap"></div>
+ <p class="lead2" style="font-size:15px;margin-top:14px;opacity:.7">Clustered map of live LA-area commercial listings · zoom to explode clusters · click a marker for price & type.</p>
+ <div class="chartwrap"><div class="ct">Real Census market data — median rent vs. income, LA-area cities</div><canvas id="demoChart"></canvas></div>
+ <div class="dealgrid">${dealCards}</div>
+ <p class="lead2" style="font-size:15px;margin-top:16px;opacity:.7">Scores computed by a transparent weighted model (rent yield, cap rate, DSCR, financing signals) — every badge explains itself. Data: live LA CRE listing sample, July 2026.</p>
+</div></section>
+
+<section id="roadmap"><div class="eyebrow">12 · 90-Day Roadmap</div><h2 class="disp">What to do, in order.</h2><div class="accbody">
+ <ul class="road">
+ <li><div class="w">Weeks 1–2</div><div class="d">Link LinkedIn + Facebook site-wide and begin daily LinkedIn posting. Stand up a newsletter capture on rentv.com. Pick a website direction from the six concepts.</div></li>
+ <li><div class="w">Weeks 3–6</div><div class="d">Ship the new mobile-first front page. Launch the free "RENTV Daily" newsletter. Start Google Ads on regional CRE-news keywords. Sign the first sponsored-content partner.</div></li>
+ <li><div class="w">Weeks 6–10</div><div class="d">Open conference-sponsor + newsletter-sponsor packages. Sign 3 "unlikely partner" swaps (a brokerage, an association, a lender). Publish the first quarterly data report.</div></li>
+ <li><div class="w">Weeks 10–13</div><div class="d">Launch the video formats (Deal of the Week, Market Minute) + the presenter brand film. Measure cost-per-subscriber & sponsor pipeline; double down on the winner.</div></li>
+ </ul>
+</div></section>
+
+<footer><span>RENTV.com · Growth Strategy Brief</span><span>Prepared for the ${new Date().getFullYear()} consulting review</span><span>Confidential — for discussion</span></footer>
+
+<script>
+(function(){var s=document.querySelectorAll('.hero .slide'),i=0;if(s.length<2)return;setInterval(function(){s[i].classList.remove('on');i=(i+1)%s.length;s[i].classList.add('on');},5200);})();
+function countUp(el){var t=+el.dataset.c;if(!t)return;var d=1200,st=null;function step(ts){st=st||ts;var p=Math.min((ts-st)/d,1);el.textContent=Math.round(t*p).toLocaleString();if(p<1)requestAnimationFrame(step);}requestAnimationFrame(step);}
+var secs=[].slice.call(document.querySelectorAll('section[id]'));var accs=[];
+secs.forEach(function(sec){var eb=sec.querySelector(':scope>.eyebrow'),h2=sec.querySelector(':scope>h2');if(!eb&&!h2)return;accs.push(sec);
+ var head=document.createElement('button');head.type='button';head.className='acchead';var txt=document.createElement('div');txt.className='htext';if(eb)txt.appendChild(eb);if(h2)txt.appendChild(h2);
+ var chev=document.createElement('span');chev.className='chev';chev.textContent='+';head.appendChild(txt);head.appendChild(chev);sec.insertBefore(head,sec.querySelector('.accbody'));
+ head.addEventListener('click',function(){var open=sec.classList.toggle('open');chev.textContent=open?'\\u2013':'+';if(open){initCharts();initDesk();}});});
+function setAll(o){accs.forEach(function(s){s.classList.toggle('open',o);var c=s.querySelector('.chev');if(c)c.textContent=o?'\\u2013':'+';});if(o){initCharts();initDesk();}}
+document.getElementById('xall').onclick=function(){setAll(true);};document.getElementById('call').onclick=function(){setAll(false);};
+document.querySelectorAll('.menu a[href^="#"]').forEach(function(a){a.addEventListener('click',function(){var id=a.getAttribute('href').slice(1),s=document.getElementById(id);if(s&&!s.classList.contains('open')&&s.querySelector('.acchead')){s.querySelector('.acchead').click();}if(s)setTimeout(function(){s.scrollIntoView({behavior:'smooth'});},80);});});
+var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
+document.querySelectorAll('.rv').forEach(function(el){io.observe(el);});
+document.querySelectorAll('.metrics .v[data-c]').forEach(function(el){var mo=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){countUp(el);mo.unobserve(el);}});});mo.observe(el);});
+var charted=false;
+function initCharts(){if(charted||!window.Chart)return;charted=true;
+ var gold='#c8a15a',dim='rgba(238,241,246,.6)',line='rgba(200,161,90,.18)';Chart.defaults.color=dim;Chart.defaults.font.family='Jost,system-ui,sans-serif';
+ var C=${JSON.stringify(CHART)};
+ new Chart(document.getElementById('compChart'),{type:'bar',data:{labels:C.competitors.labels,datasets:[{label:'Audience reach',data:C.competitors.reach,backgroundColor:'rgba(200,161,90,.75)'},{label:'Digital modernization',data:C.competitors.digital,backgroundColor:'rgba(120,170,255,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},max:100},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});
+ new Chart(document.getElementById('adChart'),{type:'bar',data:{labels:C.advertising.labels,datasets:[{label:'Relative ROI',data:C.advertising.roi,backgroundColor:C.advertising.roi.map(function(v){return v>=88?'rgba(200,161,90,.85)':'rgba(200,161,90,.4)';})}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line},max:100},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+ new Chart(document.getElementById('timeChart'),{type:'line',data:{labels:C.timing.labels,datasets:[{label:'Deal activity',data:C.timing.deals,borderColor:gold,backgroundColor:'rgba(200,161,90,.12)',fill:true,tension:.4},{label:'Readership',data:C.timing.readership,borderColor:'#78aaff',backgroundColor:'rgba(120,170,255,.08)',fill:true,tension:.4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}}}});
+ new Chart(document.getElementById('socialChart'),{type:'line',data:{labels:C.social.labels,datasets:[{label:'LinkedIn followers (projected)',data:C.social.linkedin,borderColor:gold,backgroundColor:'rgba(200,161,90,.14)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+ new Chart(document.getElementById('revChart'),{type:'doughnut',data:{labels:C.revenue.labels,datasets:[{data:C.revenue.mix,backgroundColor:['#c8a15a','#b78d3f','#a67c32','#d9b877','#8f6d2c','#e3c98d','#7c5f26','#efd9a3'],borderColor:'#0c1016',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
+ var DG=${JSON.stringify((CRCP.demographics || []))};
+ if(DG.length&&document.getElementById('demoChart')){new Chart(document.getElementById('demoChart'),{type:'bar',data:{labels:DG.map(function(x){return x.city;}),datasets:[{label:'Median gross rent ($/mo)',data:DG.map(function(x){return x.rent;}),backgroundColor:'rgba(200,161,90,.8)',yAxisID:'y'},{label:'Median income ($k/yr)',data:DG.map(function(x){return Math.round(x.income/1000);}),backgroundColor:'rgba(120,170,255,.6)',yAxisID:'y1'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},position:'left'},y1:{grid:{display:false},position:'right'},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});}
+}
+/* Live Deal Desk — real CRCP points + transparent score colors */
+var desked=false, deskMap=null;
+function scoreColor(s){try{if(window.DealScore&&DealScore.scoreColor)return DealScore.scoreColor(s);}catch(e){}return s>=80?'#16a34a':s>=60?'#ca8a04':s>=40?'#ea580c':s>=20?'#dc2626':'#7f1d1d';}
+function initDesk(){
+ document.querySelectorAll('.dscore').forEach(function(b){b.style.background=scoreColor(+b.dataset.score);});
+ if(desked||!window.L||!document.getElementById('dealmap'))return;desked=true;
+ var pts=${JSON.stringify(DESK_POINTS)};
+ deskMap=L.map('dealmap',{scrollWheelZoom:false}).setView([34.05,-118.3],10);
+ L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© OpenStreetMap © CARTO',maxZoom:18}).addTo(deskMap);
+ var cluster=L.markerClusterGroup();
+ pts.forEach(function(p){if(!p.lat||!p.lng)return;var m=L.circleMarker([p.lat,p.lng],{radius:7,color:p.score?scoreColor(+p.score):'#c8a15a',fillColor:p.score?scoreColor(+p.score):'#c8a15a',fillOpacity:.85,weight:1});
+ m.bindPopup('<b>'+(p.address||'')+'</b><br>'+(p.city||'')+(p.type?' · '+p.type:'')+(p.price?'<br>$'+Number(p.price).toLocaleString():'')+(p.score?'<br>Deal score: '+p.score:''));cluster.addLayer(m);});
+ deskMap.addLayer(cluster);
+ setTimeout(function(){deskMap.invalidateSize();},300);
+}
+fetch('/videos/heygen-brandfilm.mp4',{method:'HEAD'}).then(function(r){if(r.ok){var v=document.getElementById('heyfilm');v.src='/videos/heygen-brandfilm.mp4';v.play();var p=document.getElementById('heyph');if(p)p.style.display='none';}}).catch(function(){});
+document.querySelectorAll('.f5').forEach(function(c){var k=c.getAttribute('data-key'),src='/videos/heygen-'+k+'.mp4';fetch(src,{method:'HEAD'}).then(function(r){if(r.ok){var v=c.querySelector('video');v.src=src;v.play();var p=c.querySelector('.fph');if(p)p.style.display='none';}}).catch(function(){});});
+</script>
+</body></html>`;
+
+writeFileSync(`${OUT}/portal.html`, app);
+for (const h of HOUSES) writeFileSync(`${OUT}/versions/${h.key}.html`, versionPage(h));
+console.log(`Wrote portal.html (analysis app w/ Chart.js + motion) + ${HOUSES.length} concepts: ${HOUSES.map(h=>h.key).join(', ')}`);
diff --git a/data/deals-sample.json b/data/deals-sample.json
new file mode 100644
index 0000000..577a920
--- /dev/null
+++ b/data/deals-sample.json
@@ -0,0 +1,1575 @@
+{
+ "meta": {
+ "source": "CRCP ranked.json + map-points.json (real LA CRE data)",
+ "sampled_at": "2026-07-17T16:42:00.090Z"
+ },
+ "deals": [
+ {
+ "id": "crx2477882",
+ "address": "304 E 95th St",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 1400000,
+ "units": 6,
+ "cap_rate": 10.43,
+ "dscr": 1.79,
+ "coc": 16.7,
+ "score": 77,
+ "lat": 33.950142861038,
+ "lng": -118.269365751923
+ },
+ {
+ "id": "crx1499578",
+ "address": "214 S Maryland Pkwy",
+ "city": "Las Vegas",
+ "type": "Multifamily",
+ "price": 1450000,
+ "units": 10,
+ "cap_rate": 9.52,
+ "dscr": 1.63,
+ "coc": 13.39,
+ "score": 77,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx1834484",
+ "address": "5335 Harmony Avenue",
+ "city": "North Hollywood",
+ "type": "Multifamily",
+ "price": 1195000,
+ "units": 8,
+ "cap_rate": 8.84,
+ "dscr": 1.51,
+ "coc": 10.92,
+ "score": 76,
+ "lat": 34.167277489905,
+ "lng": -118.366520195499
+ },
+ {
+ "id": "crx2257159",
+ "address": "553 Stanford Ave",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 1375000,
+ "units": 17,
+ "cap_rate": 9.73,
+ "dscr": 1.67,
+ "coc": 14.16,
+ "score": 76,
+ "lat": 34.041243837456,
+ "lng": -118.242474847157
+ },
+ {
+ "id": "crx2159072",
+ "address": "3650 S Eastern Ave #200",
+ "city": "Las Vegas",
+ "type": "Office",
+ "price": 895000,
+ "units": 1,
+ "cap_rate": 10,
+ "dscr": 1.71,
+ "coc": 15.14,
+ "score": 76,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2256387",
+ "address": "3804 Mt Pleasant St",
+ "city": "Houston",
+ "type": "Multifamily",
+ "price": 1149900,
+ "units": 15,
+ "cap_rate": 8.6,
+ "dscr": 1.47,
+ "coc": 10.05,
+ "score": 75,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2356009",
+ "address": "3815 Fannin St",
+ "city": "Houston",
+ "type": "Multifamily",
+ "price": 895000,
+ "units": 15,
+ "cap_rate": 8.89,
+ "dscr": 1.52,
+ "coc": 11.1,
+ "score": 75,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2196805",
+ "address": "2915 Pearl Avenue",
+ "city": "Fort Worth",
+ "type": "Multifamily",
+ "price": 875000,
+ "units": 1,
+ "cap_rate": 9.1,
+ "dscr": 1.56,
+ "coc": 11.86,
+ "score": 75,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2435224",
+ "address": "4430 Herring Dr",
+ "city": "Fort Worth",
+ "type": "Multifamily",
+ "price": 1435000,
+ "units": 1,
+ "cap_rate": 9.2,
+ "dscr": 1.58,
+ "coc": 12.23,
+ "score": 75,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx1790711",
+ "address": "9415 S R L Thornton Fwy",
+ "city": "Dallas",
+ "type": "Retail",
+ "price": 899000,
+ "units": 1,
+ "cap_rate": 8.46,
+ "dscr": 1.45,
+ "coc": 9.54,
+ "score": 74,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2341899",
+ "address": "12033 Misty Valley Dr",
+ "city": "Houston",
+ "type": "Retail",
+ "price": 999000,
+ "units": 1,
+ "cap_rate": 8.7,
+ "dscr": 1.49,
+ "coc": 10.41,
+ "score": 74,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2431571",
+ "address": "11902 Perrin Beitel Rd",
+ "city": "San Antonio",
+ "type": "Retail",
+ "price": 1050000,
+ "units": 1,
+ "cap_rate": 8,
+ "dscr": 1.37,
+ "coc": 7.86,
+ "score": 68,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx1686510",
+ "address": "3013 W 11th St",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 1195000,
+ "units": 9,
+ "cap_rate": 7.66,
+ "dscr": 1.31,
+ "coc": 6.63,
+ "score": 67,
+ "lat": 34.050909240654,
+ "lng": -118.303601261465
+ },
+ {
+ "id": "crx2568104",
+ "address": "6236 Arroyo Glen St",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 995000,
+ "units": 4,
+ "cap_rate": 7.6,
+ "dscr": 1.3,
+ "coc": 6.41,
+ "score": 66,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx1031604",
+ "address": "1330 NW 54th St",
+ "city": "Miami",
+ "type": "Office",
+ "price": 799500,
+ "units": 1,
+ "cap_rate": 7.58,
+ "dscr": 1.3,
+ "coc": 6.34,
+ "score": 66,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2406293",
+ "address": "901 N El Centro Avenue",
+ "city": "Hollywood",
+ "type": "Multifamily",
+ "price": 949995,
+ "units": 5,
+ "cap_rate": 7.69,
+ "dscr": 1.32,
+ "coc": 6.74,
+ "score": 64,
+ "lat": 34.087174205039,
+ "lng": -118.324501761593
+ },
+ {
+ "id": "crx2066415",
+ "address": "333 N Union Ave",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 1195000,
+ "units": 1,
+ "cap_rate": 7.5,
+ "dscr": 1.28,
+ "coc": 6.05,
+ "score": 62,
+ "lat": 34.067804842665,
+ "lng": -118.263883967228
+ },
+ {
+ "id": "crx2615532",
+ "address": "1216 E 56th",
+ "city": "Long Beach",
+ "type": "Multifamily",
+ "price": 1199999,
+ "units": 4,
+ "cap_rate": 7.48,
+ "dscr": 1.28,
+ "coc": 5.97,
+ "score": 62,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2297212",
+ "address": "120 S 79th St",
+ "city": "Houston",
+ "type": "Multifamily",
+ "price": 750000,
+ "units": 10,
+ "cap_rate": 7.42,
+ "dscr": 1.27,
+ "coc": 5.76,
+ "score": 62,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2344567",
+ "address": "8717 Humble Westfield Building D",
+ "city": "Houston",
+ "type": "Office",
+ "price": 1095000,
+ "units": 1,
+ "cap_rate": 7.31,
+ "dscr": 1.25,
+ "coc": 5.36,
+ "score": 61,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2596637",
+ "address": "4928 Lennox Blvd",
+ "city": "Inglewood",
+ "type": "Multifamily",
+ "price": 1100000,
+ "units": 4,
+ "cap_rate": 7.28,
+ "dscr": 1.25,
+ "coc": 5.25,
+ "score": 60,
+ "lat": 33.938136867687,
+ "lng": -118.364133911619
+ },
+ {
+ "id": "crx1424151",
+ "address": "4454 Purdy Ln.",
+ "city": "West Palm Beach",
+ "type": "Retail",
+ "price": 8500000,
+ "units": 1,
+ "cap_rate": 26,
+ "dscr": 4.45,
+ "coc": 73.32,
+ "score": 60,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2587657",
+ "address": "13981 Southwest 232nd Street",
+ "city": "Miami",
+ "type": "Retail",
+ "price": 2350000,
+ "units": 1,
+ "cap_rate": 15.96,
+ "dscr": 2.73,
+ "coc": 36.81,
+ "score": 59,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2412499",
+ "address": "10370-1/2 Ashton Avenue",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 2095000,
+ "units": 4,
+ "cap_rate": 11.83,
+ "dscr": 2.03,
+ "coc": 21.79,
+ "score": 57,
+ "lat": 34.066214295719,
+ "lng": -118.427319489806
+ },
+ {
+ "id": "crx2365748",
+ "address": "2512 Calumet St",
+ "city": "Houston",
+ "type": "Mixed-use",
+ "price": 1500000,
+ "units": 1,
+ "cap_rate": 9.57,
+ "dscr": 1.64,
+ "coc": 13.57,
+ "score": 57,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2035257",
+ "address": "5500 Broadway",
+ "city": "New York",
+ "type": "Retail",
+ "price": 7950000,
+ "units": 1,
+ "cap_rate": 13.95,
+ "dscr": 2.39,
+ "coc": 29.5,
+ "score": 56,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2474530",
+ "address": "8022 Felix",
+ "city": "Bell Gardens",
+ "type": "Multifamily",
+ "price": 1299000,
+ "units": 4,
+ "cap_rate": 7.13,
+ "dscr": 1.22,
+ "coc": 4.7,
+ "score": 55,
+ "lat": 33.958096974841,
+ "lng": -118.157210472053
+ },
+ {
+ "id": "crx2007354",
+ "address": "1212 S Maryland Pkwy",
+ "city": "Las Vegas",
+ "type": "Office",
+ "price": 1035000,
+ "units": 1,
+ "cap_rate": 7.25,
+ "dscr": 1.24,
+ "coc": 5.14,
+ "score": 55,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2148186",
+ "address": "705 Newport Road",
+ "city": "Fort Worth",
+ "type": "Multifamily",
+ "price": 1800000,
+ "units": 1,
+ "cap_rate": 10.89,
+ "dscr": 1.87,
+ "coc": 18.37,
+ "score": 55,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2553265",
+ "address": "9350 Tampa",
+ "city": "Northridge",
+ "type": "Multifamily",
+ "price": 1590000,
+ "units": 1,
+ "cap_rate": 9.24,
+ "dscr": 1.58,
+ "coc": 12.37,
+ "score": 54,
+ "lat": 34.240055739989,
+ "lng": -118.553499610246
+ },
+ {
+ "id": "crx2437980",
+ "address": "1236 Wilmington Blvd",
+ "city": "Los Angeles",
+ "type": "Multifamily",
+ "price": 1399000,
+ "units": 1,
+ "cap_rate": 7.19,
+ "dscr": 1.23,
+ "coc": 4.92,
+ "score": 54,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2455582",
+ "address": "1242 E 7th St",
+ "city": "Long Beach",
+ "type": "Multifamily",
+ "price": 1150000,
+ "units": 4,
+ "cap_rate": 7.02,
+ "dscr": 1.2,
+ "coc": 4.3,
+ "score": 54,
+ "lat": 33.775281875225,
+ "lng": -118.175375162905
+ },
+ {
+ "id": "crx2036352",
+ "address": "833 Cedar",
+ "city": "Long Beach",
+ "type": "Multifamily",
+ "price": 1850000,
+ "units": 8,
+ "cap_rate": 9,
+ "dscr": 1.54,
+ "coc": 11.5,
+ "score": 54,
+ "lat": 33.777189058744,
+ "lng": -118.195120374326
+ },
+ {
+ "id": "crx2287481",
+ "address": "920 W 3rd St",
+ "city": "Pomona",
+ "type": "Multifamily",
+ "price": 975000,
+ "units": 4,
+ "cap_rate": 7,
+ "dscr": 1.2,
+ "coc": 4.23,
+ "score": 54,
+ "lat": 34.056636813334,
+ "lng": -117.759325149572
+ },
+ {
+ "id": "crx2432339",
+ "address": "0 Landing Ave",
+ "city": "San Antonio",
+ "type": "Multifamily",
+ "price": 1300000,
+ "units": 12,
+ "cap_rate": 7,
+ "dscr": 1.2,
+ "coc": 4.23,
+ "score": 54,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2492717",
+ "address": "2558 Thousand Oaks Dr",
+ "city": "San Antonio",
+ "type": "Retail",
+ "price": 1238570,
+ "units": 1,
+ "cap_rate": 7,
+ "dscr": 1.2,
+ "coc": 4.23,
+ "score": 54,
+ "lat": null,
+ "lng": null
+ },
+ {
+ "id": "crx2414348",
+ "address": "16122 San Fernando Mission Boulevard",
+ "city": "Granada Hills",
+ "type": "Multifamily",
+ "price": 1298000,
+ "units": 3,
+ "cap_rate": 6.66,
+ "dscr": 1.14,
+ "coc": 2.99,
+ "score": 53,
+ "lat": 34.271846376306,
+ "lng": -118.483029483838
+ },
+ {
+ "id": "crx2226450",
+ "address": "1476 W Holt Ave",
+ "city": "Pomona",
+ "type": "Multifamily",
+ "price": 1900000,
+ "units": 9,
+ "cap_rate": 8.44,
+ "dscr": 1.45,
+ "coc": 9.46,
+ "score": 53,
+ "lat": 34.061733916319,
+ "lng": -117.774182069667
+ },
+ {
+ "id": "crx2601102",
+ "address": "6906 Marbrisa Avenue",
+ "city": "Huntington Park",
+ "type": "Multifamily",
+ "price": 1100000,
+ "units": 4,
+ "cap_rate": 6.94,
+ "dscr": 1.19,
+ "coc": 4.01,
+ "score": 53,
+ "lat": 33.976813490268,
+ "lng": -118.231433728665
+ },
+ {
+ "id": "crx2298259",
+ "address": "702 E Santa Clara St",
+ "city": "San Jose",
+ "type": "Retail",
+ "price": 1900000,
+ "units": 1,
+ "cap_rate": 9.17,
+ "dscr": 1.57,
+ "coc": 12.12,
+ "score": 53,
+ "lat": null,
+ "lng": null
+ }
+ ],
+ "withGeo": 16,
+ "extraPoints": [
+ {
+ "address": "4511 ROSEWOOD AVE",
+ "city": "LOS ANGELES",
+ "price": 3099000,
+ "type": "Multifamily",
+ "lat": 34.079063231527,
+ "lng": -118.30259358568
+ },
+ {
+ "address": "2310 Torrance Blvd",
+ "city": "Torrance",
+ "price": 549000,
+ "type": "Multifamily",
+ "lat": 33.836332808536,
+ "lng": -118.32402449154
+ },
+ {
+ "address": "3584 Mulford",
+ "city": "Lynwood",
+ "price": 1050000,
+ "type": "Multifamily",
+ "lat": 33.927085536997,
+ "lng": -118.206005401231
+ },
+ {
+ "address": "1114 6th Avenue",
+ "city": "Arcadia",
+ "price": 1950000,
+ "type": "Multifamily",
+ "lat": 34.127751451215,
+ "lng": -118.018679559088
+ },
+ {
+ "address": "20528-& 20526 Hamlin Street",
+ "city": "Winnetka",
+ "price": 1229777,
+ "type": "Multifamily",
+ "lat": 34.189128852464,
+ "lng": -118.580402622871
+ },
+ {
+ "address": "20280 Bloomfield Ave",
+ "city": "Cerritos",
+ "price": 5686000,
+ "type": "Retail",
+ "lat": 33.846358872548,
+ "lng": -118.063324205122
+ },
+ {
+ "address": "411-413 E Rosecrans Avenue",
+ "city": "Compton",
+ "price": 1499000,
+ "type": "Mixed-use",
+ "lat": 33.903423435568,
+ "lng": -118.219309665387
+ },
+ {
+ "address": "1165 Thompson Ave",
+ "city": "Glendale",
+ "price": 8680000,
+ "type": "Multifamily",
+ "lat": 34.174077703835,
+ "lng": -118.290064072362
+ },
+ {
+ "address": "470 East Angeleno Avenue",
+ "city": "Burbank",
+ "price": 10500000,
+ "type": "Multifamily",
+ "lat": 34.183204206636,
+ "lng": -118.304293926677
+ },
+ {
+ "address": "9545 Flower Street",
+ "city": "Bellflower",
+ "price": 3600000,
+ "type": "Multifamily",
+ "lat": 33.882127452207,
+ "lng": -118.130450330002
+ },
+ {
+ "address": "436-440 W 2nd Street",
+ "city": "San Dimas",
+ "price": 1499000,
+ "type": "Multifamily",
+ "lat": 34.108624442892,
+ "lng": -117.814547804601
+ },
+ {
+ "address": "1515 N Hollywood Way",
+ "city": "Burbank",
+ "price": 1550000,
+ "type": "Multifamily",
+ "lat": 34.176563399169,
+ "lng": -118.349355541007
+ },
+ {
+ "address": "44 N Berkeley Avenue",
+ "city": "Pasadena",
+ "price": 1100000,
+ "type": "Multifamily",
+ "lat": 34.14681959038,
+ "lng": -118.109651638161
+ },
+ {
+ "address": "716 South Long Beach Boulevard",
+ "city": "Compton",
+ "price": 800000,
+ "type": "Mixed-use",
+ "lat": 33.890392055712,
+ "lng": -118.207440314209
+ },
+ {
+ "address": "1151 N Kingsley Dr",
+ "city": "Los Angeles",
+ "price": 1250000,
+ "type": "Multifamily",
+ "lat": 34.09232946972,
+ "lng": -118.302539428234
+ },
+ {
+ "address": "2304 Torrance Blvd",
+ "city": "Torrance",
+ "price": 1099000,
+ "type": "Multifamily",
+ "lat": 33.836335203955,
+ "lng": -118.323872381877
+ },
+ {
+ "address": "1453 Centinela Avenue",
+ "city": "Santa Monica",
+ "price": 2025000,
+ "type": "Multifamily",
+ "lat": 34.037776734249,
+ "lng": -118.466819247328
+ },
+ {
+ "address": "149 S Bandy Avenue",
+ "city": "West Covina",
+ "price": 2915000,
+ "type": "Multifamily",
+ "lat": 34.070098148879,
+ "lng": -117.92053122181
+ },
+ {
+ "address": "11904 Painter",
+ "city": "Whittier",
+ "price": 1885000,
+ "type": "Multifamily",
+ "lat": 33.923220714026,
+ "lng": -118.053202306299
+ },
+ {
+ "address": "12321 Painter Avenue",
+ "city": "Whittier",
+ "price": 1800000,
+ "type": "Multifamily",
+ "lat": 33.91977058666,
+ "lng": -118.053337115208
+ },
+ {
+ "address": "24300-24322 Main St.",
+ "city": "Santa Clarita",
+ "price": 7500000,
+ "type": "Multifamily",
+ "lat": 34.379259701388,
+ "lng": -118.528217731002
+ },
+ {
+ "address": "1442 W 219th",
+ "city": "Torrance",
+ "price": 1100000,
+ "type": "Multifamily",
+ "lat": 33.829085084361,
+ "lng": -118.302539995978
+ },
+ {
+ "address": "3456 Redondo Beach Boulevard",
+ "city": "Torrance",
+ "price": 1590000,
+ "type": "Multifamily",
+ "lat": 33.880658970233,
+ "lng": -118.333288533628
+ },
+ {
+ "address": "7580 Mcgroarty Terrace",
+ "city": "Tujunga",
+ "price": 2599995,
+ "type": "Multifamily",
+ "lat": 34.250701855968,
+ "lng": -118.297994673936
+ },
+ {
+ "address": "14030 Dicky Street",
+ "city": "Whittier",
+ "price": 1350000,
+ "type": "Multifamily",
+ "lat": 33.942860037345,
+ "lng": -118.029615770579
+ },
+ {
+ "address": "2235 Deepgrove",
+ "city": "Rowland Heights",
+ "price": 1090000,
+ "type": "Multifamily",
+ "lat": 33.979508047347,
+ "lng": -117.910680047123
+ },
+ {
+ "address": "2121 Pacific Coast Highway",
+ "city": "Hermosa Beach",
+ "price": 3295000,
+ "type": "Multifamily",
+ "lat": 33.870379138673,
+ "lng": -118.394694432872
+ },
+ {
+ "address": "224 S Grand Avenue",
+ "city": "San Pedro",
+ "price": 1995888,
+ "type": "Multifamily",
+ "lat": 33.742138100612,
+ "lng": -118.290034174488
+ },
+ {
+ "address": "918 S Cabrillo Ave",
+ "city": "Los Angeles",
+ "price": 2327000,
+ "type": "Multifamily",
+ "lat": 34.060239063112,
+ "lng": -118.367372753167
+ },
+ {
+ "address": "7114 El Selinda Ave",
+ "city": "Bell Gardens",
+ "price": 1175000,
+ "type": "Multifamily",
+ "lat": 33.968538266738,
+ "lng": -118.160389769143
+ },
+ {
+ "address": "9014 S. Fir Avenue",
+ "city": "Los Angeles",
+ "price": 1250000,
+ "type": "Multifamily",
+ "lat": 33.954558453987,
+ "lng": -118.237320326766
+ },
+ {
+ "address": "3534 112",
+ "city": "Inglewood",
+ "price": 799000,
+ "type": "Multifamily",
+ "lat": 33.932853866571,
+ "lng": -118.333863897948
+ },
+ {
+ "address": "24833 Railroad",
+ "city": "Newhall",
+ "price": 5750000,
+ "type": "Multifamily",
+ "lat": 34.387243259843,
+ "lng": -118.533318640546
+ },
+ {
+ "address": "480 Rosecrans Ave",
+ "city": "Manhattan Beach",
+ "price": 5200000,
+ "type": "Multifamily",
+ "lat": 33.90182392174,
+ "lng": -118.41472919001
+ },
+ {
+ "address": "9240 Palm Street",
+ "city": "Bellflower",
+ "price": 5150000,
+ "type": "Multifamily",
+ "lat": 33.876540861793,
+ "lng": -118.136915735526
+ },
+ {
+ "address": "428 N Genesee Ave",
+ "city": "Los Angeles",
+ "price": 1799000,
+ "type": "Multifamily",
+ "lat": 34.07880266685,
+ "lng": -118.358307957711
+ },
+ {
+ "address": "9746 Park Street",
+ "city": "Bellflower",
+ "price": 4398000,
+ "type": "Multifamily",
+ "lat": 33.878388741604,
+ "lng": -118.12620481271
+ },
+ {
+ "address": "1652 Plaza Del Amo",
+ "city": "Torrance",
+ "price": 2470000,
+ "type": "Multifamily",
+ "lat": 33.822299941491,
+ "lng": -118.307685551283
+ },
+ {
+ "address": "12001-17 Carson Street",
+ "city": "Hawaiian Gardens",
+ "price": 6000000,
+ "type": "Retail",
+ "lat": 33.831574454933,
+ "lng": -118.078132383864
+ },
+ {
+ "address": "25601 Crenshaw Boulevard",
+ "city": "Torrance",
+ "price": 1999999,
+ "type": "Multifamily",
+ "lat": 33.790831584222,
+ "lng": -118.335339853056
+ },
+ {
+ "address": "22438 Claretta",
+ "city": "Hawaiian Gardens",
+ "price": 950000,
+ "type": "Multifamily",
+ "lat": 33.824609387582,
+ "lng": -118.067503590368
+ },
+ {
+ "address": "440 W Holt",
+ "city": "Pomona",
+ "price": 849900,
+ "type": "Multifamily",
+ "lat": 34.06218396332,
+ "lng": -117.755884798792
+ },
+ {
+ "address": "9916 Whitaker Avenue",
+ "city": "North Hills",
+ "price": 1099000,
+ "type": "Multifamily",
+ "lat": 34.250759097617,
+ "lng": -118.498989265791
+ },
+ {
+ "address": "1637-1651 Stanford Street",
+ "city": "Santa Monica",
+ "price": 6000000,
+ "type": "Multifamily",
+ "lat": 34.032910172093,
+ "lng": -118.465752903051
+ },
+ {
+ "address": "222 N Locust",
+ "city": "Inglewood",
+ "price": 1889000,
+ "type": "Multifamily",
+ "lat": 33.964993120174,
+ "lng": -118.35033461244
+ },
+ {
+ "address": "1223 N Kenmore Ave",
+ "city": "Los Angeles",
+ "price": 2995000,
+ "type": "Multifamily",
+ "lat": 34.093871747796,
+ "lng": -118.297446238393
+ },
+ {
+ "address": "3204 Palmer Drive",
+ "city": "Los Angeles",
+ "price": 1295000,
+ "type": "Multifamily",
+ "lat": 34.13382383873,
+ "lng": -118.233679584893
+ },
+ {
+ "address": "13525 Kornblum Avenue",
+ "city": "Hawthorne",
+ "price": 1889000,
+ "type": "Multifamily",
+ "lat": 33.908861955003,
+ "lng": -118.337377797579
+ },
+ {
+ "address": "6513 Middleton",
+ "city": "Huntington Park",
+ "price": 925000,
+ "type": "Multifamily",
+ "lat": 33.980305488539,
+ "lng": -118.22903565441
+ },
+ {
+ "address": "4860 Bell",
+ "city": "Bell",
+ "price": 879999,
+ "type": "Multifamily",
+ "lat": 33.973385502608,
+ "lng": -118.17920601716
+ },
+ {
+ "address": "15057 Paddock",
+ "city": "Sylmar",
+ "price": 1329000,
+ "type": "Multifamily",
+ "lat": 34.296041651591,
+ "lng": -118.460530596693
+ },
+ {
+ "address": "2012 S Garfield Avenue",
+ "city": "Monterey Park",
+ "price": 1760000,
+ "type": "Multifamily",
+ "lat": 34.04082726539,
+ "lng": -118.129087335025
+ },
+ {
+ "address": "1063 Justin Ave",
+ "city": "Glendale",
+ "price": 5400000,
+ "type": "Multifamily",
+ "lat": 34.168989304943,
+ "lng": -118.288617367984
+ },
+ {
+ "address": "1180 Myra Avenue",
+ "city": "Los Angeles",
+ "price": 1695000,
+ "type": "Multifamily",
+ "lat": 34.093908422153,
+ "lng": -118.281675043883
+ },
+ {
+ "address": "473 E. 55th Street",
+ "city": "Long Beach",
+ "price": 2925000,
+ "type": "Multifamily",
+ "lat": 33.856022440586,
+ "lng": -118.18663153133
+ },
+ {
+ "address": "1629 E Maple",
+ "city": "El Segundo",
+ "price": 2799000,
+ "type": "Multifamily",
+ "lat": 33.927064462214,
+ "lng": -118.398137305752
+ },
+ {
+ "address": "518 E Washington",
+ "city": "Pasadena",
+ "price": 3100000,
+ "type": "Multifamily",
+ "lat": 34.168871299715,
+ "lng": -118.139792529651
+ },
+ {
+ "address": "7306-7312 Neo Street",
+ "city": "Downey",
+ "price": 5125000,
+ "type": "Multifamily",
+ "lat": 33.94598443895,
+ "lng": -118.15289101858
+ },
+ {
+ "address": "14812 Paramount Blvd",
+ "city": "Paramount",
+ "price": 1199000,
+ "type": "Retail",
+ "lat": 33.898997586059,
+ "lng": -118.159991810021
+ },
+ {
+ "address": "5110 BAKMAN AVE",
+ "city": "NORTH HOLLYWOOD",
+ "price": 33950000,
+ "type": "Multifamily",
+ "lat": 34.16321946553,
+ "lng": -118.377324103428
+ },
+ {
+ "address": "20518 Raymond Avenue",
+ "city": "Torrance",
+ "price": 899000,
+ "type": "Multifamily",
+ "lat": 33.844331875746,
+ "lng": -118.29619464118
+ },
+ {
+ "address": "5326 Lorna Street",
+ "city": "Torrance",
+ "price": 3700000,
+ "type": "Multifamily",
+ "lat": 33.838943189024,
+ "lng": -118.370614823852
+ },
+ {
+ "address": "2363 Torrance",
+ "city": "Torrance",
+ "price": 1700000,
+ "type": "Multifamily",
+ "lat": 33.836432480818,
+ "lng": -118.325371550841
+ },
+ {
+ "address": "228 Rosemont Ave",
+ "city": "Los Angeles",
+ "price": 1200000,
+ "type": "Multifamily",
+ "lat": 34.06953739908,
+ "lng": -118.271597524711
+ },
+ {
+ "address": "15131 Polk Street",
+ "city": "Sylmar",
+ "price": 949000,
+ "type": "Multifamily",
+ "lat": 34.296728685212,
+ "lng": -118.462020887753
+ },
+ {
+ "address": "3644 Almeria Street",
+ "city": "San Pedro",
+ "price": 1749000,
+ "type": "Multifamily",
+ "lat": 33.714110229092,
+ "lng": -118.302212605086
+ },
+ {
+ "address": "405 -411 N Euclid Ave",
+ "city": "Pasadena",
+ "price": 5950000,
+ "type": "Multifamily",
+ "lat": 34.153417508775,
+ "lng": -118.14306202251
+ },
+ {
+ "address": "5032 Denny Avenue",
+ "city": "North Hollywood",
+ "price": 1880000,
+ "type": "Multifamily",
+ "lat": 34.161902214065,
+ "lng": -118.364729591585
+ },
+ {
+ "address": "13461 Beach Ave",
+ "city": "Marina Del Rey",
+ "price": 4500000,
+ "type": "Multifamily",
+ "lat": 33.990646890667,
+ "lng": -118.445698216749
+ },
+ {
+ "address": "1136 W 10th",
+ "city": "San Pedro",
+ "price": 1349000,
+ "type": "Multifamily",
+ "lat": 33.735232858286,
+ "lng": -118.301989115222
+ },
+ {
+ "address": "1459 S Wooster St",
+ "city": "Los Angeles",
+ "price": 1700000,
+ "type": "Multifamily",
+ "lat": 34.052556376006,
+ "lng": -118.382955555764
+ },
+ {
+ "address": "10516 Arrington Avenue",
+ "city": "Downey",
+ "price": 2390000,
+ "type": "Multifamily",
+ "lat": 33.941741233282,
+ "lng": -118.119293504971
+ },
+ {
+ "address": "4212 La Rica",
+ "city": "Baldwin Park",
+ "price": 5500000,
+ "type": "Multifamily",
+ "lat": 34.088867836858,
+ "lng": -117.966910951493
+ },
+ {
+ "address": "4253 South Centinela Avenue",
+ "city": "Los Angeles",
+ "price": 1500000,
+ "type": "Multifamily",
+ "lat": 33.995365212519,
+ "lng": -118.426564271581
+ },
+ {
+ "address": "24047 Arch Street",
+ "city": "Newhall",
+ "price": 714900,
+ "type": "Multifamily",
+ "lat": 34.37567848403,
+ "lng": -118.522401570979
+ },
+ {
+ "address": "11451 W Victory Boulevard",
+ "city": "North Hollywood",
+ "price": 3199000,
+ "type": "Multifamily",
+ "lat": 34.186741432717,
+ "lng": -118.381025590388
+ },
+ {
+ "address": "350 W Wilson",
+ "city": "Glendale",
+ "price": 3795000,
+ "type": "Multifamily",
+ "lat": 34.147966054438,
+ "lng": -118.259645454322
+ },
+ {
+ "address": "8480 Virginia",
+ "city": "South Gate",
+ "price": 899000,
+ "type": "Multifamily",
+ "lat": 33.958278534626,
+ "lng": -118.20668710932
+ },
+ {
+ "address": "9234 Elizabeth Avenue",
+ "city": "South Gate",
+ "price": 799000,
+ "type": "Multifamily",
+ "lat": 33.95101475371,
+ "lng": -118.208684305097
+ },
+ {
+ "address": "547 E Woodbury Road",
+ "city": "Altadena",
+ "price": 1245000,
+ "type": "Multifamily",
+ "lat": 34.180295435449,
+ "lng": -118.139227373
+ },
+ {
+ "address": "1427 Euclid St",
+ "city": "Santa Monica",
+ "price": 2275000,
+ "type": "Multifamily",
+ "lat": 34.02298599753,
+ "lng": -118.486139105156
+ },
+ {
+ "address": "5759 Hazeltine",
+ "city": "Van Nuys",
+ "price": 928000,
+ "type": "Multifamily",
+ "lat": 34.174996577161,
+ "lng": -118.440043523078
+ },
+ {
+ "address": "14253 Gilmore Street",
+ "city": "Van Nuys",
+ "price": 2645000,
+ "type": "Multifamily",
+ "lat": 34.187713436173,
+ "lng": -118.443319588796
+ },
+ {
+ "address": "2761 W Ave F",
+ "city": "Lancaster",
+ "price": 1475000,
+ "type": "Multifamily",
+ "lat": 34.747803026989,
+ "lng": -118.18301107632
+ },
+ {
+ "address": "2804 W 85th",
+ "city": "Inglewood",
+ "price": 1170000,
+ "type": "Multifamily",
+ "lat": 33.960798862888,
+ "lng": -118.323249136235
+ },
+ {
+ "address": "9416 Broadway",
+ "city": "Temple City",
+ "price": 1350000,
+ "type": "Multifamily",
+ "lat": 34.099701282689,
+ "lng": -118.064596493232
+ },
+ {
+ "address": "14715 Chadron Ave.",
+ "city": "Gardena",
+ "price": 8150000,
+ "type": "Multifamily",
+ "lat": 33.898109881635,
+ "lng": -118.328713339619
+ },
+ {
+ "address": "35 Arcadia Terrace",
+ "city": "Santa Monica",
+ "price": 4500000,
+ "type": "Multifamily",
+ "lat": 34.009701963752,
+ "lng": -118.493844216398
+ },
+ {
+ "address": "195 S Wilson Avenue",
+ "city": "Pasadena",
+ "price": 12500000,
+ "type": "Multifamily",
+ "lat": 34.142403534931,
+ "lng": -118.128085429782
+ },
+ {
+ "address": "415 S 6th",
+ "city": "Montebello",
+ "price": 1099000,
+ "type": "Multifamily",
+ "lat": 34.00458337399,
+ "lng": -118.108512686706
+ },
+ {
+ "address": "110 S Eucalyptus Ave",
+ "city": "Inglewood",
+ "price": 2650000,
+ "type": "Multifamily",
+ "lat": 33.962730526077,
+ "lng": -118.359456159522
+ },
+ {
+ "address": "124 Palos Verdes Boulevard",
+ "city": "Redondo Beach",
+ "price": 7300000,
+ "type": "Multifamily",
+ "lat": 33.816968642346,
+ "lng": -118.384187205369
+ },
+ {
+ "address": "637 W 11th",
+ "city": "San Pedro",
+ "price": 1398880,
+ "type": "Multifamily",
+ "lat": 33.734173267621,
+ "lng": -118.290970946992
+ },
+ {
+ "address": "1202 E E 76th St",
+ "city": "Los Angeles",
+ "price": 693900,
+ "type": "Multifamily",
+ "lat": 33.971456426903,
+ "lng": -118.253882897642
+ },
+ {
+ "address": "210 W Lime Avenue",
+ "city": "Monrovia",
+ "price": 1998000,
+ "type": "Multifamily",
+ "lat": 34.147984086232,
+ "lng": -118.003423267951
+ },
+ {
+ "address": "5431 Cartwright",
+ "city": "North Hollywood",
+ "price": 1125000,
+ "type": "Multifamily",
+ "lat": 34.169118168403,
+ "lng": -118.363679986975
+ },
+ {
+ "address": "2815 Orchard Place",
+ "city": "South Gate",
+ "price": 1800000,
+ "type": "Multifamily",
+ "lat": 33.95788351927,
+ "lng": -118.221332022567
+ },
+ {
+ "address": "4701 Saturn St",
+ "city": "Los Angeles",
+ "price": 4199999,
+ "type": "Multifamily",
+ "lat": 34.043638010414,
+ "lng": -118.339988311603
+ },
+ {
+ "address": "13522 Penn",
+ "city": "Whittier",
+ "price": 900000,
+ "type": "Multifamily",
+ "lat": 33.975373383928,
+ "lng": -118.031592338694
+ },
+ {
+ "address": "440 Raymond Avenue",
+ "city": "Santa Monica",
+ "price": 7750000,
+ "type": "Multifamily",
+ "lat": 34.002423658085,
+ "lng": -118.478536931542
+ },
+ {
+ "address": "424 W Arbor Vitae Street",
+ "city": "Inglewood",
+ "price": 750000,
+ "type": "Multifamily",
+ "lat": 33.952642428688,
+ "lng": -118.362043561119
+ },
+ {
+ "address": "1825 STANLEY AVE",
+ "city": "SIGNAL HILL",
+ "price": 2400000,
+ "type": "Multifamily",
+ "lat": 33.790311584961,
+ "lng": -118.162255047389
+ },
+ {
+ "address": "3270 TWEEDY BLVD",
+ "city": "SOUTH GATE",
+ "price": 3450000,
+ "type": "Retail",
+ "lat": 33.944974767168,
+ "lng": -118.212994319759
+ },
+ {
+ "address": "21512-21516 Norwalk Blvd",
+ "city": "Hawaiian Gardens",
+ "price": 1050000,
+ "type": "Retail",
+ "lat": 33.834001927783,
+ "lng": -118.071921459288
+ },
+ {
+ "address": "5138 W 135th",
+ "city": "Hawthorne",
+ "price": 1200000,
+ "type": "Multifamily",
+ "lat": 33.909453790503,
+ "lng": -118.368166042353
+ },
+ {
+ "address": "2210 W 229th",
+ "city": "Torrance",
+ "price": 1229000,
+ "type": "Multifamily",
+ "lat": 33.818490878466,
+ "lng": -118.320247014355
+ },
+ {
+ "address": "1491 Atlantic Avenue",
+ "city": "Long Beach",
+ "price": 2850000,
+ "type": "Multifamily",
+ "lat": 33.785545339374,
+ "lng": -118.185095781139
+ },
+ {
+ "address": "161 Alice St",
+ "city": "Arcadia",
+ "price": 1330000,
+ "type": "Multifamily",
+ "lat": 34.131458275853,
+ "lng": -118.026277277329
+ },
+ {
+ "address": "4057 Baywood",
+ "city": "Los Angeles",
+ "price": 1000000,
+ "type": "Multifamily",
+ "lat": 34.135286386181,
+ "lng": -118.269617851103
+ },
+ {
+ "address": "908-- 910 Victoria Avenue",
+ "city": "Venice",
+ "price": 1799000,
+ "type": "Multifamily",
+ "lat": 33.993921338841,
+ "lng": -118.455572111887
+ },
+ {
+ "address": "579 W 14th",
+ "city": "San Pedro",
+ "price": 2495000,
+ "type": "Multifamily",
+ "lat": 33.731449884971,
+ "lng": -118.289662638286
+ },
+ {
+ "address": "4202 Lexington Ave",
+ "city": "Los Angeles",
+ "price": 1400000,
+ "type": "Multifamily",
+ "lat": 34.092769024017,
+ "lng": -118.282613850653
+ },
+ {
+ "address": "9614 Alondra",
+ "city": "Bellflower",
+ "price": 2500000,
+ "type": "Retail",
+ "lat": 33.889293460127,
+ "lng": -118.130170808843
+ },
+ {
+ "address": "534 S Coronado St",
+ "city": "Los Angeles",
+ "price": 2375000,
+ "type": "Multifamily",
+ "lat": 34.063246252121,
+ "lng": -118.279488144112
+ },
+ {
+ "address": "1932 E Washington Boulevard",
+ "city": "Pasadena",
+ "price": 1395000,
+ "type": "Multifamily",
+ "lat": 34.169085827831,
+ "lng": -118.110713125845
+ },
+ {
+ "address": "4731-4733 Baldwin Park Blvd",
+ "city": "Baldwin Park",
+ "price": 1695000,
+ "type": "Multifamily",
+ "lat": 34.098019117037,
+ "lng": -117.964974131947
+ },
+ {
+ "address": "14218 Sylvan Street",
+ "city": "Sherman Oaks",
+ "price": 2298888,
+ "type": "Multifamily",
+ "lat": 34.184601845073,
+ "lng": -118.442569521379
+ },
+ {
+ "address": "936 North Curson Avenue",
+ "city": "West Hollywood",
+ "price": 2299000,
+ "type": "Multifamily",
+ "lat": 34.08774600562,
+ "lng": -118.355246608844
+ },
+ {
+ "address": "21306 E Arrow Hwy",
+ "city": "Covina",
+ "price": 4690000,
+ "type": "Multifamily",
+ "lat": 34.106548395389,
+ "lng": -117.840146860706
+ },
+ {
+ "address": "4437 Phelan Avenue",
+ "city": "Baldwin Park",
+ "price": 1348800,
+ "type": "Multifamily",
+ "lat": 34.092912386374,
+ "lng": -117.955440937985
+ }
+ ],
+ "demographics": [
+ {
+ "city": "Los Angeles",
+ "rent": 2426,
+ "income": 69268,
+ "renter_pct": 88.6,
+ "home_value": 786000
+ },
+ {
+ "city": "Santa Monica",
+ "rent": 2239,
+ "income": 95139,
+ "renter_pct": 78.6,
+ "home_value": 1244400
+ },
+ {
+ "city": "Pasadena",
+ "rent": 2270,
+ "income": 87813,
+ "renter_pct": 84.8,
+ "home_value": 682300
+ },
+ {
+ "city": "Long Beach",
+ "rent": 1968,
+ "income": 74510,
+ "renter_pct": 79,
+ "home_value": 542600
+ },
+ {
+ "city": "Burbank",
+ "rent": 2397,
+ "income": 109953,
+ "renter_pct": 56.3,
+ "home_value": 1061200
+ },
+ {
+ "city": "Glendale",
+ "rent": 1938,
+ "income": 64564,
+ "renter_pct": 82.3,
+ "home_value": 800800
+ }
+ ]
+}
\ No newline at end of file
diff --git a/public/deal-score.js b/public/deal-score.js
new file mode 100644
index 0000000..459d94f
--- /dev/null
+++ b/public/deal-score.js
@@ -0,0 +1,112 @@
+// deal-score.js — transparent, weight-normalized 0-100 Deal Score for the LA County CRE screener.
+// Works in Node (require) and the browser (global DealScore). SINGLE SOURCE OF TRUTH so the
+// property cards, the map color-by-score ramp, and the deals dashboard all rank identically.
+//
+// Philosophy: synthesize the signals we ALREADY computed elsewhere into one "chase-this-first" number.
+// - Every sub-score is a labeled 0-100 mapping of one real signal.
+// - dealScore = Σ(sub × weight) / Σ(weight) over ONLY the components that are present.
+// Missing signals drop out and the remaining weights re-normalize → never NaN, never a free ride.
+// - Bonuses (assumable, FHA-warrantable) are upside nudges with small weight, applied the same way.
+// - We are honest: proxy/low-confidence sub-scores are labeled as such in the breakdown so the UI
+// can show WHY a deal scored what it did. This is a screen, not an appraisal.
+(function (root, factory) {
+ if (typeof module === 'object' && module.exports) module.exports = factory();
+ else root.DealScore = factory();
+})(typeof self !== 'undefined' ? self : this, function () {
+
+ const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
+ const fin = v => (typeof v === 'number' && isFinite(v)) ? v : null;
+ // linear map of x in [a,b] -> [0,100], clamped; guards a===b (div-by-zero) -> 50.
+ function ramp(x, a, b) { x = fin(x); if (x == null) return null; if (a === b) return 50; return clamp(100 * (x - a) / (b - a), 0, 100); }
+
+ // Component weights (relative; the formula re-normalizes over whatever is present).
+ const W = { rentRoi: 30, cap: 28, dscr: 22, assumable: 12, warrant: 8 };
+
+ // ---- sub-score mappings (each returns 0-100 or null when the signal is absent) ----
+
+ // Pro-forma gross rent yield. LA gross yields run ~5-10%; >18% is almost always a bad unit count.
+ // Clamp those outliers to low-confidence: cap the points at 60 AND halve the weight so a fishy
+ // listing can't top the board on a number we don't trust.
+ function rentRoiSub(grossYieldPro) {
+ const y = fin(grossYieldPro); if (y == null) return null;
+ if (y > 18) return { core: true, score: clamp(ramp(y, 4, 12), 0, 60), weight: W.rentRoi * 0.5, conf: 'low', label: 'Pro-forma rent yield (outlier — verify units)' };
+ return { core: true, score: ramp(y, 4, 12), weight: W.rentRoi, conf: 'proxy', label: 'Pro-forma rent yield' };
+ }
+
+ // Cap rate (commercial). 4% -> 0, 9% -> 100. Broker-stated unless verified.
+ function capSub(cap_rate, verified) {
+ const c = fin(cap_rate); if (c == null) return null;
+ return { core: true, score: ramp(c, 4, 9), weight: W.cap, conf: verified === true ? 'verified' : 'broker', label: verified === true ? 'Cap rate (verified)' : 'Cap rate (broker-stated)' };
+ }
+
+ // DSCR-readiness. Prefer the real leverage-math DSCR. When there's no in-place NOI but we have a
+ // rent estimate, derive a PROXY DSCR = est NOI vs the standard-loan debt service the caller passes.
+ // 1.0 -> 0, 1.5 -> 100 (1.25 = the bankable line ~ 50pts).
+ function dscrSub(dscr, proxyDscr) {
+ const real = fin(dscr);
+ if (real != null) return { core: true, score: ramp(real, 1.0, 1.5), weight: W.dscr, conf: 'derived', label: 'DSCR (from in-place cap)' };
+ const px = fin(proxyDscr);
+ if (px != null) return { core: true, score: ramp(px, 1.0, 1.5), weight: W.dscr * 0.7, conf: 'proxy', label: 'DSCR-readiness (rent-estimate proxy)' };
+ return null;
+ }
+
+ // Assumable FHA/VA bonus (heuristic, not title-verified). high > medium.
+ function assumableSub(assum) {
+ if (!assum || !assum.lk) return null;
+ const score = assum.lk === 'high' ? 100 : assum.lk === 'medium' ? 65 : null;
+ if (score == null) return null;
+ return { score, weight: W.assumable, conf: 'heuristic', label: 'Assumable FHA/VA (heuristic)' };
+ }
+
+ // FHA-warrantability bonus (condo only). Binary signal -> full credit when approved.
+ function warrantSub(fhaApproved) {
+ if (fhaApproved !== true) return null;
+ return { score: 100, weight: W.warrant, conf: 'signal', label: 'FHA-warrantable condo' };
+ }
+
+ // ---- main: assemble present components, weight-normalize, never NaN ----
+ // input: { grossYieldPro, cap_rate, verified, dscr, proxyDscr, assum, fhaApproved }
+ function compute(input) {
+ input = input || {};
+ const parts = [
+ rentRoiSub(input.grossYieldPro),
+ capSub(input.cap_rate, input.verified),
+ dscrSub(input.dscr, input.proxyDscr),
+ assumableSub(input.assum),
+ warrantSub(input.fhaApproved),
+ ].filter(p => p && fin(p.score) != null && fin(p.weight) != null && p.weight > 0);
+
+ if (!parts.length) return { score: null, parts: [], confidence: 'none' };
+
+ const wsum = parts.reduce((s, p) => s + p.weight, 0);
+ if (!(wsum > 0)) return { score: null, parts, confidence: 'none' };
+ const raw = parts.reduce((s, p) => s + p.score * p.weight, 0) / wsum;
+ const score = clamp(Math.round(raw), 0, 100);
+
+ // Confidence: how much of the FULL core weight budget is backed by present signals, and whether
+ // any core return signal (rent/cap/dscr) is present at all (bonuses alone = thin, untrustworthy).
+ const coreWeight = parts.filter(p => p.core).reduce((s, p) => s + p.weight, 0);
+ const coverage = coreWeight / (W.rentRoi + W.cap + W.dscr); // bonuses excluded from the denominator
+ const confidence = coreWeight <= 0 ? 'thin' : coverage >= 0.7 ? 'high' : coverage >= 0.35 ? 'med' : 'low';
+
+ return { score, parts, confidence, coverage: +coverage.toFixed(2) };
+ }
+
+ // Tier + color ramp for the map (sequential 0-100; distinct from the type + price palettes).
+ // 5 tiers so a legend key is readable. n/a -> grey.
+ const TIERS = [
+ { min: 80, c: '#16a34a', label: '80–100 · chase now' },
+ { min: 60, c: '#84cc16', label: '60–79 · strong' },
+ { min: 40, c: '#eab308', label: '40–59 · watch' },
+ { min: 20, c: '#f97316', label: '20–39 · weak' },
+ { min: 0, c: '#dc2626', label: '0–19 · pass' },
+ ];
+ const SCORE_NA = '#6b7280';
+ function scoreColor(score) {
+ const s = fin(score); if (s == null) return SCORE_NA;
+ for (const t of TIERS) if (s >= t.min) return t.c;
+ return SCORE_NA;
+ }
+
+ return { compute, scoreColor, TIERS, SCORE_NA, WEIGHTS: W, _ramp: ramp };
+});
diff --git a/public/portal.html b/public/portal.html
index d52c50d..df58e96 100644
--- a/public/portal.html
+++ b/public/portal.html
@@ -1,80 +1,445 @@
-<!doctype html>
-<html lang="en">
-<head>
-<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com · Deliverable</title>
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Growth Strategy</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400&family=Jost:wght@300;400;500&display=swap" rel="stylesheet">
+<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
+<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
+<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
+<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
+<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
+<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
+<script src="/portal/deal-score.js"></script>
<style>
- :root{--ink:#14110e;--paper:#f6f2ec;--gold:#a9884f;--line:#dcd3c5}
- *{box-sizing:border-box}
- body{margin:0;font-family:Georgia,serif;background:var(--paper);color:var(--ink)}
- nav{display:flex;justify-content:space-between;align-items:center;padding:16px 28px;background:#fff;border-bottom:1px solid var(--line);font-family:system-ui,sans-serif}
- nav .brand{letter-spacing:.06em}
- nav a{color:var(--gold);text-decoration:none;font-size:13px;letter-spacing:.1em;text-transform:uppercase;margin-left:18px}
- .hero{padding:56px 28px 34px;text-align:center}
- .hero .eyebrow{letter-spacing:.32em;text-transform:uppercase;font-size:11px;color:var(--gold);font-family:system-ui,sans-serif}
- .hero h1{font-weight:400;font-size:44px;margin:.2em 0}
- .hero p{font-style:italic;color:#6b6357;max-width:640px;margin:0 auto}
- section{max-width:1080px;margin:0 auto;padding:28px}
- h2{font-weight:400;font-size:26px;border-bottom:1px solid var(--line);padding-bottom:8px}
- .cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:18px;margin-top:18px}
- .vcard{background:#fff;border:1px solid var(--line);text-decoration:none;color:inherit;transition:.2s}
- .vcard:hover{box-shadow:0 16px 40px rgba(20,17,14,.1);transform:translateY(-2px)}
- .vcard .swatch{height:120px;background:var(--gold)}
- .vcard .body{padding:14px 16px}
- .vcard b{font-family:system-ui,sans-serif;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:#9a9082}
- .list{font-family:system-ui,sans-serif;font-size:15px}
- .list li{margin:8px 0}
- .badge{display:inline-block;font-family:system-ui,sans-serif;font-size:11px;background:#faf7f1;border:1px solid var(--gold);color:var(--gold);padding:2px 9px;border-radius:20px;margin-left:8px}
-</style>
-</head>
-<body>
- <nav>
- <div class="brand" id="brand">RENTV.com</div>
- <div><a href="/portal">Deliverable</a><a href="/admin">Growth & Social</a><a href="/">Sign-in</a></div>
- </nav>
-
- <div class="hero">
- <div class="eyebrow">Consulting Deliverable</div>
- <h1 id="name">RENTV.com</h1>
- <p id="tag">Commercial real estate news, deals & conferences.</p>
- </div>
-
- <section>
- <h2>Website concept directions <span class="badge" id="vcount">—</span></h2>
- <p class="list" style="color:#6b6357">Several high-end redesign concepts of your new site — pick the direction that feels right. (Generate/refresh with <code>node build.mjs</code>.)</p>
- <div class="cards" id="versions"></div>
- </section>
-
- <section>
- <h2>Priority growth moves</h2>
- <ul class="list" id="sugs"></ul>
- </section>
-
- <section>
- <h2>Integrated social snapshot</h2>
- <ul class="list" id="social"></ul>
- </section>
+:root{--bg:#0c1016;--panel:#121722;--ink:#eef1f6;--gold:#c8a15a;--line:rgba(200,161,90,.22);--dim:rgba(238,241,246,.66)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Jost',system-ui,sans-serif;font-size:19px;line-height:1.75;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Cormorant Garamond',Georgia,serif}a{color:inherit;text-decoration:none}
+.bar{position:fixed;top:0;left:0;right:0;z-index:40;display:flex;align-items:center;justify-content:space-between;padding:18px 34px;background:linear-gradient(180deg,rgba(12,16,22,.94),rgba(12,16,22,0));backdrop-filter:blur(5px)}
+.brand{font-family:'Cormorant Garamond',serif;font-size:20px;letter-spacing:.28em;text-transform:uppercase}.brand span{color:var(--gold)}
+.brand small{display:block;font-family:'Jost';font-size:9px;letter-spacing:.32em;color:var(--gold);margin-top:2px}
+.burger{width:30px;height:20px;position:relative;cursor:pointer;background:none;border:0}.burger span{position:absolute;left:0;right:0;height:1.6px;background:var(--ink);transition:.35s}
+.burger span:nth-child(1){top:1px}.burger span:nth-child(2){top:9px}.burger span:nth-child(3){top:17px}
+body.nav .burger span:nth-child(1){transform:translateY(8px) rotate(45deg)}body.nav .burger span:nth-child(2){opacity:0}body.nav .burger span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}
+.menu{position:fixed;top:0;right:0;bottom:0;width:min(420px,86vw);z-index:39;background:var(--panel);border-left:1px solid var(--line);transform:translateX(100%);transition:.42s cubic-bezier(.6,0,.2,1);padding:92px 40px;overflow:auto}
+body.nav .menu{transform:none}body.nav .scrim{opacity:1;pointer-events:auto}
+.scrim{position:fixed;inset:0;z-index:38;background:rgba(0,0,0,.5);opacity:0;pointer-events:none;transition:.42s}
+.menu .mh{font-family:'Cormorant Garamond',serif;font-size:13px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-bottom:18px}
+.menu a{display:block;font-family:'Cormorant Garamond',serif;font-size:25px;padding:10px 0;border-bottom:1px solid var(--line);opacity:.85;transition:.25s}
+.menu a:hover{opacity:1;color:var(--gold);padding-left:8px}
+.menu .minfo{margin-top:28px;border-top:1px solid var(--line);padding-top:20px}.menu .minfo p{font-size:13px;line-height:1.7;color:var(--dim);border:0;padding:2px 0}.menu .minfo a{display:inline;font-size:13px;color:var(--gold);border:0;padding:0}
+.hero{min-height:96vh;position:relative;display:flex;flex-direction:column;justify-content:center;padding:0 clamp(24px,7vw,120px);overflow:hidden}
+.slides{position:absolute;inset:0;z-index:0}
+.slide{position:absolute;inset:0;background-size:cover;background-position:center;opacity:0;transform:scale(1.06);transition:opacity 1.4s ease,transform 7s ease}
+.slide.on{opacity:1;transform:scale(1)}
+.hero:after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(12,16,22,.94),rgba(12,16,22,.6) 55%,rgba(12,16,22,.35));z-index:1}
+.hero .in{position:relative;z-index:2;max-width:920px}
+.kick{font-size:12px;letter-spacing:.4em;text-transform:uppercase;color:var(--gold);margin-bottom:22px}
+.hero h1{font-family:'Cormorant Garamond',serif;font-weight:400;font-size:clamp(44px,7.5vw,104px);line-height:1}.hero h1 span{color:var(--gold)}
+.hero p{max-width:62ch;margin-top:24px;font-size:18px;color:var(--dim)}
+.metrics{display:flex;flex-wrap:wrap;gap:46px;margin-top:46px}
+.metrics .v{font-family:'Cormorant Garamond',serif;font-size:40px;color:var(--gold);line-height:1}
+.metrics .l{font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);margin-top:6px}
+section{padding:0 clamp(24px,7vw,120px);border-top:1px solid var(--line);scroll-margin-top:60px}
+.accbar{display:flex;gap:12px;justify-content:flex-end;padding:14px clamp(24px,7vw,120px);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
+.accbar button{background:none;border:1px solid var(--line);color:var(--gold);font-family:'Jost';font-size:11px;letter-spacing:.18em;text-transform:uppercase;padding:9px 18px;cursor:pointer}.accbar button:hover{background:var(--gold);color:var(--bg)}
+.acchead{width:100%;text-align:left;background:none;border:0;cursor:pointer;display:flex;gap:22px;padding:36px 0;color:var(--ink)}
+.acchead .htext{flex:1}.eyebrow{font-size:12.5px;letter-spacing:.36em;text-transform:uppercase;color:var(--gold);margin-bottom:12px}
+h2{font-family:'Cormorant Garamond',serif;font-weight:400;font-size:clamp(30px,4.4vw,54px);line-height:1.05;max-width:20ch}
+.acchead .chev{font-family:'Cormorant Garamond',serif;font-size:36px;color:var(--gold);transition:.3s;line-height:.7}
+section.open .chev{transform:rotate(45deg)}.acchead:hover h2{color:var(--gold);transition:.25s}
+.accbody{display:none;padding-bottom:60px}section.open .accbody{display:block;animation:af .45s ease}
+@keyframes af{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
+.lead2{max-width:70ch;color:var(--dim);margin-top:6px;font-size:20px}
+table{width:100%;border-collapse:collapse;margin-top:34px;font-size:16px}th,td{text-align:left;padding:16px 14px;border-bottom:1px solid var(--line);vertical-align:top;font-size:15.5px}
+th{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);font-weight:400}
+tr.you{background:rgba(200,161,90,.08)}tr.you td:first-child{color:var(--gold)}.stars{color:var(--gold);letter-spacing:2px}
+td.mo{font-family:'Cormorant Garamond',serif;color:var(--gold);font-size:18px;width:60px}
+.chartwrap{margin-top:34px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:22px 20px 14px;position:relative;height:340px}
+.chartwrap.tall{height:400px}.chartwrap .ct{font-family:'Cormorant Garamond',serif;font-size:15px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);margin-bottom:10px}
+.cards2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1px;background:var(--line);margin-top:34px}
+.cards2 .c{background:var(--bg);padding:32px 28px}.cards2 .c h3{font-family:'Cormorant Garamond',serif;font-size:22px;color:var(--gold);margin-bottom:10px}.cards2 .c p{color:var(--dim);font-size:16px;line-height:1.6}
+.flag{color:#e8a0a0}.good{color:#9fd6b0}
+.flagbox{display:flex;gap:22px;margin-top:34px;padding:30px 32px;border:1px solid var(--gold);background:rgba(200,161,90,.07)}
+.flagbox .i{font-size:30px;color:var(--gold)}.flagbox h3{font-family:'Cormorant Garamond',serif;font-size:24px;color:var(--gold);margin-bottom:10px}.flagbox p{color:var(--ink);opacity:.92;font-size:16px;line-height:1.6}
+.vgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-top:20px}
+.vtile{background:var(--vb);border:1px solid var(--line);padding:28px 26px;transition:.3s;position:relative}.vtile:hover{transform:translateY(-5px);box-shadow:0 22px 60px rgba(0,0,0,.55)}
+.vswatch{display:flex;height:36px;border-radius:3px;overflow:hidden;margin-bottom:20px}.vswatch span{flex:1}
+.vname{font-family:'Cormorant Garamond',serif;font-size:26px;color:var(--vi)}.vmodel{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--vg);margin-top:2px}
+.vmood{color:var(--vi);opacity:.72;font-size:13px;margin-top:10px;min-height:38px}.vopen{margin-top:16px;font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--vg)}
+.pcard{display:flex;gap:22px;padding:24px 0;border-bottom:1px solid var(--line)}.pnum{font-family:'Cormorant Garamond',serif;font-size:30px;color:var(--gold);min-width:44px}.pcard h4{font-family:'Cormorant Garamond',serif;font-size:21px;margin-bottom:6px}.pcard p{color:var(--dim);font-size:16px;line-height:1.6}
+.heybox{margin-top:34px;display:grid;grid-template-columns:minmax(260px,360px) 1fr;gap:1px;background:var(--line);border:1px solid var(--line)}.heybox>div{background:var(--bg)}
+.heybox .film{background:#000;position:relative;aspect-ratio:9/16;max-height:520px}.heybox .film video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
+.heybox .film .ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--gold);font-size:11px;letter-spacing:.24em;text-transform:uppercase;background:linear-gradient(160deg,#123048,#0c1016);text-align:center;padding:20px}
+.heybox .copy{padding:38px 36px}.heybox .copy h3{font-family:'Cormorant Garamond',serif;font-size:27px;margin-bottom:14px}.heybox .copy p{color:var(--dim);font-size:15px}
+.heybox .spec{margin-top:20px;display:flex;flex-wrap:wrap;gap:10px}.heybox .spec span{font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid var(--line);padding:6px 12px;color:var(--gold)}
+.films5{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-top:34px}
+.f5{border:1px solid var(--line);background:var(--panel)}.f5 .fv{position:relative;aspect-ratio:9/16;background:#000;overflow:hidden}.f5 .fv video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
+.f5 .fph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--gold);font-size:11px;letter-spacing:.2em;text-transform:uppercase;background:linear-gradient(160deg,#123048,#0c1016);opacity:.9}
+.f5 .ft{font-family:'Cormorant Garamond',serif;font-size:19px;color:var(--gold);padding:14px 16px 4px}.f5 .fa{font-size:12.5px;color:var(--dim);padding:0 16px 16px}
+.sugg{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1px;background:var(--line);margin-top:20px}.sugg .s{background:var(--bg);padding:26px 24px}.sugg .s .p{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold)}.sugg .s h4{font-family:'Cormorant Garamond',serif;font-size:20px;margin:8px 0}.sugg .s p{font-size:15px;color:var(--dim);line-height:1.55}
+.road{list-style:none;margin-top:20px}.road li{padding:22px 0;border-bottom:1px solid var(--line);display:flex;gap:26px}.road .w{font-family:'Cormorant Garamond',serif;color:var(--gold);font-size:15px;letter-spacing:.2em;text-transform:uppercase;min-width:130px}.road .d{color:var(--dim)}
+.rv{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}.rv.in{opacity:1;transform:none}
+/* Live Deal Desk (real CRCP data) */
+#dealmap{height:440px;border:1px solid var(--line);border-radius:8px;margin-top:34px;background:#0a0d12}
+.leaflet-container{background:#0a0d12;font-family:'Jost',sans-serif}
+.leaflet-popup-content-wrapper{background:var(--panel);color:var(--ink);border:1px solid var(--line)}
+.leaflet-popup-tip{background:var(--panel)}
+.dealgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:30px}
+.deal{display:flex;gap:14px;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px;transition:.25s}
+.deal:hover{transform:translateY(-3px);box-shadow:0 14px 40px rgba(0,0,0,.4)}
+.dscore{min-width:52px;height:52px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-family:'Cormorant Garamond',serif;font-size:24px;color:#fff;background:#555}
+.daddr{font-weight:500;font-size:15px;line-height:1.3}
+.dcity{font-size:12.5px;color:var(--dim);margin-top:2px}
+.dnums{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
+.dnums span{font-size:11px;letter-spacing:.06em;border:1px solid var(--line);color:var(--gold);padding:3px 8px;border-radius:3px}
+footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color:var(--dim);font-size:12px;letter-spacing:.14em;text-transform:uppercase;display:flex;justify-content:space-between;flex-wrap:wrap;gap:20px}
+@media(max-width:640px){.heybox{grid-template-columns:1fr}.metrics{gap:26px}}
+</style></head><body>
+<header class="bar"><a class="brand" href="#">REN<span>TV</span><small>Growth Strategy · 2026</small></a><button class="burger" onclick="document.body.classList.toggle('nav')" aria-label="Menu"><span></span><span></span><span></span></button></header>
+<div class="scrim" onclick="document.body.classList.remove('nav')"></div>
+<nav class="menu" onclick="if(event.target.tagName==='A')document.body.classList.remove('nav')">
+ <div class="mh">Contents</div><a href="#summary">Executive Summary</a><a href="#reputation">Reputation & Authority</a><a href="#competitors">Competitors</a><a href="#advertising">Where to Advertise</a><a href="#timing">Timing & Cadence</a><a href="#audit">Website Audit</a><a href="#social">Social Media Audit</a><a href="#suggested">Suggested New Websites</a><a href="#partners">Unlikely Partners</a><a href="#revenue">Unlikely Revenue</a><a href="#videos">Video + Brand Films</a><a href="#dealdesk">Live Deal Desk (demo)</a><a href="#roadmap">90-Day Roadmap</a>
+ <div class="minfo"><div class="mh">RENTV.com</div><p>Los Angeles · Western U.S. · Est. 1998</p><p><a href="tel:4244194021">424-419-4021</a> · <a href="mailto:rentadmin@rentv.com">rentadmin@rentv.com</a></p><p><a href="https://rentv.com" target="_blank" rel="noopener">rentv.com ↗</a> · <a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn ↗</a></p></div>
+</nav>
+
+<div class="hero" id="summary">
+ <div class="slides"><div class="slide on" style="background-image:url('https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40')"></div><div class="slide" style="background-image:url('https://images.unsplash.com/photo-1449824913935-59a10b8d2000?auto=format&fit=crop&w=1920&q=68&sat=-40')"></div><div class="slide" style="background-image:url('https://images.unsplash.com/photo-1460472178825-e5240623afd5?auto=format&fit=crop&w=1920&q=68&sat=-40')"></div><div class="slide" style="background-image:url('https://images.unsplash.com/photo-1515263487990-61b07816b324?auto=format&fit=crop&w=1920&q=68&sat=-40')"></div><div class="slide" style="background-image:url('https://images.unsplash.com/photo-1554469384-e58fac16e23a?auto=format&fit=crop&w=1920&q=68&sat=-40')"></div></div>
+ <div class="in">
+ <div class="kick">Los Angeles · Western U.S. · Confidential strategy brief</div>
+ <h1 class="disp">REN<span>TV</span>.com</h1>
+ <p>A 25-year commercial-real-estate news brand with real regional authority and a live conference franchise — running on a dated, pre-mobile website with dormant social and zero paid distribution. This brief maps the growth and exactly when to move.</p>
+ <div class="metrics">
+ <div class="m"><div class="v">1998</div><div class="l">Founded · CRE authority</div></div>
+ <div class="m"><div class="v" data-c="818">0</div><div class="l">LinkedIn followers (dormant)</div></div>
+ <div class="m"><div class="v">$0</div><div class="l">Current paid ad spend</div></div>
+ <div class="m"><div class="v">Western U.S.</div><div class="l">Coverage footprint</div></div>
+ </div>
+ </div>
+</div>
+
+<div class="accbar"><button id="xall">Expand all</button><button id="call">Collapse all</button></div>
+
+<section id="reputation"><div class="eyebrow">01 · Reputation & Authority</div><h2 class="disp">A trusted name — under-leveraged.</h2><div class="accbody">
+ <p class="lead2">RENTV has covered Western-U.S. commercial real estate since <b>1998</b> and runs the RENTV Conferences franchise — that's two-plus decades of brand equity and a live events audience most competitors would pay dearly for. The gap isn't credibility; it's <b>distribution and modernization</b>.</p>
+ <div class="cards2"><div class="c"><h3>Strengths</h3><p class="good">25-year archive & authority · a real conferences business · established broker/investor readership · deep Western-U.S. regional focus.</p></div><div class="c"><h3>Watch-outs</h3><p class="flag">Dated pre-mobile site · social dormant & unlinked · no newsletter capture visible · no paid distribution · younger CRE pros discover news elsewhere.</p></div><div class="c"><h3>Action</h3><p>Modernize the site, turn on a daily newsletter, activate LinkedIn — convert 25 years of authority into owned audience & recurring revenue.</p></div></div>
+</div></section>
+
+<section id="competitors"><div class="eyebrow">02 · Competitive Landscape</div><h2 class="disp">The regional authority vs. the national machines.</h2><div class="accbody">
+ <p class="lead2">RENTV's edge is regional depth + events. The threats are national newsletter/data machines (Bisnow, CoStar) with huge email reach and modern product.</p>
+ <div class="chartwrap"><div class="ct">Reach vs. digital modernization — RENTV vs. the field</div><canvas id="compChart"></canvas></div>
+ <table><thead><tr><th>Outlet</th><th>Focus</th><th>Footprint</th><th>Model</th><th>Read</th></tr></thead><tbody><tr class="you"><td>RENTV.com (you)</td><td>CRE news · deals · conferences</td><td>Western U.S.</td><td>Since 1998</td><td>Deep regional authority + a live events franchise — on a dated site with dormant social</td></tr><tr class=""><td>Bisnow</td><td>News + events, national</td><td>National</td><td>Newsletter-first</td><td>The model to study: free newsletters → events → sponsorship. Massive email reach</td></tr><tr class=""><td>The Real Deal</td><td>CRE news, bold brand</td><td>NY / national</td><td>Aggressive digital</td><td>Strong brand, paywall + events, heavy social + video</td></tr><tr class=""><td>Commercial Observer</td><td>Editorial CRE</td><td>NY / national</td><td>Premium editorial</td><td>Long-form authority, events, print heritage</td></tr><tr class=""><td>GlobeSt (ALM)</td><td>News + data</td><td>National</td><td>Utility / data</td><td>Broad coverage, data tools, conference network</td></tr><tr class=""><td>CoStar News</td><td>Data-backed news</td><td>National</td><td>Authority / data</td><td>Owns the data layer; news drives the CoStar/LoopNet funnel</td></tr></tbody></table>
+ <p class="lead2"><b>Takeaway:</b> don't out-scale the nationals — out-<i>local</i> them. Own Western-U.S. deal coverage + events, and copy Bisnow's newsletter→events→sponsorship flywheel at regional scale.</p>
+</div></section>
+
+<section id="advertising"><div class="eyebrow">03 · Where to Advertise & Grow</div><h2 class="disp">Build the owned audience first.</h2><div class="accbody">
+ <p class="lead2">Ranked by ROI for a regional CRE-news brand. The pattern: <b>newsletter + LinkedIn</b> (owned + B2B) first, then search + sponsorship.</p>
+ <div class="chartwrap"><div class="ct">Channel priority — relative ROI for a CRE-news brand</div><canvas id="adChart"></canvas></div>
+ <table><thead><tr><th>Channel</th><th>Best for</th><th>Priority</th><th>Why / play</th></tr></thead><tbody><tr><td><b>LinkedIn (primary)</b></td><td>B2B CRE audience</td><td class="stars">★★★★★</td><td>The CRE audience lives here. Your company page has 818 followers and posts dormant — post daily deal coverage, have staff reshare, run "CRE news" thought-leadership ads.</td></tr><tr><td><b>Email newsletter</b></td><td>Owned audience</td><td class="stars">★★★★★</td><td>Bisnow's entire empire is newsletters → events → sponsorship. A free daily/weekly "RENTV Daily" is the single highest-leverage build. You own the list forever.</td></tr><tr><td><b>Google Ads (Search)</b></td><td>High-intent</td><td class="stars">★★★★☆</td><td>Own "commercial real estate news [market]", "[market] office/industrial deals". Capture brokers searching for the deal you just covered.</td></tr><tr><td><b>Sponsored content</b></td><td>Monetize + reach</td><td class="stars">★★★★☆</td><td>Brokerages & lenders pay to co-publish deal analysis. Doubles as revenue AND distribution when they reshare.</td></tr><tr><td><b>RENTV Conferences</b></td><td>Events flywheel</td><td class="stars">★★★★★</td><td>Your events ARE the moat. Cross-promote content↔conferences: every article plugs the summit; every attendee joins the newsletter.</td></tr><tr><td><b>X / Twitter</b></td><td>CRE deal community</td><td class="stars">★★★☆☆</td><td>CRE Twitter breaks + trades deal news. Auto-post headlines, engage brokers; low cost, real reach in-industry.</td></tr><tr><td><b>Programmatic / native</b></td><td>Awareness</td><td class="stars">★★★☆☆</td><td>Run native units on CRE + finance sites to pull new readers into the newsletter funnel. Measure cost-per-subscriber.</td></tr><tr><td><b>SEO</b></td><td>Compounding</td><td class="stars">★★★★☆</td><td>20+ years of archives = a ranking asset. Modernize the site (mobile + speed) and structure deal pages to own "[property] sells" search.</td></tr></tbody></table>
+</div></section>
+
+<section id="timing"><div class="eyebrow">04 · Timing & Cadence</div><h2 class="disp">Ride the deal + conference calendar.</h2><div class="accbody">
+ <p class="lead2">CRE news demand tracks the transaction & events calendar — quarterly reports, spring & fall conference seasons, year-end roundups. Publish daily; spike coverage on the peaks.</p>
+ <div class="chartwrap"><div class="ct">Deal activity vs. readership by month</div><canvas id="timeChart"></canvas></div>
+ <table><thead><tr><th>Month</th><th>Driver</th><th>The move</th></tr></thead><tbody><tr><td class="mo">Jan</td><td>Year-ahead outlook · forecasts</td><td class="act">Publish the "2026 Western-U.S. CRE Outlook"; open annual sponsor packages</td></tr><tr><td class="mo">Feb</td><td>Q4 earnings / REIT results</td><td class="act">Cover public-REIT & brokerage earnings; recap year-end deal volume</td></tr><tr><td class="mo">Mar</td><td>SPRING conference season</td><td class="act">Peak events: cover + host panels; drive summit registration</td></tr><tr><td class="mo">Apr</td><td>Q1 market reports</td><td class="act">Publish quarterly vacancy/cap-rate reports (data content = links + leads)</td></tr><tr><td class="mo">May</td><td>Deal season builds</td><td class="act">Sales/leasing volume rises — max deal coverage + newsletter growth push</td></tr><tr><td class="mo">Jun</td><td>Mid-year review</td><td class="act">"Biggest deals of H1" roundup — highly shareable, sponsor-friendly</td></tr><tr><td class="mo">Jul</td><td>Summer slow · evergreen</td><td class="act">Run explainers, market primers, and build the fall content pipeline</td></tr><tr><td class="mo">Aug</td><td>Pre-fall sell-in</td><td class="act">Lock Q4 conference sponsors; tease the fall summit</td></tr><tr><td class="mo">Sep</td><td>FALL conference peak</td><td class="act">Your marquee summit — content + events + sponsorship converge</td></tr><tr><td class="mo">Oct</td><td>Q3 reports · deal surge</td><td class="act">Quarterly data + heavy transaction coverage (year's busiest)</td></tr><tr><td class="mo">Nov</td><td>Year-end deal push</td><td class="act">"Deals of the year" build; open next-year sponsor renewals</td></tr><tr><td class="mo">Dec</td><td>Year in review · predictions</td><td class="act">Top-10 deals, people moves, and the "what's next" predictions issue</td></tr></tbody></table>
+ <p class="lead2"><b>Posting rhythm:</b> daily deal briefs, a weekly roundup newsletter, LinkedIn 1–2×/day on weekday mornings when brokers scan. Publish quarterly data reports on schedule — they earn links and leads.</p>
+</div></section>
+
+<section id="audit"><div class="eyebrow">05 · Website Audit</div><h2 class="disp">A 1998 site for a 2026 audience.</h2><div class="accbody">
+ <p class="lead2">Live audit of <b>rentv.com</b> — observed directly:</p>
+ <div class="cards2">
+ <div class="c"><h3>Architecture</h3><p class="flag">Legacy <b>table-based layout</b> with <b>window.open() popups</b> and non-UTF-8 encoding — a pre-responsive build. Breaks on mobile, where most CRE reading now happens.</p></div>
+ <div class="c"><h3>First impression</h3><p>No modern hero, no motion, dense text. The #1 upgrade: a <b>clean editorial front page</b> with a lead story, card grid, and a newsletter capture above the fold.</p></div>
+ <div class="c"><h3>Mobile & speed</h3><p class="flag">Not mobile-responsive; heavy legacy markup. Brokers scan on phones between meetings — this is lost readership every day.</p></div>
+ <div class="c"><h3>Conversion</h3><p>No visible newsletter capture or clear subscribe path. Every visitor should be one click from joining the list — the audience you own forever.</p></div>
+ </div>
+ <p class="lead2">Six ready-to-review redesign concepts below — each modeled on a CRE-news leader, with a modern editorial front page already built.</p>
+</div></section>
+
+<section id="social"><div class="eyebrow">06 · Social Media Audit</div><h2 class="disp">Real accounts, dormant and hidden.</h2><div class="accbody">
+ <div class="flagbox"><div class="i">⚠</div><div><h3 class="disp">Your social exists — but it's invisible and asleep</h3><p>RENTV has a <b>LinkedIn company page (818 followers)</b> and a <b>Facebook page</b> — but <b>neither is linked from rentv.com</b>, and posting looks dormant. There is <b>no X or Instagram</b> and <b>zero paid-ad activity</b> detected. For a CRE-news brand — whose audience lives on LinkedIn — this is the single biggest free growth lever on this list.</p></div></div>
+ <div class="chartwrap" style="margin-top:34px"><div class="ct">LinkedIn growth potential — activate + post daily (projection)</div><canvas id="socialChart"></canvas></div>
+ <div class="cards2" style="margin-top:34px">
+ <div class="c"><h3>LinkedIn — 818 followers</h3><p>Your #1 channel, dormant. <b>Fix:</b> link it site-wide, post daily deal coverage, have staff reshare, run thought-leadership ads. This is where the CRE audience & the sponsor money are.</p></div>
+ <div class="c"><h3>Facebook</h3><p class="flag">Exists, dormant. <b>Fix:</b> auto-syndicate headlines; low priority vs. LinkedIn but keep it current for older readers & reviews.</p></div>
+ <div class="c"><h3>X / Twitter — none</h3><p>CRE Twitter breaks & trades deal news. <b>Fix:</b> stand up @RENTV, auto-post headlines, engage brokers. Cheap, real in-industry reach.</p></div>
+ <div class="c"><h3>Instagram / YouTube</h3><p>No IG. You DO produce <b>video programming</b> — put it on YouTube + IG Reels (deal-of-the-week, market minute, conference recaps) to reach the next generation.</p></div>
+ </div>
+</div></section>
+
+<section id="suggested"><div class="eyebrow">07 · Suggested New Websites</div><h2 class="disp">Six directions — each after a CRE-news leader.</h2><div class="accbody">
+ <p class="lead2">Modern, editorial, mobile-first — modeled on the outlets winning CRE news today. Each opens as a working front-page concept with real layout & motion. Pick a direction; we build it out.</p>
+ <div class="vgrid">
+ <a class="vtile rv" href="/versions/thewire.html" target="_blank" style="--vb:#111114;--vi:#f5f5f7;--vg:#e0243b">
+ <div class="vswatch"><span style="background:#111114"></span><span style="background:#1a1a1f"></span><span style="background:#e0243b"></span><span style="background:#f5f5f7"></span></div>
+ <div class="vname">The Wire</div><div class="vmodel">after The Real Deal</div>
+ <div class="vmood">Real-Deal energy — red-on-black newsroom, aggressive headlines.</div><div class="vopen">Open live concept →</div>
+ </a>
+ <a class="vtile rv" href="/versions/dispatch.html" target="_blank" style="--vb:#0d1b2a;--vi:#eef3f8;--vg:#3fb0ff">
+ <div class="vswatch"><span style="background:#0d1b2a"></span><span style="background:#14273d"></span><span style="background:#3fb0ff"></span><span style="background:#eef3f8"></span></div>
+ <div class="vname">Dispatch</div><div class="vmodel">after Bisnow</div>
+ <div class="vmood">Bisnow-style — newsletter-forward, clean, capture-first.</div><div class="vopen">Open live concept →</div>
+ </a>
+ <a class="vtile rv" href="/versions/observer.html" target="_blank" style="--vb:#14110c;--vi:#f6efe2;--vg:#c9a24b">
+ <div class="vswatch"><span style="background:#14110c"></span><span style="background:#1e1a12"></span><span style="background:#c9a24b"></span><span style="background:#f6efe2"></span></div>
+ <div class="vname">The Observer</div><div class="vmodel">after Commercial Observer</div>
+ <div class="vmood">Commercial-Observer editorial — serif authority, gold on ink.</div><div class="vopen">Open live concept →</div>
+ </a>
+ <a class="vtile rv" href="/versions/terminal.html" target="_blank" style="--vb:#0a0e12;--vi:#e9eef3;--vg:#37d39a">
+ <div class="vswatch"><span style="background:#0a0e12"></span><span style="background:#111820"></span><span style="background:#37d39a"></span><span style="background:#e9eef3"></span></div>
+ <div class="vname">Terminal</div><div class="vmodel">after CoStar / GlobeSt</div>
+ <div class="vmood">CoStar/GlobeSt utility — dark data terminal, live tickers & charts.</div><div class="vopen">Open live concept →</div>
+ </a>
+ <a class="vtile rv" href="/versions/broadsheet.html" target="_blank" style="--vb:#fbf3e9;--vi:#2a211a;--vg:#a8442b">
+ <div class="vswatch"><span style="background:#fbf3e9"></span><span style="background:#f4e7d5"></span><span style="background:#a8442b"></span><span style="background:#2a211a"></span></div>
+ <div class="vname">Broadsheet</div><div class="vmodel">after The Financial Times</div>
+ <div class="vmood">FT-style broadsheet — cream stock, classic authority, print heritage.</div><div class="vopen">Open live concept →</div>
+ </a>
+ <a class="vtile rv" href="/versions/modern.html" target="_blank" style="--vb:#0e0f11;--vi:#f2f3f5;--vg:#8b5cf6">
+ <div class="vswatch"><span style="background:#0e0f11"></span><span style="background:#17181b"></span><span style="background:#8b5cf6"></span><span style="background:#f2f3f5"></span></div>
+ <div class="vname">Modern</div><div class="vmodel">after Axios</div>
+ <div class="vmood">Axios-style modern — minimal, scannable, mobile-native.</div><div class="vopen">Open live concept →</div>
+ </a></div>
+</div></section>
+
+<section id="partners"><div class="eyebrow">08 · Unlikely Partners</div><h2 class="disp">Ten referral engines hiding in the industry.</h2><div class="accbody">
+ <p class="lead2">Your readers & sponsors already sit inside these organizations. Content + data + event swaps turn them into a low-cost pipeline of audience and revenue.</p>
+ <div class="pcard rv"><div class="pnum">01</div><div><h4>Major brokerages (CBRE, JLL, Cushman, Colliers)</h4><p>They generate the deals you cover — formalize data-sharing + co-published market reports. Their PR teams feed you scoops; you give their deals reach.</p></div></div><div class="pcard rv"><div class="pnum">02</div><div><h4>CRE associations (NAIOP, ULI, ICSC, BOMA)</h4><p>Co-branded content + event cross-promotion. Become the official news partner of the chapters across your Western-U.S. footprint.</p></div></div><div class="pcard rv"><div class="pnum">03</div><div><h4>CRE data providers (CoStar, Reonomy, CompStak)</h4><p>License data feeds to power live charts & deal pages — turns your news into a data product competitors can't match.</p></div></div><div class="pcard rv"><div class="pnum">04</div><div><h4>CRE law & finance firms</h4><p>Sponsor deal-analysis columns ("Financing this week, presented by ___"). Recurring sponsorship + expert bylines that build authority.</p></div></div><div class="pcard rv"><div class="pnum">05</div><div><h4>Conference & trade-show operators</h4><p>Co-host or media-partner other CRE events — extend the RENTV Conferences franchise without producing every show yourself.</p></div></div><div class="pcard rv"><div class="pnum">06</div><div><h4>PropTech startups</h4><p>Product-spotlight series + demo days. They pay for exposure to your broker/investor audience; you get fresh, forward-looking content.</p></div></div><div class="pcard rv"><div class="pnum">07</div><div><h4>Universities (USC Lusk, UCLA Ziman)</h4><p>Research partnerships + academic authority. Co-publish market studies; recruit the next generation of CRE readers early.</p></div></div><div class="pcard rv"><div class="pnum">08</div><div><h4>City economic-development orgs</h4><p>Market data + "why invest here" content for every metro you cover — free, credible, SEO-rich local coverage.</p></div></div><div class="pcard rv"><div class="pnum">09</div><div><h4>CRE lenders & banks</h4><p>Sponsor the "Financing" vertical + rate/market commentary. Lenders want mindshare with borrowers — you have exactly that audience.</p></div></div><div class="pcard rv"><div class="pnum">10</div><div><h4>Listing platforms (LoopNet, Crexi, Ten-X)</h4><p>Deal-flow content partnerships — surface notable listings as news; they drive traffic, you drive their listings.</p></div></div>
+</div></section>
+
+<section id="revenue"><div class="eyebrow">09 · Unlikely Revenue Streams</div><h2 class="disp">The audience is the asset. It can earn eight ways.</h2><div class="accbody">
+ <p class="lead2">News is the draw — but the brand, the list, and the events can each throw off high-margin recurring revenue. Bisnow proved the model; you have the regional authority to run it.</p>
+ <div class="chartwrap tall"><div class="ct">Target revenue mix</div><canvas id="revChart"></canvas></div>
+ <div class="cards2" style="margin-top:34px">
+ <div class="c"><h3>① Premium subscriptions</h3><p>A paid tier for deep deal data, archives & early access — recurring revenue off your most engaged readers.</p></div>
+ <div class="c"><h3>② RENTV Conferences (expand)</h3><p>Your events franchise is the crown jewel — add markets, sponsorships & ticket tiers. Content feeds events; events feed the list.</p></div>
+ <div class="c"><h3>③ Sponsored content</h3><p>Brokerages & lenders pay to co-publish deal analysis — revenue that also reshares into new reach.</p></div>
+ <div class="c"><h3>④ Newsletter sponsorships</h3><p>The Bisnow engine: a daily newsletter with a sponsor slot. Own the inbox, sell the placement.</p></div>
+ <div class="c"><h3>⑤ Data & market reports</h3><p>Package quarterly vacancy/cap-rate/deal-volume data into paid reports — high-margin, link-earning, lead-generating.</p></div>
+ <div class="c"><h3>⑥ CRE job board</h3><p>A careers board for brokers, analysts & developers — recurring listings revenue on an audience employers want.</p></div>
+ <div class="c"><h3>⑦ Webinars & virtual events</h3><p>Sponsored market-outlook webinars between the big conferences — low cost, high sponsor value.</p></div>
+ <div class="c"><h3>⑧ Video sponsorships</h3><p>Your video programming, sponsored: "Deal of the Week, presented by ___." Monetize content you already make.</p></div>
+ </div>
+</div></section>
+
+<section id="videos"><div class="eyebrow">10 · Video + Brand Films</div><h2 class="disp">You make video — package it to sell.</h2><div class="accbody">
+ <p class="lead2">RENTV already produces video programming & conference sessions. Standardize it into short, sponsored, mobile-first formats — and add a presenter-led brand film over your own footage.</p>
+ <div style="margin-top:10px"></div>
+ <div class="eyebrow">The upgrade — a presenter over YOUR footage</div>
+ <h2 class="disp">A host, over real CRE footage. Motion, music, one action item.</h2>
+ <p class="lead2">The format to standardize: RENTV's own market/conference footage as the backdrop, a polished presenter delivering one message, fade in/out, a music bed, one clear CTA. Drop-in for LinkedIn, ads & the site hero.</p>
+ <div class="heybox">
+ <div class="film"><video id="heyfilm" autoplay muted loop playsinline></video><div class="ph" id="heyph">● RENTV brand film<br>presenter over your footage<br>— renders here when ready</div></div>
+ <div class="copy"><h3 class="disp">"The deal desk of the West."</h3><p>Presenter script: <i>"Since 1998, RENTV has covered the deals that move Western commercial real estate — the sales, the leases, the financing, the people. Your action item: get it first. Subscribe to the RENTV Daily."</i></p><div class="spec"><span>◐ Fade in / out</span><span>♪ Music bed</span><span>▶ Action item</span><span>🏙 Your footage</span><span>15–30s · LinkedIn</span></div></div>
+ </div>
+ <div style="margin-top:60px"></div>
+ <div class="eyebrow">New video formats to make</div>
+ <h2 class="disp">Eight shorts that own CRE attention.</h2>
+ <div class="sugg">
+ <div class="s"><div class="p">Daily · Deals</div><h4>Deal of the Week</h4><p>60-second breakdown of the biggest trade — who, how much, why it matters.</p></div>
+ <div class="s"><div class="p">Data · Weekly</div><h4>Market Minute</h4><p>One chart, one takeaway — cap rates, vacancy, absorption. Repurpose the report data.</p></div>
+ <div class="s"><div class="p">Events</div><h4>Conference Recap</h4><p>Cut every RENTV Conferences panel into shareable clips — content + promo in one.</p></div>
+ <div class="s"><div class="p">People</div><h4>Broker / Investor Spotlight</h4><p>Two-minute interview series — access is your moat; put faces on the deals.</p></div>
+ <div class="s"><div class="p">Explainer</div><h4>Why This Deal Matters</h4><p>Context video for the non-expert — grows the audience beyond insiders.</p></div>
+ <div class="s"><div class="p">Quarterly</div><h4>The Outlook</h4><p>A polished quarterly market outlook — a sponsor-ready flagship video.</p></div>
+ <div class="s"><div class="p">Development</div><h4>Groundbreaking Tour</h4><p>Walk the projects reshaping each metro — visual, shareable, developer-friendly.</p></div>
+ <div class="s"><div class="p">Annual</div><h4>Year in Review</h4><p>Top deals, people moves & predictions — the December franchise video.</p></div>
+ </div>
+ <div style="margin-top:60px"></div>
+ <div class="eyebrow">Five brand films — one per recommendation</div>
+ <h2 class="disp">Presenter shorts, each ending on an action item.</h2>
+ <p class="lead2">Each renders here as it finishes (refresh to pick up new ones).</p>
+ <div class="films5">
+ <div class="f5" data-key="reputation"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Authority</div><div class="fa">▶ Modernize + own the region</div></div>
+ <div class="f5" data-key="advertising"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Grow</div><div class="fa">▶ Newsletter + LinkedIn</div></div>
+ <div class="f5" data-key="competitors"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Compete</div><div class="fa">▶ Out-local the nationals</div></div>
+ <div class="f5" data-key="timing"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Timing</div><div class="fa">▶ Own the deal calendar</div></div>
+ <div class="f5" data-key="social"><div class="fv"><video muted loop playsinline></video><div class="fph">● rendering</div></div><div class="ft">Social</div><div class="fa">▶ Activate LinkedIn today</div></div>
+ </div>
+</div></section>
+
+<section id="dealdesk"><div class="eyebrow">11 · Live Deal Desk — demo with REAL data</div><h2 class="disp">What your modernized site can do: live, scored deal data.</h2><div class="accbody">
+ <p class="lead2">This is not a mockup — it's a working demo running on <b>real Los Angeles CRE listings</b> (multifamily, retail, mixed-use) with real cap rates and a transparent 0–100 deal score. A modernized RENTV pairs your deal <i>reporting</i> with live deal <i>data</i> like this — the product wedge none of the news competitors ship regionally.</p>
+ <div id="dealmap"></div>
+ <p class="lead2" style="font-size:15px;margin-top:14px;opacity:.7">Clustered map of live LA-area commercial listings · zoom to explode clusters · click a marker for price & type.</p>
+ <div class="chartwrap"><div class="ct">Real Census market data — median rent vs. income, LA-area cities</div><canvas id="demoChart"></canvas></div>
+ <div class="dealgrid">
+ <div class="deal rv">
+ <div class="dscore" data-score="77">77</div>
+ <div class="dbody"><div class="daddr">304 E 95th St</div><div class="dcity">Los Angeles · Multifamily · 6 units</div>
+ <div class="dnums"><span>$1.40M</span><span>10.4% cap</span><span>1.79 DSCR</span><span>16.7% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="77">77</div>
+ <div class="dbody"><div class="daddr">214 S Maryland Pkwy</div><div class="dcity">Las Vegas · Multifamily · 10 units</div>
+ <div class="dnums"><span>$1.45M</span><span>9.5% cap</span><span>1.63 DSCR</span><span>13.4% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="76">76</div>
+ <div class="dbody"><div class="daddr">5335 Harmony Avenue</div><div class="dcity">North Hollywood · Multifamily · 8 units</div>
+ <div class="dnums"><span>$1.20M</span><span>8.8% cap</span><span>1.51 DSCR</span><span>10.9% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="76">76</div>
+ <div class="dbody"><div class="daddr">553 Stanford Ave</div><div class="dcity">Los Angeles · Multifamily · 17 units</div>
+ <div class="dnums"><span>$1.38M</span><span>9.7% cap</span><span>1.67 DSCR</span><span>14.2% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="76">76</div>
+ <div class="dbody"><div class="daddr">3650 S Eastern Ave #200</div><div class="dcity">Las Vegas · Office · 1 units</div>
+ <div class="dnums"><span>$0.90M</span><span>10.0% cap</span><span>1.71 DSCR</span><span>15.1% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="75">75</div>
+ <div class="dbody"><div class="daddr">3804 Mt Pleasant St</div><div class="dcity">Houston · Multifamily · 15 units</div>
+ <div class="dnums"><span>$1.15M</span><span>8.6% cap</span><span>1.47 DSCR</span><span>10.1% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="75">75</div>
+ <div class="dbody"><div class="daddr">3815 Fannin St</div><div class="dcity">Houston · Multifamily · 15 units</div>
+ <div class="dnums"><span>$0.90M</span><span>8.9% cap</span><span>1.52 DSCR</span><span>11.1% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="75">75</div>
+ <div class="dbody"><div class="daddr">2915 Pearl Avenue</div><div class="dcity">Fort Worth · Multifamily · 1 units</div>
+ <div class="dnums"><span>$0.88M</span><span>9.1% cap</span><span>1.56 DSCR</span><span>11.9% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="75">75</div>
+ <div class="dbody"><div class="daddr">4430 Herring Dr</div><div class="dcity">Fort Worth · Multifamily · 1 units</div>
+ <div class="dnums"><span>$1.44M</span><span>9.2% cap</span><span>1.58 DSCR</span><span>12.2% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="74">74</div>
+ <div class="dbody"><div class="daddr">9415 S R L Thornton Fwy</div><div class="dcity">Dallas · Retail · 1 units</div>
+ <div class="dnums"><span>$0.90M</span><span>8.5% cap</span><span>1.45 DSCR</span><span>9.5% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="74">74</div>
+ <div class="dbody"><div class="daddr">12033 Misty Valley Dr</div><div class="dcity">Houston · Retail · 1 units</div>
+ <div class="dnums"><span>$1.00M</span><span>8.7% cap</span><span>1.49 DSCR</span><span>10.4% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="68">68</div>
+ <div class="dbody"><div class="daddr">11902 Perrin Beitel Rd</div><div class="dcity">San Antonio · Retail · 1 units</div>
+ <div class="dnums"><span>$1.05M</span><span>8.0% cap</span><span>1.37 DSCR</span><span>7.9% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="67">67</div>
+ <div class="dbody"><div class="daddr">3013 W 11th St</div><div class="dcity">Los Angeles · Multifamily · 9 units</div>
+ <div class="dnums"><span>$1.20M</span><span>7.7% cap</span><span>1.31 DSCR</span><span>6.6% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="66">66</div>
+ <div class="dbody"><div class="daddr">6236 Arroyo Glen St</div><div class="dcity">Los Angeles · Multifamily · 4 units</div>
+ <div class="dnums"><span>$0.99M</span><span>7.6% cap</span><span>1.30 DSCR</span><span>6.4% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="66">66</div>
+ <div class="dbody"><div class="daddr">1330 NW 54th St</div><div class="dcity">Miami · Office · 1 units</div>
+ <div class="dnums"><span>$0.80M</span><span>7.6% cap</span><span>1.30 DSCR</span><span>6.3% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="64">64</div>
+ <div class="dbody"><div class="daddr">901 N El Centro Avenue</div><div class="dcity">Hollywood · Multifamily · 5 units</div>
+ <div class="dnums"><span>$0.95M</span><span>7.7% cap</span><span>1.32 DSCR</span><span>6.7% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="62">62</div>
+ <div class="dbody"><div class="daddr">333 N Union Ave</div><div class="dcity">Los Angeles · Multifamily · 1 units</div>
+ <div class="dnums"><span>$1.20M</span><span>7.5% cap</span><span>1.28 DSCR</span><span>6.0% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="62">62</div>
+ <div class="dbody"><div class="daddr">1216 E 56th</div><div class="dcity">Long Beach · Multifamily · 4 units</div>
+ <div class="dnums"><span>$1.20M</span><span>7.5% cap</span><span>1.28 DSCR</span><span>6.0% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="62">62</div>
+ <div class="dbody"><div class="daddr">120 S 79th St</div><div class="dcity">Houston · Multifamily · 10 units</div>
+ <div class="dnums"><span>$0.75M</span><span>7.4% cap</span><span>1.27 DSCR</span><span>5.8% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="61">61</div>
+ <div class="dbody"><div class="daddr">8717 Humble Westfield Building D</div><div class="dcity">Houston · Office · 1 units</div>
+ <div class="dnums"><span>$1.09M</span><span>7.3% cap</span><span>1.25 DSCR</span><span>5.4% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="60">60</div>
+ <div class="dbody"><div class="daddr">4928 Lennox Blvd</div><div class="dcity">Inglewood · Multifamily · 4 units</div>
+ <div class="dnums"><span>$1.10M</span><span>7.3% cap</span><span>1.25 DSCR</span><span>5.3% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="60">60</div>
+ <div class="dbody"><div class="daddr">4454 Purdy Ln.</div><div class="dcity">West Palm Beach · Retail · 1 units</div>
+ <div class="dnums"><span>$8.50M</span><span>26.0% cap</span><span>4.45 DSCR</span><span>73.3% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="59">59</div>
+ <div class="dbody"><div class="daddr">13981 Southwest 232nd Street</div><div class="dcity">Miami · Retail · 1 units</div>
+ <div class="dnums"><span>$2.35M</span><span>16.0% cap</span><span>2.73 DSCR</span><span>36.8% CoC</span></div></div>
+ </div>
+ <div class="deal rv">
+ <div class="dscore" data-score="57">57</div>
+ <div class="dbody"><div class="daddr">10370-1/2 Ashton Avenue</div><div class="dcity">Los Angeles · Multifamily · 4 units</div>
+ <div class="dnums"><span>$2.10M</span><span>11.8% cap</span><span>2.03 DSCR</span><span>21.8% CoC</span></div></div>
+ </div></div>
+ <p class="lead2" style="font-size:15px;margin-top:16px;opacity:.7">Scores computed by a transparent weighted model (rent yield, cap rate, DSCR, financing signals) — every badge explains itself. Data: live LA CRE listing sample, July 2026.</p>
+</div></section>
+
+<section id="roadmap"><div class="eyebrow">12 · 90-Day Roadmap</div><h2 class="disp">What to do, in order.</h2><div class="accbody">
+ <ul class="road">
+ <li><div class="w">Weeks 1–2</div><div class="d">Link LinkedIn + Facebook site-wide and begin daily LinkedIn posting. Stand up a newsletter capture on rentv.com. Pick a website direction from the six concepts.</div></li>
+ <li><div class="w">Weeks 3–6</div><div class="d">Ship the new mobile-first front page. Launch the free "RENTV Daily" newsletter. Start Google Ads on regional CRE-news keywords. Sign the first sponsored-content partner.</div></li>
+ <li><div class="w">Weeks 6–10</div><div class="d">Open conference-sponsor + newsletter-sponsor packages. Sign 3 "unlikely partner" swaps (a brokerage, an association, a lender). Publish the first quarterly data report.</div></li>
+ <li><div class="w">Weeks 10–13</div><div class="d">Launch the video formats (Deal of the Week, Market Minute) + the presenter brand film. Measure cost-per-subscriber & sponsor pipeline; double down on the winner.</div></li>
+ </ul>
+</div></section>
+
+<footer><span>RENTV.com · Growth Strategy Brief</span><span>Prepared for the 2026 consulting review</span><span>Confidential — for discussion</span></footer>
<script>
-async function j(u){ const r = await fetch(u); return r.ok ? r.json() : null; }
-(async () => {
- const c = await j('/api/client'); if (c && c.business_name){ document.getElementById('name').textContent = c.business_name; document.getElementById('brand').textContent = c.business_name; if(c.tagline) document.getElementById('tag').textContent = c.tagline; }
- // version concepts (generated into /versions by build.mjs)
- const known = ['flagship','editorial','modern','bold','warm','classic'];
- const vc = document.getElementById('versions'); let found = 0;
- for (const v of known){ const ok = await fetch('/versions/'+v+'.html',{method:'HEAD'}).then(r=>r.ok).catch(()=>false);
- if(ok){ found++; const a=document.createElement('a'); a.className='vcard'; a.href='/versions/'+v+'.html';
- a.innerHTML='<div class="swatch"></div><div class="body"><b>'+v+'</b></div>'; vc.appendChild(a); } }
- document.getElementById('vcount').textContent = found + ' concepts';
- if(!found) vc.innerHTML = '<p style="font-family:system-ui;color:#9a9082">No concepts generated yet — run <code>node build.mjs</code>.</p>';
- // suggestions
- const s = await j('/api/admin/suggestions')||[]; const su=document.getElementById('sugs');
- su.innerHTML = s.length ? s.map(x=>'<li><b>'+(x.title||'')+'</b> <span class="badge">impact '+(x.impact||'?')+' / effort '+(x.effort||'?')+'</span><br><span style="color:#6b6357">'+(x.rationale||'')+'</span></li>').join('') : '<li style="color:#9a9082">No growth moves seeded yet.</li>';
- // socials
- const so = await j('/api/admin/socials')||{}; const el=document.getElementById('social');
- const rows = Object.entries(so).filter(([k])=>!['connected','notes'].includes(k)).map(([k,v])=>'<li><b>'+k+'</b> — '+(v?('<a href="'+(String(v).startsWith('http')?v:'#')+'">'+v+'</a>'):'<span style="color:#c66">not set up yet</span>')+'</li>');
- el.innerHTML = rows.join('') + (so.notes?'<li style="color:#9a9082;font-size:13px">'+so.notes+'</li>':'');
-})();
+(function(){var s=document.querySelectorAll('.hero .slide'),i=0;if(s.length<2)return;setInterval(function(){s[i].classList.remove('on');i=(i+1)%s.length;s[i].classList.add('on');},5200);})();
+function countUp(el){var t=+el.dataset.c;if(!t)return;var d=1200,st=null;function step(ts){st=st||ts;var p=Math.min((ts-st)/d,1);el.textContent=Math.round(t*p).toLocaleString();if(p<1)requestAnimationFrame(step);}requestAnimationFrame(step);}
+var secs=[].slice.call(document.querySelectorAll('section[id]'));var accs=[];
+secs.forEach(function(sec){var eb=sec.querySelector(':scope>.eyebrow'),h2=sec.querySelector(':scope>h2');if(!eb&&!h2)return;accs.push(sec);
+ var head=document.createElement('button');head.type='button';head.className='acchead';var txt=document.createElement('div');txt.className='htext';if(eb)txt.appendChild(eb);if(h2)txt.appendChild(h2);
+ var chev=document.createElement('span');chev.className='chev';chev.textContent='+';head.appendChild(txt);head.appendChild(chev);sec.insertBefore(head,sec.querySelector('.accbody'));
+ head.addEventListener('click',function(){var open=sec.classList.toggle('open');chev.textContent=open?'\u2013':'+';if(open){initCharts();initDesk();}});});
+function setAll(o){accs.forEach(function(s){s.classList.toggle('open',o);var c=s.querySelector('.chev');if(c)c.textContent=o?'\u2013':'+';});if(o){initCharts();initDesk();}}
+document.getElementById('xall').onclick=function(){setAll(true);};document.getElementById('call').onclick=function(){setAll(false);};
+document.querySelectorAll('.menu a[href^="#"]').forEach(function(a){a.addEventListener('click',function(){var id=a.getAttribute('href').slice(1),s=document.getElementById(id);if(s&&!s.classList.contains('open')&&s.querySelector('.acchead')){s.querySelector('.acchead').click();}if(s)setTimeout(function(){s.scrollIntoView({behavior:'smooth'});},80);});});
+var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target);}});},{threshold:.12});
+document.querySelectorAll('.rv').forEach(function(el){io.observe(el);});
+document.querySelectorAll('.metrics .v[data-c]').forEach(function(el){var mo=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){countUp(el);mo.unobserve(el);}});});mo.observe(el);});
+var charted=false;
+function initCharts(){if(charted||!window.Chart)return;charted=true;
+ var gold='#c8a15a',dim='rgba(238,241,246,.6)',line='rgba(200,161,90,.18)';Chart.defaults.color=dim;Chart.defaults.font.family='Jost,system-ui,sans-serif';
+ var C={"competitors":{"labels":["RENTV","Bisnow","The Real Deal","Comm. Observer","GlobeSt","CoStar News"],"reach":[35,95,90,70,80,88],"digital":[28,96,92,75,70,90]},"advertising":{"labels":["LinkedIn","Newsletter","Google Search","Sponsored Content","Events","X / Social","Programmatic","SEO"],"roi":[95,98,82,78,88,60,55,84]},"timing":{"labels":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"deals":[60,68,82,88,80,72,58,55,86,92,84,78],"readership":[70,72,88,90,78,64,52,50,84,95,88,80]},"social":{"labels":["Now","+30d","+60d","+90d","+180d","+1yr"],"linkedin":[818,1400,2600,4200,7500,15000]},"revenue":{"labels":["Subscriptions","Conferences","Sponsored Content","Newsletter Ads","Data & Reports","Job Board","Webinars","Video Sponsorships"],"mix":[26,24,18,12,8,5,4,3]}};
+ new Chart(document.getElementById('compChart'),{type:'bar',data:{labels:C.competitors.labels,datasets:[{label:'Audience reach',data:C.competitors.reach,backgroundColor:'rgba(200,161,90,.75)'},{label:'Digital modernization',data:C.competitors.digital,backgroundColor:'rgba(120,170,255,.6)'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},max:100},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});
+ new Chart(document.getElementById('adChart'),{type:'bar',data:{labels:C.advertising.labels,datasets:[{label:'Relative ROI',data:C.advertising.roi,backgroundColor:C.advertising.roi.map(function(v){return v>=88?'rgba(200,161,90,.85)':'rgba(200,161,90,.4)';})}]},options:{indexAxis:'y',responsive:true,maintainAspectRatio:false,scales:{x:{grid:{color:line},max:100},y:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+ new Chart(document.getElementById('timeChart'),{type:'line',data:{labels:C.timing.labels,datasets:[{label:'Deal activity',data:C.timing.deals,borderColor:gold,backgroundColor:'rgba(200,161,90,.12)',fill:true,tension:.4},{label:'Readership',data:C.timing.readership,borderColor:'#78aaff',backgroundColor:'rgba(120,170,255,.08)',fill:true,tension:.4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}}}});
+ new Chart(document.getElementById('socialChart'),{type:'line',data:{labels:C.social.labels,datasets:[{label:'LinkedIn followers (projected)',data:C.social.linkedin,borderColor:gold,backgroundColor:'rgba(200,161,90,.14)',fill:true,tension:.4,pointRadius:4}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line}},x:{grid:{display:false}}},plugins:{legend:{display:false}}}});
+ new Chart(document.getElementById('revChart'),{type:'doughnut',data:{labels:C.revenue.labels,datasets:[{data:C.revenue.mix,backgroundColor:['#c8a15a','#b78d3f','#a67c32','#d9b877','#8f6d2c','#e3c98d','#7c5f26','#efd9a3'],borderColor:'#0c1016',borderWidth:2}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{position:'right',labels:{color:dim,boxWidth:12}}},cutout:'58%'}});
+ var DG=[{"city":"Los Angeles","rent":2426,"income":69268,"renter_pct":88.6,"home_value":786000},{"city":"Santa Monica","rent":2239,"income":95139,"renter_pct":78.6,"home_value":1244400},{"city":"Pasadena","rent":2270,"income":87813,"renter_pct":84.8,"home_value":682300},{"city":"Long Beach","rent":1968,"income":74510,"renter_pct":79,"home_value":542600},{"city":"Burbank","rent":2397,"income":109953,"renter_pct":56.3,"home_value":1061200},{"city":"Glendale","rent":1938,"income":64564,"renter_pct":82.3,"home_value":800800}];
+ if(DG.length&&document.getElementById('demoChart')){new Chart(document.getElementById('demoChart'),{type:'bar',data:{labels:DG.map(function(x){return x.city;}),datasets:[{label:'Median gross rent ($/mo)',data:DG.map(function(x){return x.rent;}),backgroundColor:'rgba(200,161,90,.8)',yAxisID:'y'},{label:'Median income ($k/yr)',data:DG.map(function(x){return Math.round(x.income/1000);}),backgroundColor:'rgba(120,170,255,.6)',yAxisID:'y1'}]},options:{responsive:true,maintainAspectRatio:false,scales:{y:{grid:{color:line},position:'left'},y1:{grid:{display:false},position:'right'},x:{grid:{display:false}}},plugins:{legend:{labels:{color:dim}}}}});}
+}
+/* Live Deal Desk — real CRCP points + transparent score colors */
+var desked=false, deskMap=null;
+function scoreColor(s){try{if(window.DealScore&&DealScore.scoreColor)return DealScore.scoreColor(s);}catch(e){}return s>=80?'#16a34a':s>=60?'#ca8a04':s>=40?'#ea580c':s>=20?'#dc2626':'#7f1d1d';}
+function initDesk(){
+ document.querySelectorAll('.dscore').forEach(function(b){b.style.background=scoreColor(+b.dataset.score);});
+ if(desked||!window.L||!document.getElementById('dealmap'))return;desked=true;
+ var pts=[{"id":"crx2477882","address":"304 E 95th St","city":"Los Angeles","type":"Multifamily","price":1400000,"units":6,"cap_rate":10.43,"dscr":1.79,"coc":16.7,"score":77,"lat":33.950142861038,"lng":-118.269365751923},{"id":"crx1834484","address":"5335 Harmony Avenue","city":"North Hollywood","type":"Multifamily","price":1195000,"units":8,"cap_rate":8.84,"dscr":1.51,"coc":10.92,"score":76,"lat":34.167277489905,"lng":-118.366520195499},{"id":"crx2257159","address":"553 Stanford Ave","city":"Los Angeles","type":"Multifamily","price":1375000,"units":17,"cap_rate":9.73,"dscr":1.67,"coc":14.16,"score":76,"lat":34.041243837456,"lng":-118.242474847157},{"id":"crx1686510","address":"3013 W 11th St","city":"Los Angeles","type":"Multifamily","price":1195000,"units":9,"cap_rate":7.66,"dscr":1.31,"coc":6.63,"score":67,"lat":34.050909240654,"lng":-118.303601261465},{"id":"crx2406293","address":"901 N El Centro Avenue","city":"Hollywood","type":"Multifamily","price":949995,"units":5,"cap_rate":7.69,"dscr":1.32,"coc":6.74,"score":64,"lat":34.087174205039,"lng":-118.324501761593},{"id":"crx2066415","address":"333 N Union Ave","city":"Los Angeles","type":"Multifamily","price":1195000,"units":1,"cap_rate":7.5,"dscr":1.28,"coc":6.05,"score":62,"lat":34.067804842665,"lng":-118.263883967228},{"id":"crx2596637","address":"4928 Lennox Blvd","city":"Inglewood","type":"Multifamily","price":1100000,"units":4,"cap_rate":7.28,"dscr":1.25,"coc":5.25,"score":60,"lat":33.938136867687,"lng":-118.364133911619},{"id":"crx2412499","address":"10370-1/2 Ashton Avenue","city":"Los Angeles","type":"Multifamily","price":2095000,"units":4,"cap_rate":11.83,"dscr":2.03,"coc":21.79,"score":57,"lat":34.066214295719,"lng":-118.427319489806},{"id":"crx2474530","address":"8022 Felix","city":"Bell Gardens","type":"Multifamily","price":1299000,"units":4,"cap_rate":7.13,"dscr":1.22,"coc":4.7,"score":55,"lat":33.958096974841,"lng":-118.157210472053},{"id":"crx2553265","address":"9350 Tampa","city":"Northridge","type":"Multifamily","price":1590000,"units":1,"cap_rate":9.24,"dscr":1.58,"coc":12.37,"score":54,"lat":34.240055739989,"lng":-118.553499610246},{"id":"crx2455582","address":"1242 E 7th St","city":"Long Beach","type":"Multifamily","price":1150000,"units":4,"cap_rate":7.02,"dscr":1.2,"coc":4.3,"score":54,"lat":33.775281875225,"lng":-118.175375162905},{"id":"crx2036352","address":"833 Cedar","city":"Long Beach","type":"Multifamily","price":1850000,"units":8,"cap_rate":9,"dscr":1.54,"coc":11.5,"score":54,"lat":33.777189058744,"lng":-118.195120374326},{"id":"crx2287481","address":"920 W 3rd St","city":"Pomona","type":"Multifamily","price":975000,"units":4,"cap_rate":7,"dscr":1.2,"coc":4.23,"score":54,"lat":34.056636813334,"lng":-117.759325149572},{"id":"crx2414348","address":"16122 San Fernando Mission Boulevard","city":"Granada Hills","type":"Multifamily","price":1298000,"units":3,"cap_rate":6.66,"dscr":1.14,"coc":2.99,"score":53,"lat":34.271846376306,"lng":-118.483029483838},{"id":"crx2226450","address":"1476 W Holt Ave","city":"Pomona","type":"Multifamily","price":1900000,"units":9,"cap_rate":8.44,"dscr":1.45,"coc":9.46,"score":53,"lat":34.061733916319,"lng":-117.774182069667},{"id":"crx2601102","address":"6906 Marbrisa Avenue","city":"Huntington Park","type":"Multifamily","price":1100000,"units":4,"cap_rate":6.94,"dscr":1.19,"coc":4.01,"score":53,"lat":33.976813490268,"lng":-118.231433728665},{"address":"4511 ROSEWOOD AVE","city":"LOS ANGELES","price":3099000,"type":"Multifamily","lat":34.079063231527,"lng":-118.30259358568},{"address":"2310 Torrance Blvd","city":"Torrance","price":549000,"type":"Multifamily","lat":33.836332808536,"lng":-118.32402449154},{"address":"3584 Mulford","city":"Lynwood","price":1050000,"type":"Multifamily","lat":33.927085536997,"lng":-118.206005401231},{"address":"1114 6th Avenue","city":"Arcadia","price":1950000,"type":"Multifamily","lat":34.127751451215,"lng":-118.018679559088},{"address":"20528-& 20526 Hamlin Street","city":"Winnetka","price":1229777,"type":"Multifamily","lat":34.189128852464,"lng":-118.580402622871},{"address":"20280 Bloomfield Ave","city":"Cerritos","price":5686000,"type":"Retail","lat":33.846358872548,"lng":-118.063324205122},{"address":"411-413 E Rosecrans Avenue","city":"Compton","price":1499000,"type":"Mixed-use","lat":33.903423435568,"lng":-118.219309665387},{"address":"1165 Thompson Ave","city":"Glendale","price":8680000,"type":"Multifamily","lat":34.174077703835,"lng":-118.290064072362},{"address":"470 East Angeleno Avenue","city":"Burbank","price":10500000,"type":"Multifamily","lat":34.183204206636,"lng":-118.304293926677},{"address":"9545 Flower Street","city":"Bellflower","price":3600000,"type":"Multifamily","lat":33.882127452207,"lng":-118.130450330002},{"address":"436-440 W 2nd Street","city":"San Dimas","price":1499000,"type":"Multifamily","lat":34.108624442892,"lng":-117.814547804601},{"address":"1515 N Hollywood Way","city":"Burbank","price":1550000,"type":"Multifamily","lat":34.176563399169,"lng":-118.349355541007},{"address":"44 N Berkeley Avenue","city":"Pasadena","price":1100000,"type":"Multifamily","lat":34.14681959038,"lng":-118.109651638161},{"address":"716 South Long Beach Boulevard","city":"Compton","price":800000,"type":"Mixed-use","lat":33.890392055712,"lng":-118.207440314209},{"address":"1151 N Kingsley Dr","city":"Los Angeles","price":1250000,"type":"Multifamily","lat":34.09232946972,"lng":-118.302539428234},{"address":"2304 Torrance Blvd","city":"Torrance","price":1099000,"type":"Multifamily","lat":33.836335203955,"lng":-118.323872381877},{"address":"1453 Centinela Avenue","city":"Santa Monica","price":2025000,"type":"Multifamily","lat":34.037776734249,"lng":-118.466819247328},{"address":"149 S Bandy Avenue","city":"West Covina","price":2915000,"type":"Multifamily","lat":34.070098148879,"lng":-117.92053122181},{"address":"11904 Painter","city":"Whittier","price":1885000,"type":"Multifamily","lat":33.923220714026,"lng":-118.053202306299},{"address":"12321 Painter Avenue","city":"Whittier","price":1800000,"type":"Multifamily","lat":33.91977058666,"lng":-118.053337115208},{"address":"24300-24322 Main St.","city":"Santa Clarita","price":7500000,"type":"Multifamily","lat":34.379259701388,"lng":-118.528217731002},{"address":"1442 W 219th","city":"Torrance","price":1100000,"type":"Multifamily","lat":33.829085084361,"lng":-118.302539995978},{"address":"3456 Redondo Beach Boulevard","city":"Torrance","price":1590000,"type":"Multifamily","lat":33.880658970233,"lng":-118.333288533628},{"address":"7580 Mcgroarty Terrace","city":"Tujunga","price":2599995,"type":"Multifamily","lat":34.250701855968,"lng":-118.297994673936},{"address":"14030 Dicky Street","city":"Whittier","price":1350000,"type":"Multifamily","lat":33.942860037345,"lng":-118.029615770579},{"address":"2235 Deepgrove","city":"Rowland Heights","price":1090000,"type":"Multifamily","lat":33.979508047347,"lng":-117.910680047123},{"address":"2121 Pacific Coast Highway","city":"Hermosa Beach","price":3295000,"type":"Multifamily","lat":33.870379138673,"lng":-118.394694432872},{"address":"224 S Grand Avenue","city":"San Pedro","price":1995888,"type":"Multifamily","lat":33.742138100612,"lng":-118.290034174488},{"address":"918 S Cabrillo Ave","city":"Los Angeles","price":2327000,"type":"Multifamily","lat":34.060239063112,"lng":-118.367372753167},{"address":"7114 El Selinda Ave","city":"Bell Gardens","price":1175000,"type":"Multifamily","lat":33.968538266738,"lng":-118.160389769143},{"address":"9014 S. Fir Avenue","city":"Los Angeles","price":1250000,"type":"Multifamily","lat":33.954558453987,"lng":-118.237320326766},{"address":"3534 112","city":"Inglewood","price":799000,"type":"Multifamily","lat":33.932853866571,"lng":-118.333863897948},{"address":"24833 Railroad","city":"Newhall","price":5750000,"type":"Multifamily","lat":34.387243259843,"lng":-118.533318640546},{"address":"480 Rosecrans Ave","city":"Manhattan Beach","price":5200000,"type":"Multifamily","lat":33.90182392174,"lng":-118.41472919001},{"address":"9240 Palm Street","city":"Bellflower","price":5150000,"type":"Multifamily","lat":33.876540861793,"lng":-118.136915735526},{"address":"428 N Genesee Ave","city":"Los Angeles","price":1799000,"type":"Multifamily","lat":34.07880266685,"lng":-118.358307957711},{"address":"9746 Park Street","city":"Bellflower","price":4398000,"type":"Multifamily","lat":33.878388741604,"lng":-118.12620481271},{"address":"1652 Plaza Del Amo","city":"Torrance","price":2470000,"type":"Multifamily","lat":33.822299941491,"lng":-118.307685551283},{"address":"12001-17 Carson Street","city":"Hawaiian Gardens","price":6000000,"type":"Retail","lat":33.831574454933,"lng":-118.078132383864},{"address":"25601 Crenshaw Boulevard","city":"Torrance","price":1999999,"type":"Multifamily","lat":33.790831584222,"lng":-118.335339853056},{"address":"22438 Claretta","city":"Hawaiian Gardens","price":950000,"type":"Multifamily","lat":33.824609387582,"lng":-118.067503590368},{"address":"440 W Holt","city":"Pomona","price":849900,"type":"Multifamily","lat":34.06218396332,"lng":-117.755884798792},{"address":"9916 Whitaker Avenue","city":"North Hills","price":1099000,"type":"Multifamily","lat":34.250759097617,"lng":-118.498989265791},{"address":"1637-1651 Stanford Street","city":"Santa Monica","price":6000000,"type":"Multifamily","lat":34.032910172093,"lng":-118.465752903051},{"address":"222 N Locust","city":"Inglewood","price":1889000,"type":"Multifamily","lat":33.964993120174,"lng":-118.35033461244},{"address":"1223 N Kenmore Ave","city":"Los Angeles","price":2995000,"type":"Multifamily","lat":34.093871747796,"lng":-118.297446238393},{"address":"3204 Palmer Drive","city":"Los Angeles","price":1295000,"type":"Multifamily","lat":34.13382383873,"lng":-118.233679584893},{"address":"13525 Kornblum Avenue","city":"Hawthorne","price":1889000,"type":"Multifamily","lat":33.908861955003,"lng":-118.337377797579},{"address":"6513 Middleton","city":"Huntington Park","price":925000,"type":"Multifamily","lat":33.980305488539,"lng":-118.22903565441},{"address":"4860 Bell","city":"Bell","price":879999,"type":"Multifamily","lat":33.973385502608,"lng":-118.17920601716},{"address":"15057 Paddock","city":"Sylmar","price":1329000,"type":"Multifamily","lat":34.296041651591,"lng":-118.460530596693},{"address":"2012 S Garfield Avenue","city":"Monterey Park","price":1760000,"type":"Multifamily","lat":34.04082726539,"lng":-118.129087335025},{"address":"1063 Justin Ave","city":"Glendale","price":5400000,"type":"Multifamily","lat":34.168989304943,"lng":-118.288617367984},{"address":"1180 Myra Avenue","city":"Los Angeles","price":1695000,"type":"Multifamily","lat":34.093908422153,"lng":-118.281675043883},{"address":"473 E. 55th Street","city":"Long Beach","price":2925000,"type":"Multifamily","lat":33.856022440586,"lng":-118.18663153133},{"address":"1629 E Maple","city":"El Segundo","price":2799000,"type":"Multifamily","lat":33.927064462214,"lng":-118.398137305752},{"address":"518 E Washington","city":"Pasadena","price":3100000,"type":"Multifamily","lat":34.168871299715,"lng":-118.139792529651},{"address":"7306-7312 Neo Street","city":"Downey","price":5125000,"type":"Multifamily","lat":33.94598443895,"lng":-118.15289101858},{"address":"14812 Paramount Blvd","city":"Paramount","price":1199000,"type":"Retail","lat":33.898997586059,"lng":-118.159991810021},{"address":"5110 BAKMAN AVE","city":"NORTH HOLLYWOOD","price":33950000,"type":"Multifamily","lat":34.16321946553,"lng":-118.377324103428},{"address":"20518 Raymond Avenue","city":"Torrance","price":899000,"type":"Multifamily","lat":33.844331875746,"lng":-118.29619464118},{"address":"5326 Lorna Street","city":"Torrance","price":3700000,"type":"Multifamily","lat":33.838943189024,"lng":-118.370614823852},{"address":"2363 Torrance","city":"Torrance","price":1700000,"type":"Multifamily","lat":33.836432480818,"lng":-118.325371550841},{"address":"228 Rosemont Ave","city":"Los Angeles","price":1200000,"type":"Multifamily","lat":34.06953739908,"lng":-118.271597524711},{"address":"15131 Polk Street","city":"Sylmar","price":949000,"type":"Multifamily","lat":34.296728685212,"lng":-118.462020887753},{"address":"3644 Almeria Street","city":"San Pedro","price":1749000,"type":"Multifamily","lat":33.714110229092,"lng":-118.302212605086},{"address":"405 -411 N Euclid Ave","city":"Pasadena","price":5950000,"type":"Multifamily","lat":34.153417508775,"lng":-118.14306202251},{"address":"5032 Denny Avenue","city":"North Hollywood","price":1880000,"type":"Multifamily","lat":34.161902214065,"lng":-118.364729591585},{"address":"13461 Beach Ave","city":"Marina Del Rey","price":4500000,"type":"Multifamily","lat":33.990646890667,"lng":-118.445698216749},{"address":"1136 W 10th","city":"San Pedro","price":1349000,"type":"Multifamily","lat":33.735232858286,"lng":-118.301989115222},{"address":"1459 S Wooster St","city":"Los Angeles","price":1700000,"type":"Multifamily","lat":34.052556376006,"lng":-118.382955555764},{"address":"10516 Arrington Avenue","city":"Downey","price":2390000,"type":"Multifamily","lat":33.941741233282,"lng":-118.119293504971},{"address":"4212 La Rica","city":"Baldwin Park","price":5500000,"type":"Multifamily","lat":34.088867836858,"lng":-117.966910951493},{"address":"4253 South Centinela Avenue","city":"Los Angeles","price":1500000,"type":"Multifamily","lat":33.995365212519,"lng":-118.426564271581},{"address":"24047 Arch Street","city":"Newhall","price":714900,"type":"Multifamily","lat":34.37567848403,"lng":-118.522401570979},{"address":"11451 W Victory Boulevard","city":"North Hollywood","price":3199000,"type":"Multifamily","lat":34.186741432717,"lng":-118.381025590388},{"address":"350 W Wilson","city":"Glendale","price":3795000,"type":"Multifamily","lat":34.147966054438,"lng":-118.259645454322},{"address":"8480 Virginia","city":"South Gate","price":899000,"type":"Multifamily","lat":33.958278534626,"lng":-118.20668710932},{"address":"9234 Elizabeth Avenue","city":"South Gate","price":799000,"type":"Multifamily","lat":33.95101475371,"lng":-118.208684305097},{"address":"547 E Woodbury Road","city":"Altadena","price":1245000,"type":"Multifamily","lat":34.180295435449,"lng":-118.139227373},{"address":"1427 Euclid St","city":"Santa Monica","price":2275000,"type":"Multifamily","lat":34.02298599753,"lng":-118.486139105156},{"address":"5759 Hazeltine","city":"Van Nuys","price":928000,"type":"Multifamily","lat":34.174996577161,"lng":-118.440043523078},{"address":"14253 Gilmore Street","city":"Van Nuys","price":2645000,"type":"Multifamily","lat":34.187713436173,"lng":-118.443319588796},{"address":"2761 W Ave F","city":"Lancaster","price":1475000,"type":"Multifamily","lat":34.747803026989,"lng":-118.18301107632},{"address":"2804 W 85th","city":"Inglewood","price":1170000,"type":"Multifamily","lat":33.960798862888,"lng":-118.323249136235},{"address":"9416 Broadway","city":"Temple City","price":1350000,"type":"Multifamily","lat":34.099701282689,"lng":-118.064596493232},{"address":"14715 Chadron Ave.","city":"Gardena","price":8150000,"type":"Multifamily","lat":33.898109881635,"lng":-118.328713339619},{"address":"35 Arcadia Terrace","city":"Santa Monica","price":4500000,"type":"Multifamily","lat":34.009701963752,"lng":-118.493844216398},{"address":"195 S Wilson Avenue","city":"Pasadena","price":12500000,"type":"Multifamily","lat":34.142403534931,"lng":-118.128085429782},{"address":"415 S 6th","city":"Montebello","price":1099000,"type":"Multifamily","lat":34.00458337399,"lng":-118.108512686706},{"address":"110 S Eucalyptus Ave","city":"Inglewood","price":2650000,"type":"Multifamily","lat":33.962730526077,"lng":-118.359456159522},{"address":"124 Palos Verdes Boulevard","city":"Redondo Beach","price":7300000,"type":"Multifamily","lat":33.816968642346,"lng":-118.384187205369},{"address":"637 W 11th","city":"San Pedro","price":1398880,"type":"Multifamily","lat":33.734173267621,"lng":-118.290970946992},{"address":"1202 E E 76th St","city":"Los Angeles","price":693900,"type":"Multifamily","lat":33.971456426903,"lng":-118.253882897642},{"address":"210 W Lime Avenue","city":"Monrovia","price":1998000,"type":"Multifamily","lat":34.147984086232,"lng":-118.003423267951},{"address":"5431 Cartwright","city":"North Hollywood","price":1125000,"type":"Multifamily","lat":34.169118168403,"lng":-118.363679986975},{"address":"2815 Orchard Place","city":"South Gate","price":1800000,"type":"Multifamily","lat":33.95788351927,"lng":-118.221332022567},{"address":"4701 Saturn St","city":"Los Angeles","price":4199999,"type":"Multifamily","lat":34.043638010414,"lng":-118.339988311603},{"address":"13522 Penn","city":"Whittier","price":900000,"type":"Multifamily","lat":33.975373383928,"lng":-118.031592338694},{"address":"440 Raymond Avenue","city":"Santa Monica","price":7750000,"type":"Multifamily","lat":34.002423658085,"lng":-118.478536931542},{"address":"424 W Arbor Vitae Street","city":"Inglewood","price":750000,"type":"Multifamily","lat":33.952642428688,"lng":-118.362043561119},{"address":"1825 STANLEY AVE","city":"SIGNAL HILL","price":2400000,"type":"Multifamily","lat":33.790311584961,"lng":-118.162255047389},{"address":"3270 TWEEDY BLVD","city":"SOUTH GATE","price":3450000,"type":"Retail","lat":33.944974767168,"lng":-118.212994319759},{"address":"21512-21516 Norwalk Blvd","city":"Hawaiian Gardens","price":1050000,"type":"Retail","lat":33.834001927783,"lng":-118.071921459288},{"address":"5138 W 135th","city":"Hawthorne","price":1200000,"type":"Multifamily","lat":33.909453790503,"lng":-118.368166042353},{"address":"2210 W 229th","city":"Torrance","price":1229000,"type":"Multifamily","lat":33.818490878466,"lng":-118.320247014355},{"address":"1491 Atlantic Avenue","city":"Long Beach","price":2850000,"type":"Multifamily","lat":33.785545339374,"lng":-118.185095781139},{"address":"161 Alice St","city":"Arcadia","price":1330000,"type":"Multifamily","lat":34.131458275853,"lng":-118.026277277329},{"address":"4057 Baywood","city":"Los Angeles","price":1000000,"type":"Multifamily","lat":34.135286386181,"lng":-118.269617851103},{"address":"908-- 910 Victoria Avenue","city":"Venice","price":1799000,"type":"Multifamily","lat":33.993921338841,"lng":-118.455572111887},{"address":"579 W 14th","city":"San Pedro","price":2495000,"type":"Multifamily","lat":33.731449884971,"lng":-118.289662638286},{"address":"4202 Lexington Ave","city":"Los Angeles","price":1400000,"type":"Multifamily","lat":34.092769024017,"lng":-118.282613850653},{"address":"9614 Alondra","city":"Bellflower","price":2500000,"type":"Retail","lat":33.889293460127,"lng":-118.130170808843},{"address":"534 S Coronado St","city":"Los Angeles","price":2375000,"type":"Multifamily","lat":34.063246252121,"lng":-118.279488144112},{"address":"1932 E Washington Boulevard","city":"Pasadena","price":1395000,"type":"Multifamily","lat":34.169085827831,"lng":-118.110713125845},{"address":"4731-4733 Baldwin Park Blvd","city":"Baldwin Park","price":1695000,"type":"Multifamily","lat":34.098019117037,"lng":-117.964974131947},{"address":"14218 Sylvan Street","city":"Sherman Oaks","price":2298888,"type":"Multifamily","lat":34.184601845073,"lng":-118.442569521379},{"address":"936 North Curson Avenue","city":"West Hollywood","price":2299000,"type":"Multifamily","lat":34.08774600562,"lng":-118.355246608844},{"address":"21306 E Arrow Hwy","city":"Covina","price":4690000,"type":"Multifamily","lat":34.106548395389,"lng":-117.840146860706},{"address":"4437 Phelan Avenue","city":"Baldwin Park","price":1348800,"type":"Multifamily","lat":34.092912386374,"lng":-117.955440937985}];
+ deskMap=L.map('dealmap',{scrollWheelZoom:false}).setView([34.05,-118.3],10);
+ L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© OpenStreetMap © CARTO',maxZoom:18}).addTo(deskMap);
+ var cluster=L.markerClusterGroup();
+ pts.forEach(function(p){if(!p.lat||!p.lng)return;var m=L.circleMarker([p.lat,p.lng],{radius:7,color:p.score?scoreColor(+p.score):'#c8a15a',fillColor:p.score?scoreColor(+p.score):'#c8a15a',fillOpacity:.85,weight:1});
+ m.bindPopup('<b>'+(p.address||'')+'</b><br>'+(p.city||'')+(p.type?' · '+p.type:'')+(p.price?'<br>$'+Number(p.price).toLocaleString():'')+(p.score?'<br>Deal score: '+p.score:''));cluster.addLayer(m);});
+ deskMap.addLayer(cluster);
+ setTimeout(function(){deskMap.invalidateSize();},300);
+}
+fetch('/videos/heygen-brandfilm.mp4',{method:'HEAD'}).then(function(r){if(r.ok){var v=document.getElementById('heyfilm');v.src='/videos/heygen-brandfilm.mp4';v.play();var p=document.getElementById('heyph');if(p)p.style.display='none';}}).catch(function(){});
+document.querySelectorAll('.f5').forEach(function(c){var k=c.getAttribute('data-key'),src='/videos/heygen-'+k+'.mp4';fetch(src,{method:'HEAD'}).then(function(r){if(r.ok){var v=c.querySelector('video');v.src=src;v.play();var p=c.querySelector('.fph');if(p)p.style.display='none';}}).catch(function(){});});
</script>
-</body>
-</html>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/bold.html b/public/versions/bold.html
deleted file mode 100644
index 0357bbd..0000000
--- a/public/versions/bold.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Bold / energetic</title>
-<style>
-:root{--bg:#0d0d12;--ink:#f5f5f7;--accent:#ff4d6d}
-*{box-sizing:border-box}body{margin:0;font-family:'Arial Black',system-ui,sans-serif;background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
-</style></head><body>
-<div class="bar"><b>RENTV.com</b><span>Bold / energetic concept</span></div>
-<div class="hero">
- <div class="k">Commercial real estate news, deals & conferences · Los Angeles / Western U.S.</div>
- <h1>RENTV.com</h1>
- <p>Commercial real estate news, deals & conferences.</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-<div class="goals"><div>Modernize the dated legacy site into a fast, mobile-first CRE news experience</div><div>Grow newsletter + subscriber audience for daily deal coverage</div><div>Promote RENTV Conferences and drive event registrations</div><div>Build an integrated-social engine to distribute CRE deal news (LinkedIn, X, Instagram)</div></div>
-<div class="foot">Concept "bold" · generated 2026-07-17 · one of several directions to choose from.</div>
-</body></html>
\ No newline at end of file
diff --git a/public/versions/broadsheet.html b/public/versions/broadsheet.html
new file mode 100644
index 0000000..7f9dbce
--- /dev/null
+++ b/public/versions/broadsheet.html
@@ -0,0 +1,86 @@
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Broadsheet concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
+<style>
+:root{--bg:#fbf3e9;--panel:#f4e7d5;--ink:#2a211a;--gold:#a8442b;--line:rgba(42,33,26,.18)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Georgia',serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Playfair Display',Georgia,serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#fff;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'Georgia',serif}
+.util{background:#2a211a;color:#f4e7d5;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'Playfair Display',Georgia,serif;font-weight:600;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'Georgia',serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#fff;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#fff;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'Playfair Display',Georgia,serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'Playfair Display',Georgia,serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'Playfair Display',Georgia,serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#fff;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#2a211a;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'Playfair Display',Georgia,serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'Playfair Display',Georgia,serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#2a211a;color:#f4e7d5;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
+</style></head><body>
+<a class="badge" href="/portal#suggested">◀ Concept · The Financial Times direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>Broadsheet · The Financial Times direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "Broadsheet" (The Financial Times direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/classic.html b/public/versions/classic.html
deleted file mode 100644
index e221fa1..0000000
--- a/public/versions/classic.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Classic / trustworthy</title>
-<style>
-:root{--bg:#f4f4f0;--ink:#1c2530;--accent:#7a5b34}
-*{box-sizing:border-box}body{margin:0;font-family:'Times New Roman',serif;background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
-</style></head><body>
-<div class="bar"><b>RENTV.com</b><span>Classic / trustworthy concept</span></div>
-<div class="hero">
- <div class="k">Commercial real estate news, deals & conferences · Los Angeles / Western U.S.</div>
- <h1>RENTV.com</h1>
- <p>Commercial real estate news, deals & conferences.</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-<div class="goals"><div>Modernize the dated legacy site into a fast, mobile-first CRE news experience</div><div>Grow newsletter + subscriber audience for daily deal coverage</div><div>Promote RENTV Conferences and drive event registrations</div><div>Build an integrated-social engine to distribute CRE deal news (LinkedIn, X, Instagram)</div></div>
-<div class="foot">Concept "classic" · generated 2026-07-17 · one of several directions to choose from.</div>
-</body></html>
\ No newline at end of file
diff --git a/public/versions/dispatch.html b/public/versions/dispatch.html
new file mode 100644
index 0000000..385d1b4
--- /dev/null
+++ b/public/versions/dispatch.html
@@ -0,0 +1,86 @@
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Dispatch concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
+<style>
+:root{--bg:#0d1b2a;--panel:#14273d;--ink:#eef3f8;--gold:#3fb0ff;--line:rgba(63,176,255,.30)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Inter',system-ui,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Inter',system-ui,sans-serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#0b0b0c;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'Inter',system-ui,sans-serif}
+.util{background:#000;color:#c9ccd1;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'Inter',system-ui,sans-serif;font-weight:800;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'Inter',system-ui,sans-serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#0b0b0c;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#0b0b0c;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'Inter',system-ui,sans-serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'Inter',system-ui,sans-serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'Inter',system-ui,sans-serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#0b0b0c;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#0b0b0c;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'Inter',system-ui,sans-serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'Inter',system-ui,sans-serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#000;color:#aeb6bd;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
+</style></head><body>
+<a class="badge" href="/portal#suggested">◀ Concept · Bisnow direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>Dispatch · Bisnow direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "Dispatch" (Bisnow direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/editorial.html b/public/versions/editorial.html
deleted file mode 100644
index b5d37a2..0000000
--- a/public/versions/editorial.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Luxury / editorial</title>
-<style>
-:root{--bg:#f6f2ec;--ink:#14110e;--accent:#a9884f}
-*{box-sizing:border-box}body{margin:0;font-family:Georgia,serif;background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
-</style></head><body>
-<div class="bar"><b>RENTV.com</b><span>Luxury / editorial concept</span></div>
-<div class="hero">
- <div class="k">Commercial real estate news, deals & conferences · Los Angeles / Western U.S.</div>
- <h1>RENTV.com</h1>
- <p>Commercial real estate news, deals & conferences.</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-<div class="goals"><div>Modernize the dated legacy site into a fast, mobile-first CRE news experience</div><div>Grow newsletter + subscriber audience for daily deal coverage</div><div>Promote RENTV Conferences and drive event registrations</div><div>Build an integrated-social engine to distribute CRE deal news (LinkedIn, X, Instagram)</div></div>
-<div class="foot">Concept "editorial" · generated 2026-07-17 · one of several directions to choose from.</div>
-</body></html>
\ No newline at end of file
diff --git a/public/versions/flagship.html b/public/versions/flagship.html
deleted file mode 100644
index 167da44..0000000
--- a/public/versions/flagship.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Commercial Real Estate News, Deals & Conferences</title>
-<style>
- :root{
- --red:#c8102e;--ink:#14171a;--sub:#5b636b;--line:#e4e7ea;--bg:#ffffff;--wash:#f5f6f8;
- --sans:'Helvetica Neue',Arial,system-ui,sans-serif;--serif:Georgia,'Times New Roman',serif;
- }
- *{box-sizing:border-box;margin:0;padding:0}
- body{font-family:var(--sans);color:var(--ink);background:var(--bg);line-height:1.4}
- a{color:inherit;text-decoration:none}
- .wrap{max-width:1200px;margin:0 auto;padding:0 20px}
- /* utility bar */
- .util{background:var(--ink);color:#cfd4d9;font-size:12px}
- .util .wrap{display:flex;justify-content:space-between;align-items:center;height:34px}
- .ticker{display:flex;gap:20px;overflow:hidden;white-space:nowrap}
- .ticker b{color:#fff}.up{color:#4ade80}.dn{color:#f87171}
- .util .acts a{margin-left:16px;color:#cfd4d9}
- .util .acts a.sub{color:#fff;background:var(--red);padding:4px 12px;border-radius:3px;font-weight:700}
- /* masthead */
- .mast{border-bottom:2px solid var(--ink);padding:18px 0 12px}
- .mast .wrap{display:flex;align-items:center;justify-content:space-between}
- .logo{font-weight:800;font-size:34px;letter-spacing:-1px}
- .logo span{color:var(--red)}
- .logo small{display:block;font-size:11px;font-weight:600;letter-spacing:3px;color:var(--sub);text-transform:uppercase;margin-top:2px}
- .datebox{font-size:12px;color:var(--sub);text-align:right}
- /* nav */
- nav{border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;z-index:10}
- nav .wrap{display:flex;gap:2px;align-items:center;height:46px;overflow-x:auto}
- nav a{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:14px 14px;color:var(--ink);border-bottom:3px solid transparent;white-space:nowrap}
- nav a:hover,nav a.on{color:var(--red);border-color:var(--red)}
- /* breaking strip */
- .breaking{background:var(--red);color:#fff;font-size:13px}
- .breaking .wrap{display:flex;align-items:center;gap:14px;height:40px;overflow:hidden}
- .breaking .tag{background:#fff;color:var(--red);font-weight:800;text-transform:uppercase;font-size:11px;letter-spacing:.08em;padding:3px 9px;border-radius:2px}
- .breaking .items{display:flex;gap:26px;white-space:nowrap;font-weight:600}
- /* layout */
- .grid{display:grid;grid-template-columns:1fr 320px;gap:34px;padding:28px 0}
- .chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--red);margin-bottom:6px}
- /* hero */
- .lead{border-bottom:1px solid var(--line);padding-bottom:22px;margin-bottom:22px}
- .lead .img{aspect-ratio:16/8;border-radius:6px;background:linear-gradient(135deg,#1f2937,#c8102e);position:relative;overflow:hidden}
- .lead .img::after{content:'RENTV PHOTO';position:absolute;right:12px;bottom:10px;color:rgba(255,255,255,.55);font-size:11px;letter-spacing:.2em}
- .lead h1{font-family:var(--serif);font-size:38px;line-height:1.12;margin:14px 0 8px;letter-spacing:-.5px}
- .lead p{color:var(--sub);font-size:16px;max-width:52ch}
- .byline{font-size:12px;color:var(--sub);margin-top:10px}
- .subleads{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:22px}
- .subleads .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,#334155,#64748b)}
- .subleads h3{font-family:var(--serif);font-size:20px;line-height:1.2;margin:10px 0 4px}
- .subleads p{font-size:13px;color:var(--sub)}
- /* section header */
- .sechead{display:flex;align-items:center;gap:12px;border-top:3px solid var(--ink);padding-top:10px;margin:30px 0 16px}
- .sechead h2{font-size:16px;text-transform:uppercase;letter-spacing:.06em}
- .sechead a{margin-left:auto;font-size:12px;color:var(--red);font-weight:700}
- /* card grid */
- .cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
- .card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,#475569,#94a3b8)}
- .card:nth-child(2) .img{background:linear-gradient(135deg,#7c2d12,#c8102e)}
- .card:nth-child(3) .img{background:linear-gradient(135deg,#0f766e,#14b8a6)}
- .card:nth-child(5) .img{background:linear-gradient(135deg,#1e3a8a,#3b82f6)}
- .card h4{font-family:var(--serif);font-size:17px;line-height:1.22;margin:9px 0 4px}
- .card .byline{margin-top:6px}
- /* rail */
- .rail>*{margin-bottom:26px}
- .box{border:1px solid var(--line);border-radius:6px;padding:18px}
- .news-signup{background:var(--ink);color:#fff;border:0}
- .news-signup h3{font-size:18px;margin-bottom:6px}
- .news-signup p{font-size:13px;color:#b9c0c7;margin-bottom:12px}
- .news-signup input{width:100%;padding:11px;border:0;border-radius:4px;font-size:14px;margin-bottom:8px}
- .news-signup button{width:100%;padding:11px;background:var(--red);color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
- .rail .sechead{margin-top:0}
- .mostread{counter-reset:mr;list-style:none}
- .mostread li{counter-increment:mr;display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--line)}
- .mostread li::before{content:counter(mr);color:var(--red);font-family:var(--serif);font-size:26px;font-weight:700;line-height:1}
- .mostread a{font-size:14px;font-weight:600;line-height:1.25}
- .conf{background:linear-gradient(135deg,#111827,#c8102e);color:#fff;border:0;border-radius:6px;padding:22px}
- .conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.8}
- .conf h3{font-family:var(--serif);font-size:24px;margin:6px 0 8px}
- .conf p{font-size:13px;opacity:.9;margin-bottom:14px}
- .conf a{display:inline-block;background:#fff;color:var(--red);font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px}
- .market{font-size:13px}
- .market .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line)}
- .market .row:last-child{border:0}
- /* deal strip */
- .deal{background:var(--wash);border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:20px 0;margin-top:8px}
- .deal .wrap{display:flex;align-items:center;gap:22px}
- .deal .badge{background:var(--red);color:#fff;font-weight:800;text-transform:uppercase;font-size:12px;letter-spacing:.06em;padding:8px 14px;border-radius:3px;white-space:nowrap}
- .deal b{font-family:var(--serif);font-size:18px}
- .deal span{color:var(--sub);font-size:13px}
- /* footer */
- footer{background:var(--ink);color:#aeb6bd;margin-top:36px;padding:40px 0 30px;font-size:13px}
- footer .cols{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:28px}
- footer .logo{color:#fff;font-size:26px;margin-bottom:8px}
- footer h5{color:#fff;font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}
- footer a{display:block;padding:4px 0;color:#aeb6bd}
- footer .fine{border-top:1px solid #2a2f34;margin-top:26px;padding-top:16px;font-size:12px;color:#7c848b}
- .concept-flag{position:fixed;left:0;bottom:0;background:#111;color:#fff;font-size:11px;letter-spacing:.1em;padding:6px 12px;border-top-right-radius:6px;font-family:var(--sans);z-index:50}
- @media(max-width:860px){.grid{grid-template-columns:1fr}.cards{grid-template-columns:1fr 1fr}.subleads{grid-template-columns:1fr}}
-</style>
-</head>
-<body>
-
- <!-- utility bar with market ticker -->
- <div class="util"><div class="wrap">
- <div class="ticker">
- <span><b>CRE INDEX</b> 4,182 <span class="up">▲ 0.6%</span></span>
- <span><b>10-YR</b> 4.21% <span class="dn">▼ 3bps</span></span>
- <span><b>CAP RATE (Office)</b> 7.4%</span>
- <span><b>LA VACANCY</b> 23.1%</span>
- </div>
- <div class="acts"><a href="#">Newsletters</a><a href="#">Advertise</a><a href="#">Log In</a><a class="sub" href="#">Subscribe</a></div>
- </div></div>
-
- <!-- masthead -->
- <header class="mast"><div class="wrap">
- <div class="logo">REN<span>TV</span>.com<small>Commercial Real Estate News</small></div>
- <div class="datebox">Western U.S. Edition<br>Friday, July 17, 2026</div>
- </div></header>
-
- <!-- section nav -->
- <nav><div class="wrap">
- <a class="on" href="#">Home</a><a href="#">Deals</a><a href="#">Sales</a><a href="#">Leases</a>
- <a href="#">Financing</a><a href="#">Development</a><a href="#">Markets</a>
- <a href="#">People</a><a href="#">Conferences</a><a href="#">Video</a>
- </div></nav>
-
- <!-- breaking strip -->
- <div class="breaking"><div class="wrap">
- <span class="tag">Breaking</span>
- <div class="items">
- <span>$212M multifamily portfolio trades in the San Fernando Valley</span>·
- <span>Downtown LA office tower lands 140K SF lease</span>·
- <span>Industrial cap rates compress across the Inland Empire</span>
- </div>
- </div></div>
-
- <div class="wrap">
- <div class="grid">
- <!-- main column -->
- <main>
- <article class="lead">
- <div class="img"></div>
- <span class="chip" style="margin-top:14px">Deals · Los Angeles</span>
- <h1>Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1>
- <p>The all-cash trade — one of the largest SoCal multifamily deals of the year — signals renewed confidence in workforce housing as rate expectations settle.</p>
- <div class="byline">By RENTV Staff · 2 hours ago · 4 min read</div>
- </article>
-
- <div class="subleads">
- <article><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article>
- <article><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article>
- </div>
-
- <div class="sechead"><h2>Latest CRE News</h2><a href="#">View all →</a></div>
- <div class="cards">
- <article class="card"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record Low Cap Rate</h4><div class="byline">RENTV Staff · 5h ago</div></article>
- <article class="card"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byline">RENTV Staff · 6h ago</div></article>
- <article class="card"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byline">RENTV Staff · 8h ago</div></article>
- <article class="card"><div class="img"></div><span class="chip">People</span><h4>Veteran Capital Markets Broker Joins Regional Brokerage</h4><div class="byline">RENTV Staff · 9h ago</div></article>
- <article class="card"><div class="img"></div><span class="chip">Markets</span><h4>Phoenix Industrial Absorption Rebounds in Q2</h4><div class="byline">RENTV Staff · 11h ago</div></article>
- <article class="card"><div class="img"></div><span class="chip">Financing</span><h4>Agency Lender Provides $48M on Bay Area Apartments</h4><div class="byline">RENTV Staff · 12h ago</div></article>
- </div>
- </main>
-
- <!-- right rail -->
- <aside class="rail">
- <div class="news-signup box">
- <h3>The RENTV Daily</h3>
- <p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p>
- <input placeholder="you@company.com"><button>Subscribe free</button>
- </div>
-
- <div>
- <div class="sechead"><h2>Most Read</h2></div>
- <ol class="mostread">
- <li><a href="#">Blackstone-backed venture buys SoCal logistics campus for $340M</a></li>
- <li><a href="#">Office-to-resi conversions accelerate in Downtown LA</a></li>
- <li><a href="#">Top 10 Western-U.S. multifamily deals of Q2 2026</a></li>
- <li><a href="#">Where CRE cap rates are heading into 2027</a></li>
- <li><a href="#">Data-center demand reshapes the Reno-Sparks market</a></li>
- </ol>
- </div>
-
- <div class="conf">
- <div class="k">RENTV Conferences</div>
- <h3>SoCal Real Estate Summit 2026</h3>
- <p>Join 600+ brokers, investors & developers. Sept 24 · Los Angeles.</p>
- <a href="#">Register now →</a>
- </div>
-
- <div class="box market">
- <div class="sechead" style="margin-top:0"><h2>Market Snapshot</h2></div>
- <div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div>
- <div class="row"><span>IE Industrial Cap Rate</span><b>5.2%</b></div>
- <div class="row"><span>SF Multifamily Rent YoY</span><b class="up">+3.4%</b></div>
- <div class="row"><span>Construction Starts</span><b class="dn">−8.7%</b></div>
- </div>
- </aside>
- </div>
- </div>
-
- <!-- deal of the day -->
- <div class="deal"><div class="wrap">
- <span class="badge">Deal of the Day</span>
- <b>Sherman Oaks Class-A office sells for $88M</b>
- <span>· 214,000 SF · $411/SF · closed off-market · financing by a national debt fund</span>
- </div></div>
-
- <!-- footer -->
- <footer><div class="wrap">
- <div class="cols">
- <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals, and conferences across the Western United States since the 1990s.</p></div>
- <div><h5>Sections</h5><a href="#">Deals</a><a href="#">Sales</a><a href="#">Leases</a><a href="#">Financing</a><a href="#">Markets</a></div>
- <div><h5>Company</h5><a href="#">About</a><a href="#">Advertise</a><a href="#">Conferences</a><a href="#">Contact</a></div>
- <div><h5>Follow</h5><a href="#">LinkedIn</a><a href="#">X / Twitter</a><a href="#">Newsletters</a><a href="#">RSS</a></div>
- </div>
- <div class="fine">© 2026 RENTV.com · rentadmin@rentv.com · (424) 419-4021 — Concept redesign. Sample headlines for layout only.</div>
- </div></footer>
-
- <div class="concept-flag">RENTV · FLAGSHIP CONCEPT — emulates the CRE-news leaders (The Real Deal · Bisnow · Commercial Observer)</div>
-</body>
-</html>
diff --git a/public/versions/modern.html b/public/versions/modern.html
index a5eba79..0faa185 100644
--- a/public/versions/modern.html
+++ b/public/versions/modern.html
@@ -1,27 +1,86 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Modern / minimal</title>
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Modern concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
<style>
-:root{--bg:#ffffff;--ink:#0b0b0d;--accent:#2b6cff}
-*{box-sizing:border-box}body{margin:0;font-family:'Helvetica Neue',system-ui,sans-serif;background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
+:root{--bg:#0e0f11;--panel:#17181b;--ink:#f2f3f5;--gold:#8b5cf6;--line:rgba(139,92,246,.30)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Inter',system-ui,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Inter',system-ui,sans-serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#0b0b0c;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'Inter',system-ui,sans-serif}
+.util{background:#000;color:#c9ccd1;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'Inter',system-ui,sans-serif;font-weight:800;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'Inter',system-ui,sans-serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#0b0b0c;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#0b0b0c;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'Inter',system-ui,sans-serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'Inter',system-ui,sans-serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'Inter',system-ui,sans-serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#0b0b0c;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#0b0b0c;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'Inter',system-ui,sans-serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'Inter',system-ui,sans-serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#000;color:#aeb6bd;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
</style></head><body>
-<div class="bar"><b>RENTV.com</b><span>Modern / minimal concept</span></div>
-<div class="hero">
- <div class="k">Commercial real estate news, deals & conferences · Los Angeles / Western U.S.</div>
- <h1>RENTV.com</h1>
- <p>Commercial real estate news, deals & conferences.</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-<div class="goals"><div>Modernize the dated legacy site into a fast, mobile-first CRE news experience</div><div>Grow newsletter + subscriber audience for daily deal coverage</div><div>Promote RENTV Conferences and drive event registrations</div><div>Build an integrated-social engine to distribute CRE deal news (LinkedIn, X, Instagram)</div></div>
-<div class="foot">Concept "modern" · generated 2026-07-17 · one of several directions to choose from.</div>
+<a class="badge" href="/portal#suggested">◀ Concept · Axios direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>Modern · Axios direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "Modern" (Axios direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
</body></html>
\ No newline at end of file
diff --git a/public/versions/observer.html b/public/versions/observer.html
new file mode 100644
index 0000000..bc6a5f0
--- /dev/null
+++ b/public/versions/observer.html
@@ -0,0 +1,86 @@
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — The Observer concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
+<style>
+:root{--bg:#14110c;--panel:#1e1a12;--ink:#f6efe2;--gold:#c9a24b;--line:rgba(201,162,75,.30)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Jost',system-ui,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Cormorant Garamond',Georgia,serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#0b0b0c;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'Jost',system-ui,sans-serif}
+.util{background:#000;color:#c9ccd1;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'Cormorant Garamond',Georgia,serif;font-weight:800;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'Jost',system-ui,sans-serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#0b0b0c;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#0b0b0c;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'Cormorant Garamond',Georgia,serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'Cormorant Garamond',Georgia,serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'Cormorant Garamond',Georgia,serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#0b0b0c;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#0b0b0c;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'Cormorant Garamond',Georgia,serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'Cormorant Garamond',Georgia,serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#000;color:#aeb6bd;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
+</style></head><body>
+<a class="badge" href="/portal#suggested">◀ Concept · Commercial Observer direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>The Observer · Commercial Observer direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "The Observer" (Commercial Observer direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/terminal.html b/public/versions/terminal.html
new file mode 100644
index 0000000..449ce06
--- /dev/null
+++ b/public/versions/terminal.html
@@ -0,0 +1,86 @@
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — Terminal concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
+<style>
+:root{--bg:#0a0e12;--panel:#111820;--ink:#e9eef3;--gold:#37d39a;--line:rgba(55,211,154,.28)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'IBM Plex Sans',system-ui,sans-serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#0b0b0c;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'IBM Plex Sans',system-ui,sans-serif}
+.util{background:#000;color:#c9ccd1;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'IBM Plex Sans',system-ui,sans-serif;font-weight:800;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'IBM Plex Sans',system-ui,sans-serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#0b0b0c;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#0b0b0c;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#0b0b0c;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#0b0b0c;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'IBM Plex Sans',system-ui,sans-serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#000;color:#aeb6bd;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
+</style></head><body>
+<a class="badge" href="/portal#suggested">◀ Concept · CoStar / GlobeSt direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>Terminal · CoStar / GlobeSt direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "Terminal" (CoStar / GlobeSt direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/thewire.html b/public/versions/thewire.html
new file mode 100644
index 0000000..73c48c7
--- /dev/null
+++ b/public/versions/thewire.html
@@ -0,0 +1,86 @@
+<!doctype html><html lang="en"><head>
+<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
+<title>RENTV.com — The Wire concept</title>
+<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=Cormorant+Garamond:ital,wght@0,400;1,400&family=Inter:wght@300;400;600;800&family=Jost:wght@300;400;500&family=IBM+Plex+Sans:wght@300;400;600&display=swap" rel="stylesheet">
+<style>
+:root{--bg:#111114;--panel:#1a1a1f;--ink:#f5f5f7;--gold:#e0243b;--line:rgba(224,36,59,.30)}
+*{margin:0;padding:0;box-sizing:border-box}
+body{background:var(--bg);color:var(--ink);font-family:'Inter',system-ui,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}
+.disp{font-family:'Playfair Display',Georgia,serif}a{color:inherit;text-decoration:none}
+.rv{opacity:0;transform:translateY(24px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
+.rv.in{opacity:1;transform:none}
+.badge{position:fixed;left:16px;bottom:16px;z-index:60;background:var(--gold);color:#0b0b0c;font-size:10px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;border-radius:2px;font-family:'Inter',system-ui,sans-serif}
+.util{background:#000;color:#c9ccd1;font-size:12px}
+.util .in{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;padding:8px 20px}
+.tick{display:flex;gap:22px;overflow:hidden;white-space:nowrap}.tick b{color:var(--gold)}
+.mast{border-bottom:2px solid var(--gold);max-width:1200px;margin:0 auto;padding:20px}
+.mast .in{display:flex;justify-content:space-between;align-items:flex-end}
+.logo{font-family:'Playfair Display',Georgia,serif;font-weight:800;font-size:34px;letter-spacing:-.5px}.logo span{color:var(--gold)}
+.logo small{display:block;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-top:3px;font-family:'Inter',system-ui,sans-serif;font-weight:400}
+nav.sec{border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;background:var(--bg)}
+nav.sec .in{max-width:1200px;margin:0 auto;display:flex;gap:2px;overflow:auto;padding:0 12px}
+nav.sec a{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;padding:15px 13px;white-space:nowrap;border-bottom:3px solid transparent}
+nav.sec a:hover{color:var(--gold);border-color:var(--gold)}
+.breaking{background:var(--gold);color:#0b0b0c;font-size:13px}
+.breaking .in{max-width:1200px;margin:0 auto;display:flex;gap:14px;align-items:center;padding:10px 20px;overflow:hidden}
+.breaking b{background:#0b0b0c;color:var(--gold);font-size:11px;font-weight:800;text-transform:uppercase;padding:3px 9px;border-radius:2px;white-space:nowrap}
+.wrap{max-width:1200px;margin:0 auto;padding:0 20px}
+.grid{display:grid;grid-template-columns:1fr 330px;gap:34px;padding:28px 0}
+.chip{display:inline-block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);margin-bottom:6px}
+.lead .img{aspect-ratio:16/8;border-radius:6px;overflow:hidden;background:linear-gradient(135deg,var(--panel),var(--gold))}
+.lead .img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85)}
+.lead h1{font-family:'Playfair Display',Georgia,serif;font-size:40px;line-height:1.1;margin:14px 0 8px}
+.lead p{opacity:.75;font-size:17px;max-width:54ch}.byl{font-size:12px;opacity:.6;margin-top:10px}
+.subs{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px;border-top:1px solid var(--line);padding-top:22px}
+.subs .img{aspect-ratio:16/9;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 60%,var(--panel)))}
+.subs h3{font-family:'Playfair Display',Georgia,serif;font-size:19px;margin:9px 0 4px;line-height:1.2}.subs p{font-size:13px;opacity:.7}
+.sh{display:flex;align-items:center;gap:12px;border-top:3px solid var(--gold);padding-top:10px;margin:30px 0 16px}.sh h2{font-size:15px;text-transform:uppercase;letter-spacing:.06em}
+.cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
+.card .img{aspect-ratio:16/10;border-radius:5px;background:linear-gradient(135deg,var(--panel),color-mix(in srgb,var(--gold) 45%,var(--panel)))}
+.card h4{font-family:'Playfair Display',Georgia,serif;font-size:17px;line-height:1.22;margin:9px 0 4px}.card .byl{margin-top:6px}
+.rail>*{margin-bottom:24px}.box{border:1px solid var(--line);border-radius:6px;padding:18px}
+.ns{background:var(--gold);color:#0b0b0c;border:0}.ns h3{font-size:18px;margin-bottom:6px}.ns p{font-size:13px;opacity:.85;margin-bottom:12px}
+.ns input{width:100%;padding:11px;border:0;border-radius:4px;margin-bottom:8px;font-size:14px}
+.ns button{width:100%;padding:11px;background:#0b0b0c;color:#fff;border:0;border-radius:4px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;font-size:12px;cursor:pointer}
+.mr{list-style:none;counter-reset:m}.mr li{counter-increment:m;display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line)}
+.mr li::before{content:counter(m);font-family:'Playfair Display',Georgia,serif;font-size:24px;color:var(--gold);line-height:1}.mr a{font-size:14px;font-weight:600;line-height:1.25}
+.conf{background:linear-gradient(135deg,var(--panel),var(--gold));border-radius:6px;padding:22px;color:#fff}
+.conf .k{font-size:11px;letter-spacing:.2em;text-transform:uppercase;opacity:.85}.conf h3{font-family:'Playfair Display',Georgia,serif;font-size:22px;margin:6px 0 8px}
+.conf a{display:inline-block;background:#fff;color:#111;font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;padding:9px 16px;border-radius:4px;margin-top:6px}
+.mkt .row{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}.mkt .row:last-child{border:0}
+footer{background:#000;color:#aeb6bd;margin-top:30px;padding:36px 0;font-size:13px}
+footer .in{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:24px}
+footer .logo{color:#fff;font-size:24px}footer h5{color:var(--gold);font-size:11px;text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px}footer a{display:block;padding:3px 0}
+@media(max-width:860px){.grid{grid-template-columns:1fr}.cards,.subs{grid-template-columns:1fr 1fr}}
+</style></head><body>
+<a class="badge" href="/portal#suggested">◀ Concept · The Real Deal direction</a>
+<div class="util"><div class="in"><div class="tick"><span><b>CRE INDEX</b> 4,182 ▲0.6%</span><span><b>10-YR</b> 4.21%</span><span><b>LA VAC</b> 23.1%</span><span><b>IE CAP</b> 5.2%</span></div><div>Subscribe · Log In</div></div></div>
+<header class="mast"><div class="in"><div class="logo">REN<span>TV</span>.com<small>The Wire · The Real Deal direction</small></div><div style="font-size:12px;opacity:.7;text-align:right">Western U.S. Edition<br>Friday, July 17, 2026</div></div></header>
+<nav class="sec"><div class="in"><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a><a>Development</a><a>Markets</a><a>People</a><a>Conferences</a><a>Video</a></div></nav>
+<div class="breaking"><div class="in"><b>Breaking</b><span>$212M multifamily portfolio trades in the San Fernando Valley · Downtown LA tower lands 140K SF lease · IE industrial cap rates compress</span></div></div>
+<div class="wrap"><div class="grid">
+ <main>
+ <article class="lead rv"><div class="img"><img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?auto=format&fit=crop&w=1920&q=68&sat=-40" alt="" loading="lazy"></div><span class="chip" style="margin-top:14px">Deals · Los Angeles</span><h1 class="disp">Institutional Buyer Pays $212M for 8-Property Valley Multifamily Portfolio</h1><p>One of the largest SoCal multifamily trades of the year signals renewed confidence in workforce housing as rate expectations settle.</p><div class="byl">By RENTV Staff · 2 hours ago · 4 min read</div></article>
+ <div class="subs"><article class="rv"><div class="img"></div><span class="chip">Financing</span><h3>Bridge Lender Closes $95M Recap on Century City Office</h3><p>Sponsors extend runway as maturities loom across the Westside.</p></article><article class="rv"><div class="img"></div><span class="chip">Leases</span><h3>Life-Science Tenant Takes 140K SF in Pasadena</h3><p>Lab conversions keep the San Gabriel Valley pipeline moving.</p></article></div>
+ <div class="sh rv"><h2>Latest CRE News</h2></div>
+ <div class="cards">
+ <article class="card rv"><div class="img"></div><span class="chip">Sales</span><h4>Inland Empire Warehouse Trades at Record-Low Cap Rate</h4><div class="byl">RENTV Staff · 5h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Development</span><h4>320-Unit Mixed-Use Project Breaks Ground in San Diego</h4><div class="byl">RENTV Staff · 6h</div></article>
+ <article class="card rv"><div class="img"></div><span class="chip">Retail</span><h4>Grocery-Anchored Center Sells in Orange County for $61M</h4><div class="byl">RENTV Staff · 8h</div></article>
+ </div>
+ </main>
+ <aside class="rail">
+ <div class="ns box rv"><h3>The RENTV Daily</h3><p>Western-U.S. commercial real estate deals in your inbox every morning — free.</p><input placeholder="you@company.com"><button>Subscribe free</button></div>
+ <div class="rv"><div class="sh" style="margin-top:0"><h2>Most Read</h2></div><ol class="mr"><li><a>Blackstone venture buys SoCal logistics campus for $340M</a></li><li><a>Office-to-resi conversions accelerate in DTLA</a></li><li><a>Top 10 Western-U.S. multifamily deals of Q2</a></li><li><a>Where CRE cap rates are heading into 2027</a></li></ol></div>
+ <div class="conf rv"><div class="k">RENTV Conferences</div><h3>SoCal Real Estate Summit 2026</h3><p style="font-size:13px;opacity:.9">600+ brokers, investors & developers · Sept 24 · Los Angeles.</p><a>Register →</a></div>
+ <div class="box mkt rv"><div class="sh" style="margin-top:0"><h2>Market Snapshot</h2></div><div class="row"><span>LA Office Vacancy</span><b>23.1%</b></div><div class="row"><span>IE Industrial Cap</span><b>5.2%</b></div><div class="row"><span>SF Multifamily Rent YoY</span><b style="color:var(--gold)">+3.4%</b></div><div class="row"><span>Construction Starts</span><b>−8.7%</b></div></div>
+ </aside>
+</div></div>
+<footer><div class="in"><div><div class="logo">REN<span style="color:var(--gold)">TV</span>.com</div><p style="max-width:34ch;opacity:.8;margin-top:8px">CRE news, deals & conferences across the Western U.S. since 1998.</p></div><div><h5>Sections</h5><a>Deals</a><a>Sales</a><a>Leases</a><a>Financing</a></div><div><h5>Company</h5><a>About</a><a>Advertise</a><a>Conferences</a><a>Contact</a></div><div><h5>Follow</h5><a>LinkedIn</a><a>X</a><a>Newsletter</a></div></div></footer>
+<div style="max-width:1200px;margin:0 auto;padding:14px 20px;font-size:12px;opacity:.5">Concept "The Wire" (The Real Deal direction) · sample headlines for layout · one of six directions.</div>
+<script>
+const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.12});
+document.querySelectorAll('.rv').forEach(el=>io.observe(el));
+</script>
+</body></html>
\ No newline at end of file
diff --git a/public/versions/warm.html b/public/versions/warm.html
deleted file mode 100644
index 3559b73..0000000
--- a/public/versions/warm.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html><html lang="en"><head><meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>RENTV.com — Warm / approachable</title>
-<style>
-:root{--bg:#fbf3e9;--ink:#3a2a1c;--accent:#d98a3d}
-*{box-sizing:border-box}body{margin:0;font-family:'Georgia',serif;background:var(--bg);color:var(--ink)}
-.bar{padding:14px 30px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--accent)}
-.bar b{letter-spacing:.06em}.bar span{color:var(--accent);font-size:12px;text-transform:uppercase;letter-spacing:.2em}
-.hero{padding:90px 30px;text-align:center}
-.hero .k{color:var(--accent);letter-spacing:.3em;text-transform:uppercase;font-size:12px}
-.hero h1{font-size:56px;margin:.2em 0;font-weight:700}
-.hero p{font-size:20px;max-width:620px;margin:0 auto;opacity:.8}
-.cta{display:inline-block;margin-top:26px;background:var(--accent);color:var(--bg);padding:14px 32px;text-decoration:none;text-transform:uppercase;letter-spacing:.16em;font-size:13px}
-.goals{max-width:900px;margin:40px auto;padding:0 30px;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:18px}
-.goals div{border:1px solid var(--accent);padding:22px;font-size:17px}
-.foot{padding:40px 30px;text-align:center;opacity:.6;font-size:13px}
-</style></head><body>
-<div class="bar"><b>RENTV.com</b><span>Warm / approachable concept</span></div>
-<div class="hero">
- <div class="k">Commercial real estate news, deals & conferences · Los Angeles / Western U.S.</div>
- <h1>RENTV.com</h1>
- <p>Commercial real estate news, deals & conferences.</p>
- <a class="cta" href="#">Get in touch</a>
-</div>
-<div class="goals"><div>Modernize the dated legacy site into a fast, mobile-first CRE news experience</div><div>Grow newsletter + subscriber audience for daily deal coverage</div><div>Promote RENTV Conferences and drive event registrations</div><div>Build an integrated-social engine to distribute CRE deal news (LinkedIn, X, Instagram)</div></div>
-<div class="foot">Concept "warm" · generated 2026-07-17 · one of several directions to choose from.</div>
-</body></html>
\ No newline at end of file
← cffcab4 SECURITY: remove plaintext creds (incl fleet-master) from si
·
back to Consulting Rentv Com
·
auto-save: 2026-07-17T10:16:09 (4 files) — build.mjs data/cl 5923c95 →