[object Object]

← back to Domain Landings

admin: portfolio wall (/admin/wall) — iframe grid of all 290 sites, density slider + sort + lazy-load

ee0d788e9dcbbe094ca8450d1ca356d4a67315b7 · 2026-08-17 15:46:24 -0700 · Steve Abrams

Files touched

Diff

commit ee0d788e9dcbbe094ca8450d1ca356d4a67315b7
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 17 15:46:24 2026 -0700

    admin: portfolio wall (/admin/wall) — iframe grid of all 290 sites, density slider + sort + lazy-load
---
 data/all-sites.json |  1 +
 server.js           | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)

diff --git a/data/all-sites.json b/data/all-sites.json
new file mode 100644
index 0000000..a6f0366
--- /dev/null
+++ b/data/all-sites.json
@@ -0,0 +1 @@
+[{"domain":"1800swallpaper.com","type":"developed"},{"domain":"1800wallcoverings.com","type":"other"},{"domain":"1800wallpapers.com","type":"other"},{"domain":"1890swallpaper.com","type":"developed"},{"domain":"1900swallpaper.com","type":"developed"},{"domain":"1920swallpaper.com","type":"developed"},{"domain":"1930swallpaper.com","type":"developed"},{"domain":"1940swallpaper.com","type":"developed"},{"domain":"1950swallpaper.com","type":"developed"},{"domain":"1960swallpaper.com","type":"developed"},{"domain":"1970swallpaper.com","type":"developed"},{"domain":"1980swallpaper.com","type":"developed"},{"domain":"67calc.com","type":"developed"},{"domain":"800wallpaper.com","type":"other"},{"domain":"818butler.com","type":"landing"},{"domain":"90210rentals.com","type":"landing"},{"domain":"aaatreetrimming.com","type":"landing"},{"domain":"abramsatlas.com","type":"other"},{"domain":"abramscivic.com","type":"landing"},{"domain":"abramsdirectory.com","type":"landing"},{"domain":"abramsguide.com","type":"landing"},{"domain":"abramsindex.com","type":"landing"},{"domain":"abramsindustries.com","type":"landing"},{"domain":"abramsintel.com","type":"other"},{"domain":"abramsintelligence.com","type":"landing"},{"domain":"abramslive.com","type":"landing"},{"domain":"abramslocal.com","type":"landing"},{"domain":"abramsmaps.com","type":"landing"},{"domain":"abramsmarkets.com","type":"landing"},{"domain":"abramsos.com","type":"landing"},{"domain":"abramsprotection.com","type":"landing"},{"domain":"abramsspace.com","type":"landing"},{"domain":"abramsterminal.com","type":"landing"},{"domain":"abramsvc.com","type":"landing"},{"domain":"agedwallpaper.com","type":"developed"},{"domain":"agentabrams.com","type":"developed"},{"domain":"allnewsdaily.com","type":"other"},{"domain":"apartmentwallpaper.com","type":"developed"},{"domain":"architecturalwallcoverings.com","type":"developed"},{"domain":"askgoodquestions.ai","type":"developed"},{"domain":"asknonna.ai","type":"landing"},{"domain":"asseeninhotels.com","type":"other"},{"domain":"asseeninla.com","type":"other"},{"domain":"asseeninmovies.com","type":"other"},{"domain":"asseeninshowrooms.com","type":"other"},{"domain":"barwallpaper.com","type":"other"},{"domain":"bestactorawards.com","type":"landing"},{"domain":"bestdocumentaryfilms.com","type":"landing"},{"domain":"bestwallpaperplace.com","type":"developed"},{"domain":"beverlyandhills.com","type":"landing"},{"domain":"beverlyhillsbutler.com","type":"landing"},{"domain":"beverlyhillspaints.com","type":"landing"},{"domain":"beverlyhillsvideos.com","type":"other"},{"domain":"bhbutler.com","type":"landing"},{"domain":"blankstocklining.com","type":"other"},{"domain":"bleachfriendly.com","type":"other"},{"domain":"blockprintedwallpaper.com","type":"developed"},{"domain":"boomercalc.com","type":"developed"},{"domain":"borninbh.com","type":"landing"},{"domain":"borrowerbills.org","type":"excluded"},{"domain":"boulevardbutler.com","type":"landing"},{"domain":"bubbe.ai","type":"developed"},{"domain":"bubbeleh.ai","type":"developed"},{"domain":"bubbesblock.com","type":"developed"},{"domain":"bubbie.ai","type":"landing"},{"domain":"cannabisofthemonthclub.com","type":"landing"},{"domain":"carmelpaints.com","type":"landing"},{"domain":"carmelriverwater.com","type":"landing"},{"domain":"carmelvalleywater.com","type":"landing"},{"domain":"carmelwallpaper.com","type":"developed"},{"domain":"carmelwallpapers.com","type":"developed"},{"domain":"celebsignatures.com","type":"developed"},{"domain":"cfafabrics.com","type":"other"},{"domain":"chargeandexplore.com","type":"developed"},{"domain":"chinoiseriewallpaper.com","type":"developed"},{"domain":"claimmyaddress.com","type":"developed"},{"domain":"classawallcovering.com","type":"other"},{"domain":"cleaninggrants.com","type":"developed"},{"domain":"cleaninggrants.org","type":"developed"},{"domain":"commercialdesignreps.com","type":"developed"},{"domain":"commercialsalesreps.com","type":"other"},{"domain":"commercialwallcovering.com","type":"developed"},{"domain":"commercialwalls.com","type":"landing"},{"domain":"contractwallpaper.com","type":"developed"},{"domain":"corkwallcovering.com","type":"developed"},{"domain":"customdigitalmurals.com","type":"developed"},{"domain":"customdigitalwallcoverings.com","type":"landing"},{"domain":"customdigitalwalls.com","type":"landing"},{"domain":"cypresawards.com","type":"other"},{"domain":"cypresawards.org","type":"landing"},{"domain":"designerlaboratory.com","type":"other"},{"domain":"designermagnetics.com","type":"other"},{"domain":"designerrepresentatives.com","type":"developed"},{"domain":"designersalesreps.com","type":"developed"},{"domain":"designerschat.com","type":"landing"},{"domain":"designerssalesreps.com","type":"developed"},{"domain":"designerswallcovering.com","type":"other"},{"domain":"designerswallcoverings.com","type":"other"},{"domain":"designerswallpapers.com","type":"landing"},{"domain":"designerwallcover.com","type":"developed"},{"domain":"designerwallcovering.com","type":"developed"},{"domain":"designerwallcoverings.ai","type":"developed"},{"domain":"designerwallcoverings.com","type":"developed"},{"domain":"designerwallpaints.com","type":"landing"},{"domain":"designerwalltiles.com","type":"landing"},{"domain":"designtradelive.com","type":"developed"},{"domain":"designtradereps.com","type":"landing"},{"domain":"designtradesalesreps.com","type":"landing"},{"domain":"designwallcoverings.com","type":"other"},{"domain":"dsgn.tv","type":"landing"},{"domain":"dsgntv.com","type":"other"},{"domain":"dwlosangeles.com","type":"other"},{"domain":"edgrants.org","type":"developed"},{"domain":"embroideredwallpaper.com","type":"developed"},{"domain":"ephedrafreeherbs.com","type":"landing"},{"domain":"etciemurals.com","type":"other"},{"domain":"fabricfriday.com","type":"developed"},{"domain":"fabricfridays.com","type":"developed"},{"domain":"fabricsondemand.com","type":"developed"},{"domain":"fabricwallpaper.com","type":"developed"},{"domain":"fauxnewslive.com","type":"landing"},{"domain":"fentucci.com","type":"other"},{"domain":"ffepurchasing.com","type":"developed"},{"domain":"filthyrichliving.com","type":"landing"},{"domain":"fireratedwallcovering.com","type":"other"},{"domain":"flocked.org","type":"developed"},{"domain":"flockedwallpaper.com","type":"developed"},{"domain":"forgivestudentloandebt.com","type":"excluded"},{"domain":"freethedegree.org","type":"other"},{"domain":"glassbeadedwallpaper.com","type":"developed"},{"domain":"glitterwalls.com","type":"developed"},{"domain":"goldleafwallpaper.com","type":"developed"},{"domain":"goodquestion.ai","type":"developed"},{"domain":"grassclothwallcovering.com","type":"developed"},{"domain":"grassclothwallcoverings.com","type":"developed"},{"domain":"grassclothwallpaper.com","type":"developed"},{"domain":"greendomainbrokers.com","type":"developed"},{"domain":"greenwallcoverings.com","type":"developed"},{"domain":"handcraftedwallpaper.com","type":"developed"},{"domain":"handmadewallcovering.com","type":"other"},{"domain":"handmadewallpapers.com","type":"landing"},{"domain":"handscreenedwallpaper.com","type":"landing"},{"domain":"healthcarewallpaper.com","type":"developed"},{"domain":"hempofthemonthclub.com","type":"landing"},{"domain":"herbsmadeinchina.com","type":"landing"},{"domain":"hollywoodwallcovering.com","type":"developed"},{"domain":"hollywoodwallcoverings.com","type":"developed"},{"domain":"homesonspec.com","type":"developed"},{"domain":"hospitalitydesignreps.com","type":"developed"},{"domain":"hospitalityfabrics.net","type":"landing"},{"domain":"hospitalitymurals.com","type":"landing"},{"domain":"hospitalitysalesagency.com","type":"other"},{"domain":"hospitalitysalesagents.com","type":"landing"},{"domain":"hospitalitysalesrepresentatives.com","type":"developed"},{"domain":"hospitalitysalesreps.com","type":"landing"},{"domain":"hospitalitywallcoverings.com","type":"developed"},{"domain":"hospitalitywallpaper.com","type":"developed"},{"domain":"hospitalitywalls.com","type":"landing"},{"domain":"hotelwallcoverings.com","type":"developed"},{"domain":"inflationfears.com","type":"landing"},{"domain":"interiordesignershowroom.com","type":"other"},{"domain":"interiordesignreps.com","type":"landing"},{"domain":"iwascute.com","type":"developed"},{"domain":"joshdultz.com","type":"other"},{"domain":"jutewallpaper.com","type":"developed"},{"domain":"lacountyeats.com","type":"other"},{"domain":"lasjardineras.com","type":"landing"},{"domain":"latke.ai","type":"landing"},{"domain":"linenwallpaper.com","type":"developed"},{"domain":"losangelesfabrics.com","type":"developed"},{"domain":"losgardeners.com","type":"developed"},{"domain":"luxurymurals.com","type":"landing"},{"domain":"madagascarwallpaper.com","type":"developed"},{"domain":"malibuwallpaper.com","type":"other"},{"domain":"marijuanabuyersexchange.com","type":"landing"},{"domain":"marijuanaofthemonthclub.com","type":"landing"},{"domain":"metallicwallpaper.com","type":"developed"},{"domain":"micawallpaper.com","type":"developed"},{"domain":"mohairvelvet.com","type":"landing"},{"domain":"montereywallpaper.com","type":"other"},{"domain":"muralsondemand.com","type":"developed"},{"domain":"museumwallpaper.com","type":"developed"},{"domain":"mylarwallpaper.com","type":"developed"},{"domain":"mymemosamples.com","type":"landing"},{"domain":"nataliaabrams.com","type":"other"},{"domain":"nationalpaperhangers.com","type":"developed"},{"domain":"nationalvotingday.org","type":"other"},{"domain":"naturaltextilewallpaper.com","type":"developed"},{"domain":"naturalwallcoverings.com","type":"developed"},{"domain":"naturalwalltextures.com","type":"other"},{"domain":"nodailyworries.com","type":"other"},{"domain":"notvrequired.com","type":"landing"},{"domain":"novasuede.com","type":"developed"},{"domain":"nybutler.com","type":"landing"},{"domain":"pastelwallpaper.com","type":"developed"},{"domain":"patterndesignlab.com","type":"developed"},{"domain":"petitionyour.com","type":"other"},{"domain":"petitionyour.org","type":"other"},{"domain":"philipperomano.com","type":"developed"},{"domain":"philliperomano.com","type":"developed"},{"domain":"potofthemonthclub.com","type":"landing"},{"domain":"printmurals.com","type":"other"},{"domain":"protectyourspec.com","type":"landing"},{"domain":"protestdaily.com","type":"other"},{"domain":"raffiawallcoverings.com","type":"developed"},{"domain":"raffiawalls.com","type":"developed"},{"domain":"restaurantfabrics.com","type":"other"},{"domain":"restaurantmurals.com","type":"other"},{"domain":"restaurantwallpaper.com","type":"developed"},{"domain":"restorationwallpaper.com","type":"developed"},{"domain":"retrowalls.com","type":"developed"},{"domain":"roomsettings.com","type":"other"},{"domain":"saloonwallpaper.com","type":"developed"},{"domain":"screenprintedwallpaper.com","type":"developed"},{"domain":"selfadhesivewallpaper.com","type":"developed"},{"domain":"sheltermagazines.com","type":"other"},{"domain":"silkwallcoverings.com","type":"developed"},{"domain":"silkwallpaper.com","type":"developed"},{"domain":"silverleafwallpaper.com","type":"developed"},{"domain":"specifywallpaper.com","type":"other"},{"domain":"starsofdesign.com","type":"developed"},{"domain":"steveabramsdesigns.com","type":"other"},{"domain":"stevenabramsphotography.com","type":"other"},{"domain":"stringwallpaper.com","type":"developed"},{"domain":"studentdebtattorney.com","type":"excluded"},{"domain":"studentdebtcrisis.com","type":"excluded"},{"domain":"studentdebtcrisis.org","type":"excluded"},{"domain":"studentdebtcrisiscenter.com","type":"excluded"},{"domain":"studentdebtcrisiscenter.org","type":"excluded"},{"domain":"studentdebthotline.org","type":"excluded"},{"domain":"studentdebtlawyers.com","type":"excluded"},{"domain":"studentdebtlawyers.org","type":"excluded"},{"domain":"studentloanvoter.com","type":"excluded"},{"domain":"studentstrikes.org","type":"other"},{"domain":"suedewallpaper.com","type":"developed"},{"domain":"summergamesrentals.com","type":"landing"},{"domain":"textiletuesday.com","type":"developed"},{"domain":"textilewallpaper.com","type":"developed"},{"domain":"theatrewallpaper.com","type":"landing"},{"domain":"thecannabisnews.com","type":"landing"},{"domain":"thedesignerlaboratory.com","type":"landing"},{"domain":"thedesignerlibrary.com","type":"developed"},{"domain":"thehotelwallpaper.com","type":"other"},{"domain":"thesalesreps.com","type":"landing"},{"domain":"thesetdecorator.com","type":"other"},{"domain":"tradeonlytextiles.com","type":"landing"},{"domain":"traditionalwhimsy.com","type":"other"},{"domain":"treetrimmingguys.com","type":"landing"},{"domain":"unitedstateswallpaper.com","type":"other"},{"domain":"upperonepercent.com","type":"landing"},{"domain":"urthfriendly.com","type":"landing"},{"domain":"valleybutler.com","type":"landing"},{"domain":"venturaclaw.com","type":"developed"},{"domain":"venturacorridor.com","type":"other"},{"domain":"venturadelivers.com","type":"landing"},{"domain":"venturaeats.com","type":"landing"},{"domain":"vintagebh.com","type":"landing"},{"domain":"vinylwallpaper.com","type":"developed"},{"domain":"wall-papers.org","type":"developed"},{"domain":"wallco.ai","type":"developed"},{"domain":"wallcovering.net","type":"developed"},{"domain":"wallpapercanada.com","type":"developed"},{"domain":"wallpapercontractor.com","type":"developed"},{"domain":"wallpaperdefinitions.com","type":"developed"},{"domain":"wallpaperdictionary.com","type":"developed"},{"domain":"wallpaperdistributors.com","type":"developed"},{"domain":"wallpaperestimator.com","type":"developed"},{"domain":"wallpaperexports.com","type":"other"},{"domain":"wallpaperfromthe80s.com","type":"other"},{"domain":"wallpaperglossary.com","type":"developed"},{"domain":"wallpaperhistory.com","type":"developed"},{"domain":"wallpapernashville.com","type":"landing"},{"domain":"wallpaperny.com","type":"other"},{"domain":"wallpapernyc.com","type":"landing"},{"domain":"wallpaperondemand.com","type":"developed"},{"domain":"wallpaperpurchasing.com","type":"other"},{"domain":"wallpapersback.com","type":"developed"},{"domain":"wallpaperwednesday.com","type":"developed"},{"domain":"wallpaperweekly.com","type":"other"},{"domain":"wallsandfabrics.com","type":"developed"},{"domain":"wallsondemand.com","type":"developed"},{"domain":"wc-01.com","type":"landing"},{"domain":"wc01wallcoverings.com","type":"other"},{"domain":"wc01wallpaper.com","type":"landing"},{"domain":"weedofthemonthclub.com","type":"landing"},{"domain":"wholivedthere.com","type":"developed"},{"domain":"wintergamesrentals.com","type":"landing"},{"domain":"withoutstudentdebt.com","type":"excluded"},{"domain":"withoutstudentdebt.org","type":"excluded"},{"domain":"zayde.ai","type":"landing"}]
\ No newline at end of file
diff --git a/server.js b/server.js
index b2c72a3..760cfb8 100644
--- a/server.js
+++ b/server.js
@@ -173,8 +173,93 @@ h1{font-size:20px;margin:0 0 18px}.card{background:#161b22;border:1px solid #2a3
 ${cards || '<p class="empty">No offers yet.</p>'}`);
 }
 
+function adminWall(req, res) {
+  const hdr = req.headers.authorization || '';
+  const want = 'Basic ' + Buffer.from(BASIC_AUTH).toString('base64');
+  if (hdr !== want) {
+    res.writeHead(401, { 'WWW-Authenticate': 'Basic realm="wall"' }).end('auth required');
+    return;
+  }
+  let sites = [];
+  try { sites = JSON.parse(fs.readFileSync(path.join(__dirname, 'data/all-sites.json'), 'utf8')); } catch {}
+  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>
+<style>
+:root{--cols:4}
+*{box-sizing:border-box;margin:0;padding:0}
+body{font:14px/1.4 -apple-system,system-ui,sans-serif;background:#0d1117;color:#e6edf3}
+header{position:sticky;top:0;z-index:10;background:#0d1117ee;backdrop-filter:blur(8px);border-bottom:1px solid #21262d;padding:12px 18px;display:flex;gap:16px;align-items:center;flex-wrap:wrap}
+h1{font-size:16px;font-weight:700}h1 b{color:#58a6ff}
+label{font-size:11px;color:#8b949e;text-transform:uppercase;letter-spacing:.06em;margin-right:6px}
+select,input[type=range]{vertical-align:middle}
+select{background:#161b22;color:#e6edf3;border:1px solid #30363d;border-radius:7px;padding:6px 10px;font:inherit}
+input[type=range]{width:150px}
+.filter{background:#161b22;color:#e6edf3;border:1px solid #30363d;border-radius:7px;padding:6px 10px}
+.grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:14px;padding:18px}
+.card{background:#161b22;border:1px solid #21262d;border-radius:12px;overflow:hidden;display:flex;flex-direction:column}
+.frame{position:relative;width:100%;aspect-ratio:4/3;overflow:hidden;background:#0d1117;border-bottom:1px solid #21262d}
+.frame iframe{position:absolute;top:0;left:0;width:1280px;height:960px;border:0;transform-origin:0 0;pointer-events:none;background:#fff}
+.ph{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#484f58;font-size:12px}
+.meta{padding:9px 11px;display:flex;justify-content:space-between;align-items:center;gap:8px}
+.dom{font-weight:600;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.dom a{color:#e6edf3;text-decoration:none}.dom a:hover{color:#58a6ff}
+.badge{font-size:9px;text-transform:uppercase;letter-spacing:.04em;padding:2px 7px;border-radius:999px;white-space:nowrap}
+.b-landing{background:#1f6feb33;color:#79c0ff}.b-developed{background:#23863633;color:#7ee787}
+.b-other{background:#6e768133;color:#c9d1d9}.b-excluded{background:#f8514933;color:#ff7b72}
+.count{color:#8b949e;font-size:12px;margin-left:auto}
+</style></head><body>
+<header>
+<h1>Portfolio wall<b>.</b></h1>
+<div><label>Sort</label><select id=sort>
+<option value=name>Name A→Z</option><option value=type>Type</option>
+<option value=landing>Landings first</option><option value=developed>Developed first</option></select></div>
+<div><label>Type</label><select id=type class=filter>
+<option value=all>All (${sites.length})</option><option value=landing>Landings</option>
+<option value=developed>Developed</option><option value=other>Other</option><option value=excluded>Excluded</option></select></div>
+<div><label>Density</label><input type=range id=dens min=2 max=8 step=1></div>
+<span class=count id=count></span>
+</header>
+<div class=grid id=grid></div>
+<script>
+const SITES=${JSON.stringify(sites)};
+const grid=document.getElementById('grid'), sortEl=document.getElementById('sort'),
+      typeEl=document.getElementById('type'), densEl=document.getElementById('dens'), countEl=document.getElementById('count');
+const LS=(k,d)=>localStorage.getItem('wall_'+k)||d;
+sortEl.value=LS('sort','name'); typeEl.value=LS('type','all'); densEl.value=LS('dens','4');
+function applyDens(){document.documentElement.style.setProperty('--cols',densEl.value);
+  // scale iframe (1280 wide) to card width
+  const cw=grid.querySelector('.frame'); if(cw){const s=cw.clientWidth/1280;
+    document.querySelectorAll('.frame iframe').forEach(f=>f.style.transform='scale('+s+')');}}
+const io=new IntersectionObserver((es)=>{es.forEach(e=>{if(e.isIntersecting){const f=e.target;
+  if(!f.dataset.loaded){f.dataset.loaded=1;const if_=document.createElement('iframe');
+    if_.loading='lazy';if_.src='https://'+f.dataset.dom+'/';if_.sandbox='allow-scripts allow-same-origin';
+    const s=f.clientWidth/1280;if_.style.transform='scale('+s+')';
+    if_.onload=()=>{const ph=f.querySelector('.ph');if(ph)ph.style.display='none'};f.appendChild(if_);}io.unobserve(f);}})},{rootMargin:'300px'});
+function render(){
+  const t=typeEl.value; let list=SITES.filter(s=>t==='all'||s.type===t);
+  const sv=sortEl.value;
+  if(sv==='name')list.sort((a,b)=>a.domain.localeCompare(b.domain));
+  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+'"><div class=ph>'+s.domain+'</div></div>'+
+    '<div class=meta><span class=dom><a href="https://'+s.domain+'/" target=_blank rel=noopener>'+s.domain+'</a></span>'+
+    '<span class="badge b-'+s.type+'">'+s.type+'</span></div></div>').join('');
+  grid.querySelectorAll('.frame').forEach(f=>io.observe(f)); applyDens();
+}
+sortEl.onchange=()=>{localStorage.setItem('wall_sort',sortEl.value);render()};
+typeEl.onchange=()=>{localStorage.setItem('wall_type',typeEl.value);render()};
+densEl.oninput=()=>{localStorage.setItem('wall_dens',densEl.value);applyDens()};
+render(); window.addEventListener('resize',applyDens);
+</script></body></html>`);
+}
+
 const server = http.createServer((req, res) => {
   const host = hostOf(req);
+  if (req.method === 'GET' && req.url.split('?')[0] === '/admin/wall') {
+    return adminWall(req, res);
+  }
   if (req.method === 'GET' && req.url.split('?')[0] === '/admin/inquiries') {
     return adminInquiries(req, res);
   }

← 15951fe migrate 15 abrams-* coming-soon domains to full GA4 landings  ·  back to Domain Landings  ·  wall: thumbnail-primary (screenshot) with click-to-live-ifra 93a827b →