[object Object]

← back to Marketing Command Center

Add IG Network Activity panel (what's posted + where, per-card date/time, sort+density)

1ccbe0547875e7f88cde70b7eaca9a281a88e132 · 2026-08-11 08:19:48 -0700 · Steve Abrams

Files touched

Diff

commit 1ccbe0547875e7f88cde70b7eaca9a281a88e132
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Aug 11 08:19:48 2026 -0700

    Add IG Network Activity panel (what's posted + where, per-card date/time, sort+density)
---
 public/ig-activity.html | 115 ++++++++++++++++++++++++++++++++++++++++++++++++
 public/ig-activity.json | 106 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 221 insertions(+)

diff --git a/public/ig-activity.html b/public/ig-activity.html
new file mode 100644
index 0000000..88ae127
--- /dev/null
+++ b/public/ig-activity.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>IG Network Activity · Designer Wallcoverings</title>
+<style>
+  :root{ --bg:#0f0e0c; --card:#1a1815; --line:#2a2620; --ink:#f4f1ea; --mut:#a7a094; --accent:#c9a86a; --cols:4; }
+  *{box-sizing:border-box}
+  body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif}
+  header{padding:28px 28px 10px;border-bottom:1px solid var(--line)}
+  h1{margin:0;font-weight:300;letter-spacing:.14em;text-transform:uppercase;font-size:20px}
+  h1 b{color:var(--accent);font-weight:600}
+  .sub{color:var(--mut);font-size:13px;margin-top:6px}
+  .stats{display:flex;gap:22px;margin-top:14px;flex-wrap:wrap}
+  .stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px 16px}
+  .stat b{display:block;font-size:22px;color:var(--accent);font-weight:600}
+  .stat span{font-size:11px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em}
+  .toolbar{display:flex;gap:18px;align-items:center;padding:16px 28px;flex-wrap:wrap;position:sticky;top:0;background:var(--bg);z-index:5;border-bottom:1px solid var(--line)}
+  .toolbar label{color:var(--mut);font-size:12px;text-transform:uppercase;letter-spacing:.08em;margin-right:8px}
+  select,input[type=range]{accent-color:var(--accent)}
+  select{background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-size:13px}
+  .grid{display:grid;grid-template-columns:repeat(var(--cols),1fr);gap:16px;padding:22px 28px 60px}
+  .card{background:var(--card);border:1px solid var(--line);border-radius:12px;overflow:hidden;display:flex;flex-direction:column;transition:border-color .15s,transform .15s}
+  .card:hover{border-color:var(--accent);transform:translateY(-2px)}
+  .thumb{aspect-ratio:1/1;background:#111 center/cover no-repeat;display:block}
+  .body{padding:12px 13px 13px}
+  .acct{color:var(--accent);font-weight:600;font-size:13px;text-decoration:none}
+  .acct:hover{text-decoration:underline}
+  .title{font-size:13px;color:var(--ink);margin:5px 0 8px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.6em}
+  .when{color:var(--mut);font-size:11px;display:flex;align-items:center;gap:5px}
+  .foot{display:flex;justify-content:space-between;align-items:center;margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}
+  .view{font-size:12px;color:var(--accent);text-decoration:none;border:1px solid var(--line);border-radius:6px;padding:4px 9px}
+  .view:hover{background:var(--accent);color:#000;border-color:var(--accent)}
+  .empty{color:var(--mut);text-align:center;padding:80px 20px}
+  @media(max-width:640px){ .grid{--cols:2 !important} }
+</style>
+</head>
+<body>
+<header>
+  <h1>Designer <b>Wallcoverings</b> · IG Network Activity</h1>
+  <div class="sub">What's being posted, and to which account — across the live Instagram fleet.</div>
+  <div class="stats">
+    <div class="stat"><b id="s-posts">–</b><span>Posts</span></div>
+    <div class="stat"><b id="s-accts">–</b><span>Accounts</span></div>
+    <div class="stat"><b id="s-last">–</b><span>Last post</span></div>
+  </div>
+</header>
+<div class="toolbar">
+  <div><label>Sort</label>
+    <select id="sort">
+      <option value="newest">Newest</option>
+      <option value="oldest">Oldest</option>
+      <option value="account">Account A→Z</option>
+      <option value="product">Product A→Z</option>
+    </select>
+  </div>
+  <div><label>Density</label>
+    <input type="range" id="density" min="2" max="7" step="1">
+  </div>
+  <div class="sub" id="gen" style="margin-left:auto"></div>
+</div>
+<div id="grid" class="grid"></div>
+
+<script>
+const $=s=>document.querySelector(s);
+const fmt=iso=>{try{return new Date(iso).toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'})}catch{return iso||''}};
+let DATA=[];
+function render(){
+  const sort=$('#sort').value;
+  const p=[...DATA];
+  if(sort==='newest')p.sort((a,b)=>new Date(b.ts)-new Date(a.ts));
+  if(sort==='oldest')p.sort((a,b)=>new Date(a.ts)-new Date(b.ts));
+  if(sort==='account')p.sort((a,b)=>(a.handle||'').localeCompare(b.handle||''));
+  if(sort==='product')p.sort((a,b)=>(a.product_title||'').localeCompare(b.product_title||''));
+  const g=$('#grid');
+  if(!p.length){g.innerHTML='<div class="empty">No posts logged yet. As the network posts, they appear here.</div>';return;}
+  g.innerHTML=p.map(x=>`
+    <div class="card">
+      <a href="${x.permalink||'#'}" target="_blank" rel="noopener noreferrer">
+        <span class="thumb" style="background-image:url('${(x.image_url||'').replace(/'/g,'')}')"></span></a>
+      <div class="body">
+        <a class="acct" href="https://www.instagram.com/${x.handle}/" target="_blank" rel="noopener noreferrer">@${x.handle}</a>
+        <div class="title" title="${(x.product_title||'').replace(/"/g,'&quot;')}">${x.product_title||'—'}</div>
+        <div class="when" title="${x.ts||''}">🕓 ${fmt(x.ts)}</div>
+        <div class="foot">
+          <span class="when">${x.kind||'IMAGE'}</span>
+          <a class="view" href="${x.permalink||'#'}" target="_blank" rel="noopener noreferrer">View post ↗</a>
+        </div>
+      </div>
+    </div>`).join('');
+}
+function applyDensity(v){document.documentElement.style.setProperty('--cols',v);}
+async function load(){
+  try{
+    const r=await fetch('ig-activity.json?t='+Date.now());
+    const j=await r.json();
+    DATA=j.posts||[];
+    $('#s-posts').textContent=j.total_posts??DATA.length;
+    $('#s-accts').textContent=j.accounts_touched??new Set(DATA.map(x=>x.handle)).size;
+    $('#s-last').textContent=j.last_post_at?fmt(j.last_post_at):'–';
+    $('#gen').textContent='Updated '+(j.generated_at?fmt(j.generated_at):'');
+  }catch(e){DATA=[];}
+  render();
+}
+// persisted controls
+const sSort=localStorage.getItem('ig_sort')||'newest';
+const sDen=localStorage.getItem('ig_density')||'4';
+$('#sort').value=sSort;$('#density').value=sDen;applyDensity(sDen);
+$('#sort').onchange=()=>{localStorage.setItem('ig_sort',$('#sort').value);render();};
+$('#density').oninput=()=>{const v=$('#density').value;localStorage.setItem('ig_density',v);applyDensity(v);};
+load(); setInterval(load,60000); // auto-refresh each minute
+</script>
+</body>
+</html>
diff --git a/public/ig-activity.json b/public/ig-activity.json
new file mode 100644
index 0000000..92f8dbd
--- /dev/null
+++ b/public/ig-activity.json
@@ -0,0 +1,106 @@
+{
+  "generated_at": "2026-08-11T15:18:04.900Z",
+  "total_posts": 8,
+  "accounts_touched": 8,
+  "last_post_at": "2026-08-11T08:13:00-07:00",
+  "by_account": {
+    "screenprintedwallpaper": 1,
+    "metallicwallpaper": 1,
+    "goldleafwallpaper": 1,
+    "linenwallpaper": 1,
+    "grassclothwallpaper": 1,
+    "velvetwallpaper": 1,
+    "suedewallpaper": 1,
+    "textilewallpaper": 1
+  },
+  "posts": [
+    {
+      "ts": "2026-08-11T08:13:00-07:00",
+      "handle": "screenprintedwallpaper",
+      "page_name": "Screen Printed Wallpaper",
+      "product_handle": "regal-lattice-screen-printed-wallpaper-tre-12907",
+      "product_title": "Regal Lattice - Screen Printed Wallcovering",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/3547fe79068d43fd86725b501b7c7f01.jpg",
+      "permalink": "https://www.instagram.com/p/Db54ExfmxI5/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T08:12:00-07:00",
+      "handle": "metallicwallpaper",
+      "page_name": "Metallic Wallpaper",
+      "product_handle": "showgirls-wallpaper",
+      "product_title": "Showgirls Metallic Gold & Black Wallcovering | Graduate Collection",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ScreenShot2023-09-11at1.53.19PM.png",
+      "permalink": "https://www.instagram.com/p/Db54BKHG8Sv/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T08:12:00-07:00",
+      "handle": "goldleafwallpaper",
+      "page_name": "Gold Leaf Wallpaper",
+      "product_handle": "dwtt-80525-designer-wallcoverings-los-angeles",
+      "product_title": "Metal Leaf Metallic Gold - Gold Wallcovering | Thibaut",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T41011_e0cd5049-136c-456e-b07d-a26bbb77e65b.jpg",
+      "permalink": "https://www.instagram.com/p/Db54C7Cm-G_/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T07:56:00-07:00",
+      "handle": "linenwallpaper",
+      "page_name": "Linen Wallpaper",
+      "product_handle": "pure-elements-sisal-linen",
+      "product_title": "Pure Elements Sisal Linen Wallcoverings",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/0075624_sisal_650.jpg",
+      "permalink": "https://www.instagram.com/p/Db50HyfG93k/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T07:56:00-07:00",
+      "handle": "grassclothwallpaper",
+      "page_name": "Wallpaper Weekly",
+      "product_handle": "papalo-paper-grasscloth-prg-71096",
+      "product_title": "Papalo Paper Grasscloth | Phillipe Romano",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/cf484d7a1d1bd1eeba8b00c589a2453d.jpg",
+      "permalink": "https://www.instagram.com/p/Db50Jmnm-7m/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T07:55:00-07:00",
+      "handle": "velvetwallpaper",
+      "page_name": "Velvet Wallpaper",
+      "product_handle": "veronicas-madison-flocked-velvet-wallpaper-4",
+      "product_title": "Veronica's Madison Flocked Velvet Wallcovering",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/VV218_madison_MAROON_1056x_8d36f6e3-f1df-410f-a0a6-f8c80c8ac535.webp",
+      "permalink": "https://www.instagram.com/p/Db50Endm9JZ/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T07:55:00-07:00",
+      "handle": "suedewallpaper",
+      "page_name": "Suede Wallpaper",
+      "product_handle": "prw-920205-cts-07",
+      "product_title": "Ciudad Suede Natural | Phillipe Romano",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/prw-920205-cts-07.jpg",
+      "permalink": "https://www.instagram.com/p/Db50GKmG_k8/",
+      "media_id": null,
+      "kind": "IMAGE"
+    },
+    {
+      "ts": "2026-08-11T07:52:00-07:00",
+      "handle": "textilewallpaper",
+      "page_name": "Textile Wallpaper",
+      "product_handle": "wick-submerge-maharam",
+      "product_title": "Wick Submerge | Maharam",
+      "image_url": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MH-WICK-021_0.jpg",
+      "permalink": "https://www.instagram.com/p/Db5zlrhG1xF/",
+      "media_id": null,
+      "kind": "IMAGE"
+    }
+  ]
+}
\ No newline at end of file

← a924073 auto-data-snapshot: 2026-08-09T04:37:25 (1 data files) — pub  ·  back to Marketing Command Center  ·  IG activity panel: grid/list toggle + sort by all columns (d 1ec9940 →