[object Object]

← back to Rentv

security(a11y): rel=noopener noreferrer on all target=_blank anchors fleet-wide

6f7c108053d20ff6a1bef997b375024ea216ef5e · 2026-08-08 08:55:58 -0700 · Steve Abrams

/yoloforever cycle 3 (DTD verdict A, unanimous 5/5): enforce Steve's codified fleet
standing rule ('noopener noreferrer' on external links) across all of public/.
19 anchors had NO rel added; 36 pre-existing rel="noopener" (missing noreferrer,
incl. real external links to linkedin.com / sublease.com / crelc.com) upgraded to
rel="noopener noreferrer". 55 anchors across 18 files; both sweeps now 0 remaining.
Cody gate = FIX FIRST -> caught that the first-pass regex was blind to partial-rel
tags (self-certified '0 remaining' while 36 external noopener-only tags survived);
fixed by adding a second upgrade pass. Diff normalize-verified: ONLY rel attrs changed,
no markup touched. npm test 95 pass / 0 fail; /review /markets /about /conferences 200.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 6f7c108053d20ff6a1bef997b375024ea216ef5e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Aug 8 08:55:58 2026 -0700

    security(a11y): rel=noopener noreferrer on all target=_blank anchors fleet-wide
    
    /yoloforever cycle 3 (DTD verdict A, unanimous 5/5): enforce Steve's codified fleet
    standing rule ('noopener noreferrer' on external links) across all of public/.
    19 anchors had NO rel added; 36 pre-existing rel="noopener" (missing noreferrer,
    incl. real external links to linkedin.com / sublease.com / crelc.com) upgraded to
    rel="noopener noreferrer". 55 anchors across 18 files; both sweeps now 0 remaining.
    Cody gate = FIX FIRST -> caught that the first-pass regex was blind to partial-rel
    tags (self-certified '0 remaining' while 36 external noopener-only tags survived);
    fixed by adding a second upgrade pass. Diff normalize-verified: ONLY rel attrs changed,
    no markup touched. npm test 95 pass / 0 fail; /review /markets /about /conferences 200.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 public/about.html                             |  2 +-
 public/admin/pr-intelligence/credentials.html |  4 ++--
 public/admin/publish.html                     |  2 +-
 public/advertise.html                         |  2 +-
 public/allstar.html                           | 14 +++++++-------
 public/article.html                           |  2 +-
 public/audience.html                          |  2 +-
 public/conferences.html                       |  2 +-
 public/consulting/portal.html                 | 16 ++++++++--------
 public/cre-talk.html                          |  4 ++--
 public/desk.html                              |  2 +-
 public/la-commercial.html                     |  4 ++--
 public/markets.html                           |  2 +-
 public/press/index.html                       |  2 +-
 public/review.html                            |  6 +++---
 public/section.html                           |  2 +-
 public/social.html                            | 16 ++++++++--------
 public/subscribe.html                         |  2 +-
 18 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/public/about.html b/public/about.html
index 14447586..fcbad67f 100644
--- a/public/about.html
+++ b/public/about.html
@@ -119,7 +119,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · 5757 W. Century Blvd, Suite 700, Los Angeles, CA 90045 · (310) 213-6409</div></div></footer>
 <script>
   var t=document.getElementById('today');if(t)t.textContent=new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});
diff --git a/public/admin/pr-intelligence/credentials.html b/public/admin/pr-intelligence/credentials.html
index ec5b6aef..a8483460 100644
--- a/public/admin/pr-intelligence/credentials.html
+++ b/public/admin/pr-intelligence/credentials.html
@@ -41,10 +41,10 @@
     <details open>
       <summary>How to get these 4 values (about 3 minutes)</summary>
       <ol class="steps">
-        <li>Go to <a href="https://console.cloud.google.com/apis/credentials" target="_blank" rel="noopener">Google Cloud Console → Credentials</a>. Create (or pick) a project.</li>
+        <li>Go to <a href="https://console.cloud.google.com/apis/credentials" target="_blank" rel="noopener noreferrer">Google Cloud Console → Credentials</a>. Create (or pick) a project.</li>
         <li><b>Enable the Gmail API:</b> APIs &amp; Services → Library → search “Gmail API” → Enable.</li>
         <li>Credentials → <b>Create Credentials → OAuth client ID</b> → type <b>Web application</b>. Under “Authorized redirect URIs” add <code>https://developers.google.com/oauthplayground</code>. Copy the <b>Client ID</b> and <b>Client Secret</b> below.</li>
-        <li>Open the <a href="https://developers.google.com/oauthplayground" target="_blank" rel="noopener">OAuth 2.0 Playground</a> → gear ⚙ (top right) → check <b>“Use your own OAuth credentials”</b> → paste your Client ID + Secret.</li>
+        <li>Open the <a href="https://developers.google.com/oauthplayground" target="_blank" rel="noopener noreferrer">OAuth 2.0 Playground</a> → gear ⚙ (top right) → check <b>“Use your own OAuth credentials”</b> → paste your Client ID + Secret.</li>
         <li>In the left list, under <b>Gmail API v1</b> select the scope <code>https://www.googleapis.com/auth/gmail.readonly</code> → <b>Authorize APIs</b> → sign in with the Gmail account you want to sync → <b>Exchange authorization code for tokens</b> → copy the <b>Refresh token</b> below.</li>
       </ol>
     </details>
