Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
40f706f · 2026-09-25 · push-videos: wait for network before Cognito/rsync (boot-race exit=255, TK-12250)
Sibling of TK-12257 (ads-dashboard-fmpro). Mac2 reboot at 11:52:25 PDT (18:52Z)
fired RunAtLoad before the network route was up, so sync-videos.mjs's fetch and
the rsync/ssh to Kamatera died with "fetch failed" / "No route to host" -> exit
255. Reuses the shared boot-grace.sh helper (bounded network wait inside the
900s post-boot grace window; a genuine outage still proceeds and FAILs).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hkjf1KKfdbgE7fNCSHt8jZ
c1ab0a9 · 2026-09-15 · chore: commit code deployed in 2026-09-15 fleet push
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwddjWujivh6oHPnqGqRoK
ba93d26 · 2026-09-12 · check-live: direct-first / residential-proxy-fallback for resilient YT live-check
Prod's datacenter IP gets the real YouTube page most of the time (the wall is
intermittent), so try direct first (free, no proxy bandwidth) and fall back to
the Webshare static-residential proxy only when the page is walled (no
ytInitialPlayerResponse). Degrades gracefully — if the proxy is down/lapsed,
direct still covers every unwalled fetch instead of a hard 0-live outage.
fetchHtml now takes an explicit agent arg. TK-11340
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KdYQbarNfqKNkgQLQffDS4
acde7bd · 2026-09-11 · Fix live detection through residential proxy: anchor on live marker, not videoDetails proximity
YouTube serves a different ytInitialPlayerResponse layout to the proxy egress IP
than to Mac2's residential IP — the primary "isLive":true can sit ~370KB before
the "videoDetails" key, so the old /"videoDetails":\{[^}]*"isLive":true/ regex
matched 0/20 live channels through the proxy. Align detectLive with LIVE_MARKER
(hlsManifestUrl | isLive:true | isLiveNow:true). Verified no false positives on
non-live channels (Fox/MSNBC/BBC carry zero isLive:true through the proxy). TK-11340
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KdYQbarNfqKNkgQLQffDS4
ba6d50f · 2026-09-11 · Fix daily-short crash: reject SVG stock images instead of crashing the whole render
Root cause (TK-11458): Openverse sometimes returns an SVG (a world/BRICS map)
tagged as a photo match; fetch-stock.mjs only checked the content-type against
/image\// which matches image/svg+xml, so the SVG got saved as e.g. img/2.jpg.
ImageMagick content-sniffs the file regardless of extension, renders it as
vector art via its SVG coder, and tries to render embedded <text> labels
through its font engine — an unresolvable font-family there throws
"unable to read font `'" from RenderFreetype and kills the entire 8-card
render (reproduced standalone: `magick img/2.jpg ...` -> identical error).
This was NOT a font-resolution bug in render-short.js's FONT_PRIMARY/
FONT_FALLBACK logic (unrelated, correctly resolved) and NOT a concurrency
bug (the pipeline is fully synchronous execFileSync, no Promise.all/async).
Fix, both ends:
- fetch-stock.mjs: reject image/svg+xml in downloadFirstUsable(), mirroring
the exclusion grabLogo() already had for logos but that was never mirrored
onto the stock-photo downloader.
- render-short.js: imgPath() now validates real magic bytes (JPEG/PNG/GIF/
WEBP/BMP) before handing a file to magick; anything else (SVG, HTML error
page, truncated download) is treated as "no image" and falls back to the
existing gradient-card background instead of crashing the pipeline.
Verified: re-ran render-short.js directly against today's already-fetched
stories.json/script.json/vo.mp3/img (reused, no ElevenLabs re-spend). The new
guard caught TWO bad SVGs in this batch (img/2.jpg and img/3.jpg, the latter
a literal "BRICS members" Wikipedia map matching the BRICS headline) and both
cards rendered cleanly on the gradient fallback. All 8 cards + final out.mp4
(1080x1920, 46.30s, VO AAC) produced with no errors or residual warnings.
bf0d044 · 2026-09-10 · front page: Drudge-style photos — big splash photo + a lead photo per column; dedupe to 1 article per topic
- rss.js: extract lead image per item (media:content/thumbnail, image enclosure, first <img> in desc); https-only URL guard
- aggregate.js: carry image through; dedupe near-identical topics wire-wide; splash prefers image-bearing story + removed from its column
- server.js: render splash photo + per-column lead photo card (SSR + client paint identical), lazy+no-referrer imgs, 16:9 aspect-ratio, graceful no-photo fallback
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QqMmD8S45PEQRKbQM1KBo
af0cd1b · 2026-09-10 · front page: Drudge-scale smaller text + cap headlines to 20 words (both SSR + live-refresh paths)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QqMmD8S45PEQRKbQM1KBo
85e4126 · 2026-09-09 · front page: Drudge-style 3-column article layout
Homepage renderFront() now lays the wire out as 3 clean columns (U.S./TOP · WORLD ·
MONEY/TECH) like the Drudge Report — grid repeat(4,1fr)->repeat(3,1fr); moved the
COLUMNISTS/MAGAZINES/DIRECTORY rail out of the article grid into a full-width strip
below (.railstrip). Splash + live refresh + responsive collapse (3->2->1) unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
046bf14 · 2026-09-09 · allnewsdaily: PROXY_URL-aware + gzip + early-abort fetch in check-live.js (TK-11340)
- Optional residential/ISP proxy egress via PROXY_URL (lazy https-proxy-agent dep;
no-op + no dep needed when unset, so Mac2 dev path is unchanged).
- Accept-Encoding gzip/br + local decompress: ~1.65MB -> ~0.38MB per fetch.
- Early-abort at live marker / 900KB cap: ~0.2MB/fetch worst case.
Verified locally (no proxy): 20 outlets, 13 live, 0 errors, 2.6s.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015acgmNP9spwqQLjfFcf1Qs
47a0b36 · 2026-09-09 · allnewsdaily: add self-verifying deploy-outlets.sh (rsync outlets.json + print remote count)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015acgmNP9spwqQLjfFcf1Qs
54ada90 · 2026-09-09 · allnewsdaily Short: show each network's real logo on the source chip
fetch-stock.mjs downloads one logo per story (domain-derived: Clearbit → DuckDuckGo icon
proxy → Google favicons). render-short.js composites the logo + outlet name into a white
lower-third chip, replacing the red VIA {OUTLET} text (which stays as fallback when a logo
misses). Nominative-use attribution logos, not article imagery. Verified 6/6 logos + legible.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c16abe8 · 2026-09-09 · allnewsdaily: cut outlet directory to top-20 most-popular global channels (live-check load 74->20)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015acgmNP9spwqQLjfFcf1Qs
1a87806 · 2026-09-09 · allnewsdaily Short: publish 3x/day (6/12/18) + min-gap guard + guard follows each publish
Daily-short launchd → 3 fire times (6am/12pm/6pm); replaced once-per-day lock with a 120min
min-gap guard so the 3 runs proceed while an accidental double-fire is blocked. History-based
dedupe already gives each run distinct headlines. Delete-canary → 09:30/13:30/19:30/21:30 to
follow each publish.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e68bd39 · 2026-09-09 · allnewsdaily Short: Steve's cloned voice + natural model + stock-photo card backgrounds
Voice → Steve Abrams clone (Xa9qV4wNbvSkdUWsYLzq), model eleven_multilingual_v2 with
looser voice_settings (less mechanical). New fetch-stock.mjs pulls one commercial-safe
Openverse CC0/public-domain image per headline (keyword + generic-news fallback chain =
full coverage); render-short.js uses it as a darkened full-bleed card background with a
legibility scrim, falling back to the gradient card when no image. Addresses TK-11343 sameness.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42d9caf · 2026-09-09 · allnewsdaily Short: auto-public + delete-canary (DTD verdict)
DTD panel (3-3, broken to auto-public on argument weight + Cody's reframe): publish
public but guard it with automation, not a human click. Pipeline default → public;
records data/short/published/<id>.json per upload. New post-publish-canary.mjs re-verifies
each Short's sources a few hours after publish and auto-unlists any whose source was pulled
(definitive 404/410 only — never on a transient error), + flags channel abandonment. Widened
OAuth scope to youtube.force-ssl so the canary can unlist. New allnewsdaily-short-guard skill
(PASS/WARN/FAIL) + launchd (10/14/18h, not loaded). Delete-canary detection verified locally.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9eb9cfa · 2026-09-09 · allnewsdaily: daily YouTube Short pipeline (headlines→vertical Short→unlisted upload)
Fans wire.json top-6 headlines through pick→script→ElevenLabs VO→ffmpeg/ImageMagick
render→resumable unlisted YouTube upload, on a daily launchd job (not yet loaded).
Includes Cody/DTD red-team hardening: feed-freshness guard (refuse stale news),
cross-day dedupe, fleet-visible PASS/WARN/FAIL canary, launchd-safe node/PATH,
resumable-resume upload retry, thumbnail upload, same-day lock, single-clock dates.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9a1fdc0 · 2026-09-09 · Live static-mode via sentinel file (no prod env/restart) instead of LIVE_STATIC env
server.js doesn't load dotenv, so a LIVE_STATIC env would need a pm2 --update-env that risks
dropping PORT=9962 and breaking the nginx proxy. Safer: static-live activates when
data/live-static.flag exists (checked each tick, no restart). The Mac2 pusher drops the flag on
prod after pushing live-status.json, so go-live needs only: deploy + load the Mac2 push job.
env LIVE_STATIC=1 still works as an override. Verified: flag present → checker disabled; removed → restored.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
7620db7 · 2026-09-09 · Live feature: LIVE_STATIC mode + Mac2 push (consent-cookie failed on prod's datacenter IP)
The consent-cookie bypass wasn't enough — prod still reads 0/98 live (YouTube hard-blocks
the datacenter IP). Fallback mirrors the wire.json push architecture:
- server.js: LIVE_STATIC=1 disables prod's own checker so it stops overwriting pushed data.
- scripts/push-live-status.sh: runs check-live.js on Mac2 (residential IP → 24 live) and
rsyncs data/live-status.json to prod. Mirrors push-wire.sh.
- com.steve.allnewsdaily-live-push.plist: Mac2 LaunchAgent, every 120s (load is Steve-gated).
Go-live (gated, Steve): (1) set LIVE_STATIC=1 on prod the same way WIRE_STATIC=1 is set +
reload; (2) load the Mac2 push LaunchAgent. Then prod serves the real ~24 live outlets.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
60e002d · 2026-09-09 · /directory UX pass: fix dead logos, tool-first layout, live-checker consent bypass
- Logos: Clearbit's logo API is dead (NAME_NOT_RESOLVED → ~40 outlets showed text
placeholders + 81 console errors). Switched to Google's favicon service derived
from each outlet's domain; verified 98/98 logos now load, 0 placeholders, errors gone.
- Layout: moved the outlet grid ABOVE the intro/guides/regions editorial blocks
(tool-first) — grid now ~365px instead of below 3 text sections; content kept below.
- Live: 0/98-live was YouTube serving a consent interstitial to prod's datacenter IP
(Mac2 residential IP finds ~24 live). Added CONSENT/SOCS cookie + gl=US&hl=en to the
checker's YouTube fetch to bypass it on prod. Local re-check: 24 live, no regression.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
e2504ec · 2026-09-09 · Banner zones: auto-fallback house banner while AdSense unit is unfilled
Site is in AdSense "Getting ready" (authorized Sep 3) so no real ads serve yet —
the zones were rendering as empty "Advertisement" boxes ("NO Ads"). Now each zone
carries the real <ins> AND a hidden house banner (links to /directory); a small
resolve script shows the house banner while data-ad-status is "unfilled"/collapsed
and swaps to the real ad the instant it fills. Verified in-browser: all 3 zones show
750x90 / 726x110 / 726x90 house banners when unfilled. Real slots stay in the DOM,
so the slot-guard canary still passes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
0de1cad · 2026-09-09 · Re-instate portal-VERIFIED AdSense slots (revert of 345ef9e's false 'fabricated' removal)
345ef9e removed slots 1009806200 / 5567646667 / 5129014617 claiming they were
fabricated. They are NOT — re-confirmed live against the AdSense account 3 ways:
unit names present in the units list; each slot's /generate-ad-code page loads its
matching named unit; data-ad-slot in the code matches. Restored as constant defaults
with a VERIFIED-LIVE / DO-NOT-REMOVE note so a future sweep doesn't re-revert.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
345ef9e · 2026-09-09 · SAFETY: remove hardcoded/fabricated AdSense slot IDs from banner zones; live units render only from genuine env-supplied slot IDs, else labeled house placeholder (protects live AdSense account)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0177CKXFpA1rVH3Sk24fgRZ9
ef95156 · 2026-09-09 · Wire live AdSense display units into the 3 banner zones
Created 3 responsive display units in the AdSense portal (pub-5278231299883833)
via portal-driver and set them as the banner-zone slot defaults:
top → 1009806200 (AND Top Leaderboard)
mid → 5567646667 (AND Mid Banner)
bottom → 5129014617 (AND Bottom Banner)
Slot IDs are public (they render in the page ad code), so they live as constant
defaults; env AD_SLOT_TOP/MID/BOTTOM still override. Ads serve only on the
approved live domain, not localhost.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
0337f69 · 2026-09-09 · Front page: 2-min live-refresh loop + countdown counter + big banner ads
- Client polls /api/wire every 120s and re-renders the splash + wire columns
in place (no full reload, so AdSense units don't re-request every cycle).
Server-rendered content stays the initial paint (SEO/AdSense-safe).
- Live "counter at top": LIVE WIRE ticker bar with a MM:SS countdown to the
next refresh, a cycle counter, and a live "updated · N/M sources" readout.
- Three big banner ad zones (top leaderboard, mid, bottom): render a real
AdSense responsive display unit when AD_SLOT_TOP/MID/BOTTOM is set, else a
labeled house placeholder so the zones are visibly present.
- Server wire rebuild cadence now follows REFRESH_MS (default 120s) to match.
Verified on a static-wire test instance: countdown ticks 1s cadence, all 3
banner zones render (776x132 / 752x152 / 752x132), 3 cols / 60 stories paint,
/api/wire returns 60 stories.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV1DXsyryWT3rLttpPXd4u
996668c · 2026-09-09 · feed balance: cap 3 items per outlet per column so no single source dominates (env PER_OUTLET)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0177CKXFpA1rVH3Sk24fgRZ9
f1da61c · 2026-09-09 · wire-push: robust node resolution for launchd; add wire-push launchd plist (load is Steve-gated)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0177CKXFpA1rVH3Sk24fgRZ9
9829705 · 2026-09-09 · Add prod static-wire mode: WIRE_STATIC=1 serves pre-built data/wire.json (no Ollama on prod); scripts/build-wire.js + scripts/push-wire.sh keep it fresh from this Mac's Ollama
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0177CKXFpA1rVH3Sk24fgRZ9
4563468 · 2026-09-09 · Drudge-style front page: live free-RSS wire rewritten into original 1-sentence topics (qwen3:14b, cached) + Columnists/Magazines rails; outlet directory preserved at /directory; AdSense + trust layer intact
- lib/rss.js: zero-dep RSS/Atom parser
- lib/paraphrase.js: $0-local headline→original-sentence rewrite (Ollama qwen3:14b, strict no-embellishment prompt, URL-hash cache, deterministic fallback)
- lib/aggregate.js: fetch ~21 free feeds → dedupe → rewrite (concurrency 8) → in-memory wire, 10-min refresh
- server.js: / renders server-side Drudge front; /directory = old grid; /api/wire; sitemap += /directory
- data/feeds.json: curated free feeds + 16 columnists + 10 magazines
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0177CKXFpA1rVH3Sk24fgRZ9