Allnewsdaily

repo: ~/Projects/allnewsdaily · 53 commits · 0 in last 24h, 1 in last 7d · █

Search the build

53 commits indexed

  1. 40f706f 2026-09-25 push-videos: wait for network before Cognito/rsync (boot-race exit=255, TK-12250)
  2. c1ab0a9 2026-09-15 chore: commit code deployed in 2026-09-15 fleet push
  3. ba93d26 2026-09-12 check-live: direct-first / residential-proxy-fallback for resilient YT live-check
  4. acde7bd 2026-09-11 Fix live detection through residential proxy: anchor on live marker, not videoDetails proximity
  5. 07451f1 2026-09-11 Add approve ungate readiness launcher and verify error paths
  6. f1a4b4e 2026-09-11 Record cutover approval and reverify missing proxy credentials
  7. 40c4f7b 2026-09-11 Vary daily Short layouts and narration with verified media proof
  8. ba6d50f 2026-09-11 Fix daily-short crash: reject SVG stock images instead of crashing the whole render
  9. c46e8cf 2026-09-10 auto-data-snapshot: 2026-09-10T20:45:30 (1 data files) — verification/tk11343-preflight.json
  10. db75327 2026-09-10 Document verified proxy cutover blocker and corrected handoff
  11. bf0d044 2026-09-10 front page: Drudge-style photos — big splash photo + a lead photo per column; dedupe to 1 article per topic
  12. af0cd1b 2026-09-10 front page: Drudge-scale smaller text + cap headlines to 20 words (both SSR + live-refresh paths)
  13. 75e04a0 2026-09-10 sync package-lock.json with package.json (https-proxy-agent — unblocks npm ci on deploy)
  14. bf3c145 2026-09-10 allnewsdaily /videos: Mac2 sync-and-push job for data/videos.json (auto-update, mirrors wire-push)
  15. 3585c9c 2026-09-10 allnewsdaily: add /videos page embedding channel Shorts + sync-videos.mjs
  16. 85e4126 2026-09-09 front page: Drudge-style 3-column article layout
  17. 046bf14 2026-09-09 allnewsdaily: PROXY_URL-aware + gzip + early-abort fetch in check-live.js (TK-11340)
  18. 47a0b36 2026-09-09 allnewsdaily: add self-verifying deploy-outlets.sh (rsync outlets.json + print remote count)
  19. 944b120 2026-09-09 allnewsdaily Short: up to 4x/day (6/11/16/21) + guard follow-ups 8/13/18/23
  20. 54ada90 2026-09-09 allnewsdaily Short: show each network's real logo on the source chip
  21. c16abe8 2026-09-09 allnewsdaily: cut outlet directory to top-20 most-popular global channels (live-check load 74->20)
  22. 1a87806 2026-09-09 allnewsdaily Short: publish 3x/day (6/12/18) + min-gap guard + guard follows each publish
  23. e68bd39 2026-09-09 allnewsdaily Short: Steve's cloned voice + natural model + stock-photo card backgrounds
  24. 42d9caf 2026-09-09 allnewsdaily Short: auto-public + delete-canary (DTD verdict)
  25. 9eb9cfa 2026-09-09 allnewsdaily: daily YouTube Short pipeline (headlines→vertical Short→unlisted upload)
  26. 9a1fdc0 2026-09-09 Live static-mode via sentinel file (no prod env/restart) instead of LIVE_STATIC env
  27. 7620db7 2026-09-09 Live feature: LIVE_STATIC mode + Mac2 push (consent-cookie failed on prod's datacenter IP)
  28. 60e002d 2026-09-09 /directory UX pass: fix dead logos, tool-first layout, live-checker consent bypass
  29. e2504ec 2026-09-09 Banner zones: auto-fallback house banner while AdSense unit is unfilled
  30. 0de1cad 2026-09-09 Re-instate portal-VERIFIED AdSense slots (revert of 345ef9e's false 'fabricated' removal)
  31. 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)
  32. ef95156 2026-09-09 Wire live AdSense display units into the 3 banner zones
  33. 0337f69 2026-09-09 Front page: 2-min live-refresh loop + countdown counter + big banner ads
  34. 996668c 2026-09-09 feed balance: cap 3 items per outlet per column so no single source dominates (env PER_OUTLET)
  35. f1da61c 2026-09-09 wire-push: robust node resolution for launchd; add wire-push launchd plist (load is Steve-gated)
  36. 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
  37. 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
  38. ffb6efc 2026-09-09 auto-data-snapshot: 2026-09-09T11:09:48 (2 data files) — .gitignore data/feeds.json
  39. d9c1a51 2026-08-05 yoloforever C7 (DTD-A unanimous): server-present homepage content — guide-preview cards + original region intros above the JS grid, closing the JS-only-content AdSense risk Cody flagged
  40. cadca0f 2026-08-05 yoloforever C6b (Cody final fix): add robots.txt + sitemap.xml routes + promote visible heading to h1 (drop CSS-clipped h1) — allnewsdaily submit-ready
  41. e4d7196 2026-08-05 fix .deploy.conf HEALTH_URL → :9962 (Kamatera port; :9788 was a different app, caused false smoke-test failure)
  42. 383b808 2026-08-05 yoloforever C6: deepen all 3 news-literacy guides to 770-910w (Cody fix: was ~350-430w thin) + visible homepage editorial heading above grid
  43. 5347f4a 2026-08-05 yoloforever C5: strengthen About identity (editorial standards, funding disclosure, independence statement) — Cody 'who runs it' fix
  44. d413b51 2026-08-05 yoloforever C4a (Cody fix): cross-link About/Contact/Privacy/Guides in every guide+trust page nav+footer — trust pages no longer crawl-isolated
  45. 661d70e 2026-08-05 yoloforever C2: add About/Contact/Privacy trust pages (AdSense requirements) + homepage editorial intro + footer nav — completes allnewsdaily's publisher/trust layer
  46. d7d48fb 2026-08-05 yoloforever C1 (DTD-B): add 3 original news-literacy guides + /guides routes + JSON-LD + internal linking — turns bare directory into a real publisher (AdSense low-value-content fix)
  47. ef10de6 2026-08-04 AdSense: loader + ads.txt (ca-pub-5278231299883833) — prep, not deployed
  48. e17fb53 2026-06-03 seo/a11y: add visually-hidden <h1> (site name) for heading semantics — zero visual change
  49. cca2fa3 2026-06-03 Harden external links with rel=noopener noreferrer
  50. 61614db 2026-06-03 Add *.bak to .gitignore
  51. 8e605f4 2026-05-31 Add per-site favicon (kills /favicon.ico 404)
  52. 10cbb44 2026-05-20 ship: pm2-managed on :9788, 98 outlets, live-checker detecting 28 live broadcasters
  53. 7c2ebe7 2026-05-20 initial scaffold — allnewsdaily v0.1 (97 outlets, YouTube live detection, red glowing LIVE pill)

Authors

Agents used

  • none detected

Skills used

  • /claude21
  • /code21
  • /directory5
  • /wire4
  • /videos3
  • /svg2
  • /day2
  • /guides2
  • /feeds2
  • /rsync1
  • /ssh1
  • /lapsed1
  • /image1
  • /async1
  • /script1
  • /tk11343-preflight1
  • /thumbnail1
  • /fetch1
  • /public-domain1
  • /short1
  • /published1
  • /restart1
  • /live-static1
  • /push-live-status1
  • /live-status1
  • /regions1
  • /collapsed1
  • /generate-ad-code1
  • /fabricated1
  • /build-wire1

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

File tree

63 files tracked. Click any to browse the source at HEAD.

Other build journals

← All Dw Landing  ·  all 4 projects  ·  Analytics Chips →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 5ms