diff --git a/public/admin/publish.html b/public/admin/publish.html
index 47d90e02..b64c8894 100644
--- a/public/admin/publish.html
+++ b/public/admin/publish.html
@@ -48,7 +48,7 @@ function load(){fetch('/api/posts').then(function(r){return r.json();}).then(fun
   $('cnt').textContent='· '+d.count;
   $('list').innerHTML=(d.items||[]).map(function(p){return '<li><span class="badge '+(p.status==='published'?'pub">Live':'dr">Draft')+'</span> <h4 style="display:inline;margin-left:6px">'+esc(p.title)+'</h4>'+
     '<div class="m">'+esc(p.cat)+' · '+esc(p.author)+' · '+esc((p.updated_at||'').slice(0,16).replace("T"," "))+' · '+esc(p.id)+'</div>'+
-    '<div class="act"><a onclick="edit(\''+p.id+'\')">Edit</a><a onclick="pub(\''+p.id+'\',\''+(p.status==='published'?'draft':'published')+'\')">'+(p.status==='published'?'Unpublish':'Publish')+'</a><a class="del" onclick="del(\''+p.id+'\')">Delete</a> <a href="/post/'+p.id+'" target="_blank">Open ↗</a></div></li>';}).join('')||'<li class="mut">No posts yet — write your first above.</li>';
+    '<div class="act"><a onclick="edit(\''+p.id+'\')">Edit</a><a onclick="pub(\''+p.id+'\',\''+(p.status==='published'?'draft':'published')+'\')">'+(p.status==='published'?'Unpublish':'Publish')+'</a><a class="del" onclick="del(\''+p.id+'\')">Delete</a> <a rel="noopener noreferrer" href="/post/'+p.id+'" target="_blank">Open ↗</a></div></li>';}).join('')||'<li class="mut">No posts yet — write your first above.</li>';
 });}
 window.edit=function(id){fetch('/api/posts/'+id).then(function(r){return r.json();}).then(function(p){
   $('pid').value=p.id;$('title').value=p.title||'';$('cat').value=p.cat||'';$('author').value=p.author||'';$('dek').value=p.dek||'';$('image').value=p.image||'';$('body').value=p.body||'';$('status').value=p.status||'draft';
diff --git a/public/advertise.html b/public/advertise.html
index 1828e386..9756618e 100644
--- a/public/advertise.html
+++ b/public/advertise.html
@@ -128,7 +128,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · 5757 W. Century Blvd, Suite 700, Los Angeles, CA 90045 · (310) 213-6409</div></div></footer>
 <script>
   var t=document.getElementById('today');if(t)t.textContent=new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});
diff --git a/public/allstar.html b/public/allstar.html
index 65be18a1..32cdf9ed 100644
--- a/public/allstar.html
+++ b/public/allstar.html
@@ -266,7 +266,7 @@
       <div class="k">2026 Flagship</div>
       <h3>CRE &amp; Lending Conference</h3>
       <div class="d">Wed · April 29, 2026 · The Westin Long Beach · 30+ expert speakers</div>
-      <a href="https://crelc.com/socal/" target="_blank" rel="noopener">Register at crelc.com →</a>
+      <a href="https://crelc.com/socal/" target="_blank" rel="noopener noreferrer">Register at crelc.com →</a>
     </div>
     </div>
   </div>
@@ -310,7 +310,7 @@
 <section class="panel wrap" id="events" style="max-width:var(--maxw)">
   <h2 class="rule" style="margin-top:8px">2026 event calendar</h2>
   <p class="lede">All Star Group produces the industry's signature CRE, lending and hospitality gatherings.
-  The 2026 flagship is confirmed below; recurring series return on their usual annual cadence with dates announced through <a href="https://crelc.com/" target="_blank" rel="noopener" style="color:var(--red);font-weight:700">crelc.com</a>.</p>
+  The 2026 flagship is confirmed below; recurring series return on their usual annual cadence with dates announced through <a href="https://crelc.com/" target="_blank" rel="noopener noreferrer" style="color:var(--red);font-weight:700">crelc.com</a>.</p>
 
   <div class="ev flag">
     <div class="date"><div class="mo">Apr</div><div class="dy">29</div><div class="yr">2026</div></div>
@@ -318,7 +318,7 @@
       <h4>Commercial Real Estate &amp; Lending Conference (CRELC) — So. California</h4>
       <div class="meta"><span class="pin">📍 The Westin Long Beach</span> · 30+ expert speakers: economists, lenders, developers, brokers &amp; attorneys · <b>Flagship</b></div>
     </div>
-    <a class="btn go" href="https://crelc.com/socal/" target="_blank" rel="noopener">Register →</a>
+    <a class="btn go" href="https://crelc.com/socal/" target="_blank" rel="noopener noreferrer">Register →</a>
   </div>
 
   <div class="ev">
@@ -327,7 +327,7 @@
       <h4>Commercial Real Estate Summit — ONLINE</h4>
       <div class="meta">Virtual half-day summit · national audience · <span class="tba">Date TBA</span></div>
     </div>
-    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener">Details →</a>
+    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener noreferrer">Details →</a>
   </div>
 
   <div class="ev">
@@ -336,7 +336,7 @@
       <h4>LoanMakers Forum — Networking Luncheon &amp; Expo</h4>
       <div class="meta">Lender &amp; broker networking expo · <span class="tba">Date TBA</span></div>
     </div>
-    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener">Details →</a>
+    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener noreferrer">Details →</a>
   </div>
 
   <div class="ev">
@@ -345,7 +345,7 @@
       <h4>Commercial Real Estate Networking Expo — Northern California</h4>
       <div class="meta">Bay Area CRE &amp; lending networking · <span class="tba">Date TBA</span></div>
     </div>
-    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener">Details →</a>
+    <a class="btn ghost go" href="https://allstargroup.com/" target="_blank" rel="noopener noreferrer">Details →</a>
   </div>
 
   <h2 class="rule">What to expect on stage</h2>
@@ -370,7 +370,7 @@
       <div class="k">Established</div>
       <h3>Sept. 1995</h3>
       <div class="d">30 years financing income property and convening the people who lend on it.</div>
-      <a href="https://allstargroup.com/" target="_blank" rel="noopener">allstargroup.com →</a>
+      <a href="https://allstargroup.com/" target="_blank" rel="noopener noreferrer">allstargroup.com →</a>
     </div>
   </div>
 
diff --git a/public/article.html b/public/article.html
index fce5e2da..ff1a104b 100644
--- a/public/article.html
+++ b/public/article.html
@@ -85,7 +85,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · Commercial real estate news, Western U.S. · Headlines refreshed live from rentv.com</div></div></footer>
 
 <script>
diff --git a/public/audience.html b/public/audience.html
index 2505ef24..e494e038 100644
--- a/public/audience.html
+++ b/public/audience.html
@@ -109,7 +109,7 @@ const esc=s=>String(s==null?'':s).replace(/[&<>"]/g,c=>({'&':'&amp;','<':'&lt;',
 const dstr=d=>d?new Date(d).toLocaleDateString(undefined,{month:'short',day:'numeric',year:'numeric'}):'—';
 const fmtWhen=d=>{try{return new Date(d).toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'});}catch(e){return d||'—';}};
 const LI_P=(n,f)=>`https://www.linkedin.com/search/results/people/?keywords=${enc([n,f].filter(Boolean).join(' '))}`,LI_C=f=>`https://www.linkedin.com/search/results/companies/?keywords=${enc(f)}`,GOOG=q=>`https://www.google.com/search?q=${enc(q)}`,MAPS=q=>`https://www.google.com/maps/search/?api=1&query=${enc(q)}`;
-const A=(h,i,l)=>`<a class="act" href="${h}" target="_blank" rel="noopener" onclick="event.stopPropagation()"><span class="i">${i}</span>${l}</a>`;
+const A=(h,i,l)=>`<a class="act" href="${h}" target="_blank" rel="noopener noreferrer" onclick="event.stopPropagation()"><span class="i">${i}</span>${l}</a>`;
 function contactActions(c){
   return [
     c.email?A('mailto:'+c.email,'✉️','Email'):'',
diff --git a/public/conferences.html b/public/conferences.html
index 99cd3d0d..66fa61dc 100644
--- a/public/conferences.html
+++ b/public/conferences.html
@@ -116,7 +116,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · 5757 W. Century Blvd, Suite 700, Los Angeles, CA 90045 · (310) 213-6409</div></div></footer>
 <script>
   var t=document.getElementById('today');if(t)t.textContent=new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});
diff --git a/public/consulting/portal.html b/public/consulting/portal.html
index f0a2d4c0..9fdbb92e 100644
--- a/public/consulting/portal.html
+++ b/public/consulting/portal.html
@@ -162,7 +162,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 <nav class="menu" id="portalmenu" onclick="if(event.target.closest('a'))document.body.classList.remove('nav')">
   <a class="mbrand" href="#summary">REN<span>TV</span>.com<small>Growth Strategy · 2026</small></a>
   <div class="mh">Contents</div><a href="#summary">Executive Summary</a><a href="#swot">SWOT Analysis</a><a href="#lowhanging">Low Hanging Fruit</a><a href="#reputation">Reputation &amp; Authority</a><a href="#empire">The Empire &amp; Sublease.com</a><a href="#competitors">Competitors</a><a href="#wires">News + Conference Rivals</a><a href="#advertising">Where to Advertise</a><a href="#timing">Timing &amp; Cadence</a><a href="#audit">Website Audit</a><a href="#teardown">Page-by-Page Teardown</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><a href="#sources">Sources &amp; Methodology</a>
-  <div class="minfo"><div class="mh">RENTV.com, Inc.</div><p>5757 W. Century Blvd., #700, Los Angeles, CA 90045</p><p>Steve Bloom — Owner / Producer · (310) 213-6409</p><p>Arnie Garfinkel — CRE Talk co-host · (818) 532-7660</p><p>Allen Wolfsheimer — News/Resources · (310) 836-8238</p><p>Daniel Ginzburg — CFO, Dandeana Corp · (424) 251-8405</p><p><span>rentv.com</span> · <a href="https://www.rentvreview.com" target="_blank" rel="noopener">The REview ↗</a> · <a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn ↗</a></p></div>
+  <div class="minfo"><div class="mh">RENTV.com, Inc.</div><p>5757 W. Century Blvd., #700, Los Angeles, CA 90045</p><p>Steve Bloom — Owner / Producer · (310) 213-6409</p><p>Arnie Garfinkel — CRE Talk co-host · (818) 532-7660</p><p>Allen Wolfsheimer — News/Resources · (310) 836-8238</p><p>Daniel Ginzburg — CFO, Dandeana Corp · (424) 251-8405</p><p><span>rentv.com</span> · <a href="https://www.rentvreview.com" target="_blank" rel="noopener noreferrer">The REview ↗</a> · <a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn ↗</a></p></div>
 </nav>
 
 <div class="hero" id="summary">
@@ -279,7 +279,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 
 <section id="teardown"><div class="eyebrow">07 · Page-by-Page Teardown</div><h2 class="disp">Every page, graded — with the fix.</h2><div class="accbody">
   <p class="lead2">We captured every page of rentv.com live and put each through an adversarial review. The pattern: <b>the content operation works — the website destroys it at every conversion point.</b> Headline finding: the site still runs <b>Universal Analytics (UA-148799896-1)</b>, which Google shut down in 2023 — <b>there has been no traffic data for ~3 years</b>. Every decision below is currently being made blind.</p>
-  <div class="tdp rv"><div class="tdshot"><a href="/portal/audit/index.png" target="_blank"><img src="/portal/audit/index.png" loading="lazy" alt="index screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D+</span><h3 class="disp">rentv.com (homepage)</h3></div><div class="tdl">Issues</div><ul><li>Above the fold is a flea market: a sublease.com banner owns the top-right quarter, plus two more ads and a video box — before a single headline.</li><li>Three-column table layout leaves the actual news ~45% of a fixed-width page; nav links are 11px gray text.</li><li>Every story gets identical tiny treatment — no lead story, no hierarchy, no way to scan. No bylines, no trust anchors.</li><li>"The REview" widget renders as an unexplained black box with no CTA.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Kill the top-of-fold ad wall; hero = one featured story card (large image, 24px+ headline, deck, byline).</li><li>Responsive grid: full-width hero → card feed → labeled sticky sponsor rail (max 2 ads).</li><li>Editorial tiers: lead story, top-3 row, then the feed — type scale does the talking.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/advertise.png" target="_blank"><img src="/portal/audit/advertise.png" loading="lazy" alt="advertise screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/advertise.php — the AD SALES page</h3></div><div class="tdl">Issues</div><ul><li>The page that makes the money is a wall of 12px small print — products listed with no pricing table, no media kit, no visuals of any ad unit.</li><li>Zero proof of audience: no open rates, no advertiser logos, no case study. A media buyer closes the tab in 8 seconds.</li><li>Sole CTA is "call us / raw email" — no form, no rate-card download, no buy path.</li><li>A sublease.com ad sits in the header of the page selling RENTV’s own inventory — self-defeating.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Rebuild as a media-kit landing page: 3-tier pricing table (Newsletter / eBlast / Display), audience stats in bold, "Request Media Kit" form.</li><li>Add a Current Advertisers logo row + one pull-quote (one phone call gets it).</li><li>Remove sublease.com from this page entirely.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/subscriber.png" target="_blank"><img src="/portal/audit/subscriber.png" loading="lazy" alt="subscriber screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D</span><h3 class="disp">/subscriber_info.php — the $146/yr member page</h3></div><div class="tdl">Issues</div><ul><li>A real revenue product ($146/yr Executive Subscriber) sold via a dense bullet wall — free vs. paid never cleanly separated; unanswerable in 10 seconds.</li><li>No sample issue, no preview, no testimonial, no subscriber count — buying an information product sight-unseen.</li><li>CTA is plain text: "CLICK HERE or call us." No visible checkout; beige 2005-registrar aesthetic.</li><li>The News Archive is sold as a paid benefit — but the archive page is freely accessible to everyone.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Two-column conversion page: benefits (headline + one-liner + frequency) left, price card with live Stripe checkout right — add a $15/mo option.</li><li>Publish one Sample Issue link — the single biggest conversion lift available.</li><li>Gate the archive or stop selling it; never sell what you give away.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/providers.png" target="_blank"><img src="/portal/audit/providers.png" loading="lazy" alt="providers screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/service-providers.php — the marketplace</h3></div><div class="tdl">Issues</div><ul><li>~40 categories, every single one "(0)" listings — Accounting (0), Brokerage (0), Construction (0). A directory of failure that trains visitors never to return.</li><li>No search, no cards, no map, no filters — a 1999 Yellow Pages list even if inventory existed.</li><li>"Don’t Be Left Out!" CTA asks providers to join a visibly empty room.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>SEED BEFORE RELAUNCH: scrape LA County business-license data + web research (Exa) for CRE-category firms — contractors, brokers, architects, property managers, lenders — and pre-populate 10–15 real listings per major category with phone numbers. Offer each firm its free listing to claim; they upgrade. An empty directory is not a product; a full one is. <a href="/versions/marketplace.html" target="_blank" style="color:#9fd6b0;text-decoration:underline">→ We already built the seeded demo: 62 real LA providers, live here.</a></li><li>Rebuild as a searchable card grid (name, category badge, city, phone, Contact) with geography filter.</li><li>Monetize with a Featured Listing tier — after inventory exists, never before.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/store.png" target="_blank"><img src="/portal/audit/store.png" loading="lazy" alt="store screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D-</span><h3 class="disp">/store.php — conferences/store</h3></div><div class="tdl">Issues</div><ul><li>Labeled "store," contains no product, price, or buy button — a press page wearing a store costume.</li><li>A FUTURE conference (Arizona, Oct 29 2026) is on the page with no Register button, no speakers, no price — revenue advertising that goes nowhere.</li><li>Past and future events unfiltered in one feed; sponsor logos outweigh the editorial 2:1.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Split: "Upcoming Events" above the fold (date, venue, price, Register Now) vs. "Past Coverage" archive grid.</li><li>Sell recorded sessions as an on-demand library: title, price, 90-second preview, buy button.</li><li>Rename the tab — Conferences and Store are different intents.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/archive.png" target="_blank"><img src="/portal/audit/archive.png" loading="lazy" alt="archive screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D</span><h3 class="disp">/archive.php</h3></div><div class="tdl">Issues</div><ul><li>20 bare hyperlinks with no dates, story counts, previews, or search — a filing cabinet with the labels ripped off.</li><li>Freely accessible while being sold as a paid subscriber benefit.</li><li>No orientation: what years, what geographies, how fresh — unknowable.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Full-text search + geography/content-type filters over the archive.</li><li>Each link shows recent stories + a count ("482 articles, 2019–2026").</li><li>Pick a lane: gate it as a benefit, or use it free to drive newsletter signups.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/newsletter.png" target="_blank"><img src="/portal/audit/newsletter.png" loading="lazy" alt="newsletter screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D+</span><h3 class="disp">/newsletter.php</h3></div><div class="tdl">Issues</div><ul><li>NINE fields for a free newsletter (address, zip, phone…) — Bisnow asks for one. Conversion ≈ zero.</li><li>Distorted-text homemade CAPTCHA ("rjvxk6") — broken-looking, inaccessible.</li><li>Right half of the page is empty void; no pitch, no sample, no reason to sign up — the heading is just "NEWSLETTER."</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Three fields max: Email (required), Name, Company. Delete the rest.</li><li>Invisible reCAPTCHA v3 or honeypot; kill the distorted image.</li><li>Add the pitch: "Join 50,000+ CRE professionals · twice-weekly SoCal deals · free" + a sample-issue link.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/subscribe.png" target="_blank"><img src="/portal/audit/subscribe.png" loading="lazy" alt="subscribe screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/subscribe.php — the paywall</h3></div><div class="tdl">Issues</div><ul><li>The paywall page is a cartoon dog GIF + "Hold on there sport!" + a login box. That is the entire page every non-subscriber hits.</li><li>No subscribe CTA, no path for non-members, no visible password reset — a dead end that costs conversions daily.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Replace with a real paywall intercept: what you’re missing, "$146/yr — Subscribe Now" primary button, login secondary.</li><li>Remove the dog and "sport" TODAY — before any redesign.</li><li>Wire a real password-reset flow; a locked-out subscriber is a churned subscriber.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/contact.png" target="_blank"><img src="/portal/audit/contact.png" loading="lazy" alt="contact screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ca8a04">C-</span><h3 class="disp">/contact.php</h3></div><div class="tdl">Issues</div><ul><li>Twelve fields including FAX in 2026; same broken CAPTCHA; right half of the page is empty.</li><li>No visible email fallback if the form breaks (and on a Windows-1252 site, forms break).</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Six fields: Name, Company, Email, Phone (opt), Subject dropdown, Message.</li><li>Show a direct email + phone under the form; fix the half-empty template site-wide.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a href="/portal/audit/jobworks.png" target="_blank"><img src="/portal/audit/jobworks.png" loading="lazy" alt="jobworks screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/jobworks.php — the jobs board</h3></div><div class="tdl">Issues</div><ul><li>Opens with an "Adobe Flash Player is no longer supported" error banner — Flash died Dec 2020; this has greeted every visitor for 5+ years.</li><li>Every job category is "(0)" — the second of three marketplace pillars with zero inventory.</li><li>Bare "create a listing" link with no pricing, reach, or pitch attached.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Delete the Flash widget today; replace with static HTML.</li><li>Seed or kill: offer 10–15 subscriber firms free 90-day listings, or pull JobWorks from the nav until it has inventory.</li><li>One combined CRE Marketplace landing (live counts + featured listings + "Post a listing" CTA) instead of empty silos.</li></ul></div></div>
+  <div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/index.png" target="_blank"><img src="/portal/audit/index.png" loading="lazy" alt="index screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D+</span><h3 class="disp">rentv.com (homepage)</h3></div><div class="tdl">Issues</div><ul><li>Above the fold is a flea market: a sublease.com banner owns the top-right quarter, plus two more ads and a video box — before a single headline.</li><li>Three-column table layout leaves the actual news ~45% of a fixed-width page; nav links are 11px gray text.</li><li>Every story gets identical tiny treatment — no lead story, no hierarchy, no way to scan. No bylines, no trust anchors.</li><li>"The REview" widget renders as an unexplained black box with no CTA.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Kill the top-of-fold ad wall; hero = one featured story card (large image, 24px+ headline, deck, byline).</li><li>Responsive grid: full-width hero → card feed → labeled sticky sponsor rail (max 2 ads).</li><li>Editorial tiers: lead story, top-3 row, then the feed — type scale does the talking.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/advertise.png" target="_blank"><img src="/portal/audit/advertise.png" loading="lazy" alt="advertise screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/advertise.php — the AD SALES page</h3></div><div class="tdl">Issues</div><ul><li>The page that makes the money is a wall of 12px small print — products listed with no pricing table, no media kit, no visuals of any ad unit.</li><li>Zero proof of audience: no open rates, no advertiser logos, no case study. A media buyer closes the tab in 8 seconds.</li><li>Sole CTA is "call us / raw email" — no form, no rate-card download, no buy path.</li><li>A sublease.com ad sits in the header of the page selling RENTV’s own inventory — self-defeating.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Rebuild as a media-kit landing page: 3-tier pricing table (Newsletter / eBlast / Display), audience stats in bold, "Request Media Kit" form.</li><li>Add a Current Advertisers logo row + one pull-quote (one phone call gets it).</li><li>Remove sublease.com from this page entirely.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/subscriber.png" target="_blank"><img src="/portal/audit/subscriber.png" loading="lazy" alt="subscriber screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D</span><h3 class="disp">/subscriber_info.php — the $146/yr member page</h3></div><div class="tdl">Issues</div><ul><li>A real revenue product ($146/yr Executive Subscriber) sold via a dense bullet wall — free vs. paid never cleanly separated; unanswerable in 10 seconds.</li><li>No sample issue, no preview, no testimonial, no subscriber count — buying an information product sight-unseen.</li><li>CTA is plain text: "CLICK HERE or call us." No visible checkout; beige 2005-registrar aesthetic.</li><li>The News Archive is sold as a paid benefit — but the archive page is freely accessible to everyone.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Two-column conversion page: benefits (headline + one-liner + frequency) left, price card with live Stripe checkout right — add a $15/mo option.</li><li>Publish one Sample Issue link — the single biggest conversion lift available.</li><li>Gate the archive or stop selling it; never sell what you give away.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/providers.png" target="_blank"><img src="/portal/audit/providers.png" loading="lazy" alt="providers screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/service-providers.php — the marketplace</h3></div><div class="tdl">Issues</div><ul><li>~40 categories, every single one "(0)" listings — Accounting (0), Brokerage (0), Construction (0). A directory of failure that trains visitors never to return.</li><li>No search, no cards, no map, no filters — a 1999 Yellow Pages list even if inventory existed.</li><li>"Don’t Be Left Out!" CTA asks providers to join a visibly empty room.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>SEED BEFORE RELAUNCH: scrape LA County business-license data + web research (Exa) for CRE-category firms — contractors, brokers, architects, property managers, lenders — and pre-populate 10–15 real listings per major category with phone numbers. Offer each firm its free listing to claim; they upgrade. An empty directory is not a product; a full one is. <a rel="noopener noreferrer" href="/versions/marketplace.html" target="_blank" style="color:#9fd6b0;text-decoration:underline">→ We already built the seeded demo: 62 real LA providers, live here.</a></li><li>Rebuild as a searchable card grid (name, category badge, city, phone, Contact) with geography filter.</li><li>Monetize with a Featured Listing tier — after inventory exists, never before.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/store.png" target="_blank"><img src="/portal/audit/store.png" loading="lazy" alt="store screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D-</span><h3 class="disp">/store.php — conferences/store</h3></div><div class="tdl">Issues</div><ul><li>Labeled "store," contains no product, price, or buy button — a press page wearing a store costume.</li><li>A FUTURE conference (Arizona, Oct 29 2026) is on the page with no Register button, no speakers, no price — revenue advertising that goes nowhere.</li><li>Past and future events unfiltered in one feed; sponsor logos outweigh the editorial 2:1.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Split: "Upcoming Events" above the fold (date, venue, price, Register Now) vs. "Past Coverage" archive grid.</li><li>Sell recorded sessions as an on-demand library: title, price, 90-second preview, buy button.</li><li>Rename the tab — Conferences and Store are different intents.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/archive.png" target="_blank"><img src="/portal/audit/archive.png" loading="lazy" alt="archive screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D</span><h3 class="disp">/archive.php</h3></div><div class="tdl">Issues</div><ul><li>20 bare hyperlinks with no dates, story counts, previews, or search — a filing cabinet with the labels ripped off.</li><li>Freely accessible while being sold as a paid subscriber benefit.</li><li>No orientation: what years, what geographies, how fresh — unknowable.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Full-text search + geography/content-type filters over the archive.</li><li>Each link shows recent stories + a count ("482 articles, 2019–2026").</li><li>Pick a lane: gate it as a benefit, or use it free to drive newsletter signups.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/newsletter.png" target="_blank"><img src="/portal/audit/newsletter.png" loading="lazy" alt="newsletter screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ea580c">D+</span><h3 class="disp">/newsletter.php</h3></div><div class="tdl">Issues</div><ul><li>NINE fields for a free newsletter (address, zip, phone…) — Bisnow asks for one. Conversion ≈ zero.</li><li>Distorted-text homemade CAPTCHA ("rjvxk6") — broken-looking, inaccessible.</li><li>Right half of the page is empty void; no pitch, no sample, no reason to sign up — the heading is just "NEWSLETTER."</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Three fields max: Email (required), Name, Company. Delete the rest.</li><li>Invisible reCAPTCHA v3 or honeypot; kill the distorted image.</li><li>Add the pitch: "Join 50,000+ CRE professionals · twice-weekly SoCal deals · free" + a sample-issue link.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/subscribe.png" target="_blank"><img src="/portal/audit/subscribe.png" loading="lazy" alt="subscribe screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/subscribe.php — the paywall</h3></div><div class="tdl">Issues</div><ul><li>The paywall page is a cartoon dog GIF + "Hold on there sport!" + a login box. That is the entire page every non-subscriber hits.</li><li>No subscribe CTA, no path for non-members, no visible password reset — a dead end that costs conversions daily.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Replace with a real paywall intercept: what you’re missing, "$146/yr — Subscribe Now" primary button, login secondary.</li><li>Remove the dog and "sport" TODAY — before any redesign.</li><li>Wire a real password-reset flow; a locked-out subscriber is a churned subscriber.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/contact.png" target="_blank"><img src="/portal/audit/contact.png" loading="lazy" alt="contact screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#ca8a04">C-</span><h3 class="disp">/contact.php</h3></div><div class="tdl">Issues</div><ul><li>Twelve fields including FAX in 2026; same broken CAPTCHA; right half of the page is empty.</li><li>No visible email fallback if the form breaks (and on a Windows-1252 site, forms break).</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Six fields: Name, Company, Email, Phone (opt), Subject dropdown, Message.</li><li>Show a direct email + phone under the form; fix the half-empty template site-wide.</li></ul></div></div><div class="tdp rv"><div class="tdshot"><a rel="noopener noreferrer" href="/portal/audit/jobworks.png" target="_blank"><img src="/portal/audit/jobworks.png" loading="lazy" alt="jobworks screenshot"></a><div class="tdcap">live capture · click to open</div></div><div class="tdbody"><div class="tdhead"><span class="tdgrade" style="background:#dc2626">F</span><h3 class="disp">/jobworks.php — the jobs board</h3></div><div class="tdl">Issues</div><ul><li>Opens with an "Adobe Flash Player is no longer supported" error banner — Flash died Dec 2020; this has greeted every visitor for 5+ years.</li><li>Every job category is "(0)" — the second of three marketplace pillars with zero inventory.</li><li>Bare "create a listing" link with no pricing, reach, or pitch attached.</li></ul><div class="tdl fix">The fix</div><ul class="fixul"><li>Delete the Flash widget today; replace with static HTML.</li><li>Seed or kill: offer 10–15 subscriber firms free 90-day listings, or pull JobWorks from the nav until it has inventory.</li><li>One combined CRE Marketplace landing (live counts + featured listings + "Post a listing" CTA) instead of empty silos.</li></ul></div></div>
   <p class="lead2" style="margin-top:30px"><b>Overall verdict:</b> a site that was genuinely valuable in 2005 and has received near-zero strategic investment since. News still publishes, conferences still run, and 50,000 opt-in subscribers is a real asset — but a broken Flash banner, an all-zeros marketplace, a cartoon-dog paywall and a phone-number ad page are actively destroying that asset. First fix, before any redesign: <b>install GA4 today</b> — until RENTV knows its own traffic, everything else is guesswork.</p>
 </div></section>
 
@@ -297,32 +297,32 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 <section id="suggested"><div class="eyebrow">09 · 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 &amp; 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">
+  <a rel="noopener noreferrer" 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">
+  <a rel="noopener noreferrer" 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">
+  <a rel="noopener noreferrer" 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">
+  <a rel="noopener noreferrer" 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">
+  <a rel="noopener noreferrer" 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">
+  <a rel="noopener noreferrer" 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>
diff --git a/public/cre-talk.html b/public/cre-talk.html
index 716f9697..b18ccf11 100644
--- a/public/cre-talk.html
+++ b/public/cre-talk.html
@@ -120,7 +120,7 @@
         g.innerHTML=items.map(function(v){
           var href=v.view_url||('https://www.rentvreview.com/Videos/View/'+encodeURIComponent(v.id||''));
           var thumb=v.thumb||(v.yt?('https://img.youtube.com/vi/'+v.yt+'/hqdefault.jpg'):'');
-          return '<a class="tile" href="'+esc(href)+'" target="_blank" rel="noopener" style="padding:0;overflow:hidden">'+
+          return '<a class="tile" href="'+esc(href)+'" target="_blank" rel="noopener noreferrer" style="padding:0;overflow:hidden">'+
             '<div style="aspect-ratio:16/9;background:#111 center/cover'+(thumb?(" url('"+esc(thumb)+"')"):'')+'"></div>'+
             '<div style="padding:16px 18px"><div class="n" style="font-size:11px;letter-spacing:.1em;text-transform:uppercase">'+esc(v.cat||'The REview')+'</div>'+
             '<h3 style="font-size:18px;margin:6px 0 0">'+esc(v.title||'RENTV video')+'</h3></div></a>';
@@ -133,7 +133,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · 5757 W. Century Blvd, Suite 700, Los Angeles, CA 90045 · (310) 213-6409</div></div></footer>
 <script>
   var t=document.getElementById('today');if(t)t.textContent=new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});
diff --git a/public/desk.html b/public/desk.html
index 71f369b0..e262cd01 100644
--- a/public/desk.html
+++ b/public/desk.html
@@ -96,7 +96,7 @@ const shortUsd=n=>{n=Number(n)||0;return n>=1e9?'$'+(n/1e9).toFixed(2)+'B':n>=1e
 const dstr=d=>d?new Date(d).toLocaleDateString(undefined,{month:'short',day:'numeric',year:'numeric'}):'—';
 const loc=x=>[x.city||x.hq_city,x.state_code||x.hq_state].filter(Boolean).join(', ');
 const LI_P=(n,f)=>`https://www.linkedin.com/search/results/people/?keywords=${enc([n,f].filter(Boolean).join(' '))}`,LI_C=f=>`https://www.linkedin.com/search/results/companies/?keywords=${enc(f)}`,WEB=f=>`https://www.google.com/search?q=${enc('"'+f+'" real estate official website')}`,MAPS=q=>`https://www.google.com/maps/search/?api=1&query=${enc(q)}`,DRE=l=>`https://www2.dre.ca.gov/PublicASP/pplinfo.asp?License_id=${enc(l)}`,GOOG=q=>`https://www.google.com/search?q=${enc(q)}`,ASSR=a=>`https://portal.assessor.lacounty.gov/parceldetail/${enc(a)}`;
-const A=(h,i,l)=>`<a class="act" href="${h}" target="_blank" rel="noopener" onclick="event.stopPropagation()"><span class="i">${i}</span>${l}</a>`;
+const A=(h,i,l)=>`<a class="act" href="${h}" target="_blank" rel="noopener noreferrer" onclick="event.stopPropagation()"><span class="i">${i}</span>${l}</a>`;
 function actions(k,x){
   if(k==='firms')return [A(LI_C(x.name),'🏢','LinkedIn'),A(WEB(x.name),'🌐','Website'),A(MAPS(x.name+' '+loc(x)),'📍','HQ / Map'),x.license_no?A(DRE(x.license_no),'🪪','DRE'):'',A(GOOG(x.name+' brokers '+loc(x)),'🔎','Google')].filter(Boolean).join('');
   if(k==='owners'){const ad=[x.address,x.city].filter(Boolean).join(', ');return [A(MAPS(ad),'📍','Map'),A(GOOG(ad+' '+(x.use_desc||'')+' owner'),'🔎','Owner / deal'),A('https://www.google.com/maps/@?api=1&map_action=pano&viewpoint='+enc(ad),'📸','Street View'),A(ASSR(x.ain),'🏛️','Assessor')].join('');}
diff --git a/public/la-commercial.html b/public/la-commercial.html
index f0bf60b1..cbaf0b95 100644
--- a/public/la-commercial.html
+++ b/public/la-commercial.html
@@ -93,13 +93,13 @@ const attr=esc;
 (async()=>{
   const d=await (await fetch('/api/la-commercial')).json();
   $('#fresh').textContent=d.fetched_at?('Data as of '+new Date(d.fetched_at).toLocaleString()):'';
-  $('#marquee').innerHTML=(d.marquee||[]).slice(0,9).map(r=>`<a class="asset${r.ain?' ext':''}"${r.ain?` href="${AIN(r.ain)}" target="_blank" rel="noopener" title="LA County Assessor parcel ${attr(r.ain)}"`:''}>
+  $('#marquee').innerHTML=(d.marquee||[]).slice(0,9).map(r=>`<a class="asset${r.ain?' ext':''}"${r.ain?` href="${AIN(r.ain)}" target="_blank" rel="noopener noreferrer" title="LA County Assessor parcel ${attr(r.ain)}"`:''}>
     <div class="tag">${esc(r.type_label||'')}</div>
     <div class="v">${usd(r.assessed_total)}</div>
     <div class="a">${esc(r.address||'—')}${r.city?', '+esc(r.city):''}</div>
     ${r.brief?`<div class="brief">${esc(r.brief)}</div>`:''}</a>`).join('');
   $('#recent').innerHTML='<table><thead><tr><th>Recorded</th><th>Address</th><th>Type</th><th>Assessed</th></tr></thead><tbody>'+
-    (d.recent||[]).map(r=>{const lbl=r.address?`${esc(r.address)}${r.city?', '+esc(r.city):''}`:(r.ain?`Parcel ${esc(r.ain)}`:'—');const cell=r.ain?`<a class="ext" href="${AIN(r.ain)}" target="_blank" rel="noopener" title="LA County Assessor parcel ${attr(r.ain)}">${lbl}</a>`:lbl;return `<tr><td>${dstr(r.recording_date)}</td><td class="n">${cell}</td><td>${esc(r.type_label||'')}</td><td class="v">${usd(r.assessed_total)}</td></tr>`;}).join('')+'</tbody></table>';
+    (d.recent||[]).map(r=>{const lbl=r.address?`${esc(r.address)}${r.city?', '+esc(r.city):''}`:(r.ain?`Parcel ${esc(r.ain)}`:'—');const cell=r.ain?`<a class="ext" href="${AIN(r.ain)}" target="_blank" rel="noopener noreferrer" title="LA County Assessor parcel ${attr(r.ain)}">${lbl}</a>`:lbl;return `<tr><td>${dstr(r.recording_date)}</td><td class="n">${cell}</td><td>${esc(r.type_label||'')}</td><td class="v">${usd(r.assessed_total)}</td></tr>`;}).join('')+'</tbody></table>';
   $('#firms').innerHTML=(d.firms||[]).slice(0,12).map(f=>`<a class="firm" href="/directory?tab=firms&q=${encodeURIComponent(f.name||'')}" title="See ${attr(f.name)} in the CRE Directory">
     <div class="fn">${esc(f.name)}</div><div class="fa">${(f.agent_count||0).toLocaleString()} agents</div></a>`).join('');
 })();
diff --git a/public/markets.html b/public/markets.html
index c0b0a621..d6a13a08 100644
--- a/public/markets.html
+++ b/public/markets.html
@@ -82,7 +82,7 @@ footer .cols{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:28px}footer
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a><a href="/la-commercial">LA Commercial</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · Commercial real estate news, Western U.S. · Headlines refreshed live from rentv.com</div></div></footer>
 
 <script>
diff --git a/public/press/index.html b/public/press/index.html
index 21003877..71256db8 100644
--- a/public/press/index.html
+++ b/public/press/index.html
@@ -67,7 +67,7 @@
 
   var caps = ['home','markets','article','blog','cretalk','admin-index','admin-command','admin-analytics','admin-kanban'];
   document.getElementById('caps').innerHTML = caps.map(function (c) {
-    return '<a href="/press/media/captures/' + c + '.png" target="_blank"><img loading="lazy" src="/press/media/captures/' + c + '.png" alt="' + c + '"></a>';
+    return '<a rel="noopener noreferrer" href="/press/media/captures/' + c + '.png" target="_blank"><img loading="lazy" src="/press/media/captures/' + c + '.png" alt="' + c + '"></a>';
   }).join('');
 </script>
 </body>
diff --git a/public/review.html b/public/review.html
index 050e455c..16d4b59a 100644
--- a/public/review.html
+++ b/public/review.html
@@ -93,7 +93,7 @@
 </head>
 <body>
   <div class="util"><div class="wrap">
-    <div class="left"><a href="/">RENTV.com News</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="https://sublease.com/" target="_blank" rel="noopener">Sublease.com</a></div>
+    <div class="left"><a href="/">RENTV.com News</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="https://sublease.com/" target="_blank" rel="noopener noreferrer">Sublease.com</a></div>
     <div class="acts"><a href="/subscribe">Newsletters</a><a href="/advertise">Advertise</a><a class="sub" href="/subscribe">Subscribe</a></div>
   </div></div>
 
@@ -133,7 +133,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · Commercial real estate news, Western U.S. · Headlines refreshed live from rentv.com</div></div></footer>
 
   <div class="modal" id="modal">
@@ -141,7 +141,7 @@
     <div class="panel">
       <div class="video"><iframe id="mframe" allow="accelerometer;autoplay;clipboard-write;encrypted-media;gyroscope;picture-in-picture" allowfullscreen></iframe></div>
       <div class="meta"><span class="rcat" id="mcat"></span><h3 id="mtitle"></h3><p id="mdesc"></p>
-        <div class="row"><a id="mlink" target="_blank" rel="noopener">Open on The REview ↗</a></div>
+        <div class="row"><a id="mlink" target="_blank" rel="noopener noreferrer">Open on The REview ↗</a></div>
       </div>
     </div>
   </div>
diff --git a/public/section.html b/public/section.html
index 59274400..c42f8206 100644
--- a/public/section.html
+++ b/public/section.html
@@ -93,7 +93,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · Commercial real estate news, Western U.S. · Headlines refreshed live from rentv.com</div></div></footer>
 
 <script>
diff --git a/public/social.html b/public/social.html
index 99937497..2c5a309a 100644
--- a/public/social.html
+++ b/public/social.html
@@ -427,10 +427,10 @@
     return '<div class="gitem'+(isCat?' cat':'')+sel+'">'
       +'<div class="gi-top"><span class="gi-ic">'+icoFor(x.cat)+'</span><span class="gi-name">'+esc(x.name)+'</span>'
       +(isCat&&count?'<span class="gi-count">'+count+'</span>':'')
-      +'<a class="gi-li" href="'+liUrl(x.terms||x.name)+'" target="_blank" rel="noopener">in ↗</a>'
+      +'<a class="gi-li" href="'+liUrl(x.terms||x.name)+'" target="_blank" rel="noopener noreferrer">in ↗</a>'
       +'<button class="gi-x" data-del="'+x.id+'" title="Remove">✕</button></div>'
       +(x.sub?'<div class="gi-sub">'+esc(x.sub)+'</div>':'')
-      +((x.phone||x.website)?'<div class="gi-contact">'+(x.phone?'<a href="tel:'+esc(String(x.phone).replace(/[^\d+]/g,''))+'">📞 '+esc(x.phone)+'</a>':'')+(x.website?'<a href="'+(/^https?:/i.test(x.website)?esc(x.website):'https://'+esc(x.website))+'" target="_blank" rel="noopener">🌐 site</a>':'')+'</div>':'')
+      +((x.phone||x.website)?'<div class="gi-contact">'+(x.phone?'<a href="tel:'+esc(String(x.phone).replace(/[^\d+]/g,''))+'">📞 '+esc(x.phone)+'</a>':'')+(x.website?'<a href="'+(/^https?:/i.test(x.website)?esc(x.website):'https://'+esc(x.website))+'" target="_blank" rel="noopener noreferrer">🌐 site</a>':'')+'</div>':'')
       +'<span class="gstatus s'+(x.status||0)+'" data-st="'+x.id+'">'+GSTL[x.status||0]+'</span>'
       +'<span class="gwhen">🕓 '+when+'</span>'
       +'<button class="gi-letter" data-letter="'+x.id+'">'+lLabel+'</button>'
@@ -443,8 +443,8 @@
       +'<span class="gp-nm">'+esc(cap(p.name))+'</span>'
       +'<span class="gp-sub">'+esc([cap(p.city||''),p.license_type||''].filter(Boolean).join(' · '))+'</span>'
       +'<span class="gstatus s'+(p.status||0)+'" data-pst="'+key+'">'+GSTL[p.status||0]+'</span>'
-      +'<a class="gp-a" href="'+liUrl(p.name+' '+(firm.name||''))+'" target="_blank" rel="noopener">in↗</a>'
-      +(p.license_no?'<a class="gp-a" href="'+dreUrl(p.license_no)+'" target="_blank" rel="noopener">DRE</a>':'')
+      +'<a class="gp-a" href="'+liUrl(p.name+' '+(firm.name||''))+'" target="_blank" rel="noopener noreferrer">in↗</a>'
+      +(p.license_no?'<a class="gp-a" href="'+dreUrl(p.license_no)+'" target="_blank" rel="noopener noreferrer">DRE</a>':'')
       +'<button class="gi-letter gp-let" data-pletter="'+key+'">'+(p.lv?'✎ Regen':'✎ Letter')+'</button></div>';
   }
   function grender(){
@@ -463,11 +463,11 @@
       contacts.sort(function(a,b){ if(sort==='name')return a.name.localeCompare(b.name); if(sort==='status')return (b.status||0)-(a.status||0); return b.added-a.added; });
       var out='<div class="gcat">';
       if(head) out+=gItemHtml(head, contacts.length);
-      else out+='<div class="gitem cat"><div class="gi-top"><span class="gi-name">'+esc(cn)+'</span><span class="gi-count">'+contacts.length+' contacts</span><a class="gi-li" href="'+liUrl(cn+' commercial real estate')+'" target="_blank" rel="noopener">in ↗</a></div></div>';
+      else out+='<div class="gitem cat"><div class="gi-top"><span class="gi-name">'+esc(cn)+'</span><span class="gi-count">'+contacts.length+' contacts</span><a class="gi-li" href="'+liUrl(cn+' commercial real estate')+'" target="_blank" rel="noopener noreferrer">in ↗</a></div></div>';
       out+=contacts.map(function(x){
         var h=gItemHtml(x,0);
         if(x.expanded && x.people){
-          var meta=(x.website||x.phone)?('<div class="gp-firm">'+(x.phone?'📞 '+esc(x.phone)+'   ':'')+(x.website?'<a href="'+(/^https?:/i.test(x.website)?x.website:'https://'+x.website)+'" target="_blank" rel="noopener">🌐 site</a>':'')+'</div>'):'';
+          var meta=(x.website||x.phone)?('<div class="gp-firm">'+(x.phone?'📞 '+esc(x.phone)+'   ':'')+(x.website?'<a href="'+(/^https?:/i.test(x.website)?x.website:'https://'+x.website)+'" target="_blank" rel="noopener noreferrer">🌐 site</a>':'')+'</div>'):'';
           h+='<div class="gpeople">'+meta+x.people.map(function(p){ return gPersonHtml(p,x); }).join('')+'</div>';
         }
         return h;
@@ -822,13 +822,13 @@
       grid.innerHTML=list.map(function(v){
         var thumb=v.thumb_local||v.thumb||'';
         return '<div class="vcard">'+
-          '<a class="vthumb" href="'+esc(v.url)+'" target="_blank" rel="noopener">'+
+          '<a class="vthumb" href="'+esc(v.url)+'" target="_blank" rel="noopener noreferrer">'+
             (thumb?'<img loading="lazy" src="'+esc(thumb)+'" alt="">':'')+
             '<span class="play">▶</span>'+(v.duration?'<span class="dur">'+dur(v.duration)+'</span>':'')+
           '</a>'+
           '<div class="vb">'+
             '<span class="ep'+(v.kind==='clip'?' clip':'')+'">'+(v.kind==='episode'?'CRE Talk':'Clip')+'</span>'+
-            '<h4><a class="vt" href="'+esc(v.url)+'" target="_blank" rel="noopener">'+esc(v.title)+'</a></h4>'+
+            '<h4><a class="vt" href="'+esc(v.url)+'" target="_blank" rel="noopener noreferrer">'+esc(v.title)+'</a></h4>'+
             '<div class="vwhen">🕓 '+fmtDT(v.date)+(v.plays?(' · '+(+v.plays).toLocaleString()+' plays'):'')+'</div>'+
             '<div class="vacts">'+
               '<button class="pri" data-act="draft" data-id="'+v.id+'">→ Draft post</button>'+
diff --git a/public/subscribe.html b/public/subscribe.html
index 0c1f8a86..408f0042 100644
--- a/public/subscribe.html
+++ b/public/subscribe.html
@@ -120,7 +120,7 @@
     <div><div class="logo">REN<span style="color:var(--red)">TV</span>.com</div><p style="max-width:34ch">Commercial real estate news, deals &amp; conferences across the Western United States since 1998.</p></div>
     <div><h5>Sections</h5><a href="/sales">Sales</a><a href="/leases">Leases</a><a href="/financing">Financing</a><a href="/development">Development</a><a href="/multifamily">Multifamily</a><a href="/industrial">Industrial</a><a href="/retail">Retail</a><a href="/markets">Markets</a></div>
     <div><h5>Company</h5><a href="/about">About</a><a href="/advertise">Advertise</a><a href="/conferences">Conferences</a><a href="/subscribe">Subscribe</a></div>
-    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
+    <div><h5>Follow</h5><a href="https://www.linkedin.com/company/rentv.com-inc" target="_blank" rel="noopener noreferrer">LinkedIn</a><a href="/review">The REview</a><a href="/cre-talk">CRE Talk</a><a href="/subscribe">Newsletters</a></div>
   </div><div class="fine">© 2026 RENTV.com · 5757 W. Century Blvd, Suite 700, Los Angeles, CA 90045 · (310) 213-6409</div></div></footer>
 <script>
   var t=document.getElementById('today');if(t)t.textContent=new Date().toLocaleDateString(undefined,{weekday:'long',year:'numeric',month:'long',day:'numeric'});

← 83d6d662 test(api): lock validation contract on public PII-write endp  ·  back to Rentv  ·  auto-data-snapshot: 2026-08-08T09:04:57 (7 data files) — dat 907a56cc →