← 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
A data/_frame_blocked.jsonM server.js
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 →