[object Object]

← back to Domain Landings

5x/contrarian: server-side frame-block detection (58 sites) — goLive opens blocked sites in new tab, no silent blank iframe

a5fd5d463eeb763bec63b30b4c80423493b12c82 · 2026-08-17 17:14:20 -0700 · Steve Abrams

Files touched

Diff

commit a5fd5d463eeb763bec63b30b4c80423493b12c82
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 17 17:14:20 2026 -0700

    5x/contrarian: server-side frame-block detection (58 sites) — goLive opens blocked sites in new tab, no silent blank iframe
---
 data/_frame_blocked.json |  1 +
 server.js                | 12 +++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/data/_frame_blocked.json b/data/_frame_blocked.json
new file mode 100644
index 0000000..e523741
--- /dev/null
+++ b/data/_frame_blocked.json
@@ -0,0 +1 @@
+["1800wallcoverings.com", "1800wallpapers.com", "800wallpaper.com", "abramsatlas.com", "abramsintel.com", "apartmentwallpaper.com", "asseeninhotels.com", "asseeninla.com", "asseeninmovies.com", "asseeninshowrooms.com", "barwallpaper.com", "bestwallpaperplace.com", "blankstocklining.com", "bleachfriendly.com", "bubbe.ai", "bubbesblock.com", "carmelwallpaper.com", "cfafabrics.com", "claimmyaddress.com", "classawallcovering.com", "commercialsalesreps.com", "commercialwallcovering.com", "customdigitalmurals.com", "cypresawards.com", "designerlaboratory.com", "designermagnetics.com", "designerswallcovering.com", "designerswallcoverings.com", "designerwallcover.com", "designerwallcovering.com", "designerwallcoverings.com", "designwallcoverings.com", "dwlosangeles.com", "etciemurals.com", "fabricfridays.com", "fentucci.com", "ffepurchasing.com", "fireratedwallcovering.com", "flocked.org", "goldleafwallpaper.com", "hollywoodwallcovering.com", "hollywoodwallcoverings.com", "hospitalitydesignreps.com", "hospitalitywallcoverings.com", "interiordesignershowroom.com", "nationalpaperhangers.com", "naturaltextilewallpaper.com", "patterndesignlab.com", "philipperomano.com", "selfadhesivewallpaper.com", "starsofdesign.com", "thedesignerlibrary.com", "thesetdecorator.com", "wallpapercanada.com", "wallpapercontractor.com", "wallpaperdistributors.com", "wallpaperestimator.com", "wholivedthere.com"]
\ No newline at end of file
diff --git a/server.js b/server.js
index 971bce4..21af630 100644
--- a/server.js
+++ b/server.js
@@ -189,7 +189,10 @@ function adminWall(req, res) {
   // mark which domains actually have a thumbnail so the client never requests a missing one (no 404s)
   let thumbSet = new Set();
   try { thumbSet = new Set(fs.readdirSync(path.join(__dirname, 'data/thumbs')).filter(f => f.endsWith('.jpg')).map(f => f.slice(0, -4))); } catch {}
-  sites = sites.map(s => ({ ...s, th: thumbSet.has(s.domain) ? 1 : 0 }));
+  let frameBlocked = new Set();
+  try { frameBlocked = new Set(JSON.parse(fs.readFileSync(path.join(__dirname, 'data/_frame_blocked.json'), 'utf8'))); } catch {}
+  // th = has a thumbnail; fr = frameable (0 = refuses embedding, show "open directly" instead of a blank iframe)
+  sites = sites.map(s => ({ ...s, th: thumbSet.has(s.domain) ? 1 : 0, fr: frameBlocked.has(s.domain) ? 0 : 1 }));
   res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
   res.end(`<!doctype html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1">
 <title>Portfolio wall — ${sites.length} sites</title>
@@ -243,7 +246,10 @@ function applyDens(){document.documentElement.style.setProperty('--cols',densEl.
     document.querySelectorAll('.frame iframe').forEach(f=>f.style.transform='scale('+s+')');}}
 // click a tile -> swap the thumbnail for the LIVE iframe (with blocked-embed detection)
 const LIVE=new Set();
-function goLive(f){ if(f.dataset.live)return; f.dataset.live=1; const dom=f.dataset.dom; LIVE.add(dom);
+function goLive(f){ if(f.dataset.live)return; const dom=f.dataset.dom;
+  if(f.dataset.fr==='0'){ // known to refuse embedding -> open-directly, don't load a doomed blank iframe
+    window.open('https://'+dom+'/','_blank','noopener'); return; }
+  f.dataset.live=1; LIVE.add(dom);
   const if_=document.createElement('iframe'); if_.src='https://'+dom+'/';
   if_.sandbox='allow-scripts allow-same-origin'; if_.style.transform='scale('+(f.clientWidth/1280)+')';
   let loaded=false; if_.addEventListener('load',()=>loaded=true);
@@ -258,7 +264,7 @@ function render(){
   else if(sv==='type')list.sort((a,b)=>a.type.localeCompare(b.type)||a.domain.localeCompare(b.domain));
   else list.sort((a,b)=>(b.type===sv)-(a.type===sv)||a.domain.localeCompare(b.domain));
   countEl.textContent=list.length+' shown';
-  grid.innerHTML=list.map(s=>'<div class=card><div class=frame data-dom="'+s.domain+'" title="click for live view">'+
+  grid.innerHTML=list.map(s=>'<div class=card><div class=frame data-dom="'+s.domain+'" data-fr="'+s.fr+'" title="'+(s.fr?'click for live view':'this site blocks embedding — click to open')+'">'+
     (s.th?'<img loading=lazy src="/thumbs/'+s.domain+'.jpg" onerror="this.style.display=\\'none\\';this.nextElementSibling.style.display=\\'flex\\'">':'')+
     '<div class=ph'+(s.th?' style=display:none':'')+'>'+s.domain+'<br><small>(no preview — click for live)</small></div>'+
     '<span class=live>▶ live</span></div>'+

← 995c737 5x/contrarian fixes: goLive blocked-embed feedback + LIVE-se  ·  back to Domain Landings  ·  5x: contrarian-gate fixes verified + report updated 8bfdf53 →