[object Object]

← back to Contact Mailer Ideas

viewer banner: today's batch + countdown to next 5 AM auto-batch

fbef505210bba7d8631756b0c221d062cd76ae8e · 2026-05-11 12:43:06 -0700 · Steve Abrams

Files touched

Diff

commit fbef505210bba7d8631756b0c221d062cd76ae8e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon May 11 12:43:06 2026 -0700

    viewer banner: today's batch + countdown to next 5 AM auto-batch
---
 viewer/server.js | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/viewer/server.js b/viewer/server.js
index ee1b407..7a8113c 100644
--- a/viewer/server.js
+++ b/viewer/server.js
@@ -110,7 +110,11 @@ html,body{background:#0b0b0d;color:#e8e8ea;font-family:-apple-system,BlinkMacSys
 header{padding:32px 48px 16px;display:flex;align-items:baseline;gap:24px;border-bottom:1px solid #1a1a1f}
 header h1{font-size:22px;font-weight:700;letter-spacing:-0.01em}
 header .meta{color:#7a7a82;font-size:13px}
-header .right{margin-left:auto;color:#7a7a82;font-size:12px}
+header .right{margin-left:auto;color:#7a7a82;font-size:12px;text-align:right}
+.banner{margin:0 48px;padding:14px 18px;background:linear-gradient(90deg,#0d2738,#0e1f30);border:1px solid #1c3a52;border-radius:10px;display:flex;gap:18px;align-items:center;font-size:13px;color:#bcd5e5}
+.banner .dot{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 8px #22c55e;flex-shrink:0}
+.banner b{color:#fff;font-weight:600}
+.banner .next{margin-left:auto;color:#7aa3bf;font-size:12px}
 header a{color:#9aa3b2;text-decoration:none;border-bottom:1px solid #2a2a31}
 header a:hover{color:#fff;border-color:#fff}
 .wrap{padding:32px 48px;display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:20px}
@@ -162,6 +166,7 @@ footer{padding:20px 48px 40px;color:#5a5a62;font-size:12px;text-align:center}
     <span class="refresh" id="rfx">auto-refresh 15s</span>
   </span>
 </header>
+<div class="banner" id="banner" style="margin-top:18px"></div>
 <div class="wrap" id="grid"></div>
 <footer>port 9773 · localhost only · source ~/.claude/skills/idea-loop/data/ideas.jsonl</footer>
 <script>
@@ -174,6 +179,23 @@ async function loadBatches(){
   if (!currentDate && list.length) currentDate = list[0].date;
   sel.value = currentDate || '';
   sel.onchange = () => { currentDate = sel.value; load(); };
+  renderBanner(list);
+}
+function renderBanner(list){
+  const banner = document.getElementById('banner');
+  const today = new Date().toISOString().slice(0,10);
+  const todays = list.find(b => b.date === today);
+  // Compute next 5am PT
+  const now = new Date();
+  const fire = new Date(now);
+  fire.setHours(5,0,0,0);
+  if (fire <= now) fire.setDate(fire.getDate()+1);
+  const hrs = Math.floor((fire - now)/3600000);
+  const mins = Math.floor(((fire - now) % 3600000)/60000);
+  const status = todays
+    ? '<b>Today (' + today + ')</b> · ' + todays.count + ' ideas · ' + (todays.generator.includes('claude') ? 'auto-generated 5:00 AM PT' : 'manual seed batch')
+    : '<b>No batch yet for today</b> · daily generator fires at 5:00 AM PT';
+  banner.innerHTML = '<span class="dot"></span><span>' + status + '</span><span class="next">Next auto-batch: tomorrow 5 AM PT (in ' + hrs + 'h ' + mins + 'm)</span>';
 }
 async function load(){
   const url = currentDate ? '/api/state?date='+encodeURIComponent(currentDate) : '/api/state';

← 045f74b daily generator: claude CLI → 20 fresh ideas every 5am PT, b  ·  back to Contact Mailer Ideas  ·  viewer: search across all fields (name/headline/target/actio bd6d8c4 →