← back to Crazy News Channel
P24 Daily Edition: all of today's news + top 6 with Shadow Man editorial-ink cartoons (TK-12354)
774ae8f8c0eba72db9aa69cc0668dd0608a785ed · 2026-09-26 16:48:45 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SC2DKkJkSNenmFz2Eqnvpk
Files touched
A assets/daily-edition.jsM assets/style.cssA daily-edition-data.jsA daily-edition/.gitignoreA daily-edition/__pycache__/build.cpython-314.pycA daily-edition/build.pyA daily-edition/com.steve.p24-daily-edition.plistA daily-edition/run-daily.shA daily/2026-09-26/1-d-3840859107.jpgA daily/2026-09-26/2-d-767fab63ec.jpgA daily/2026-09-26/3-d-3808196cf2.jpgA daily/2026-09-26/4-d-7ce4ddf970.jpgA daily/2026-09-26/5-d-fb0714b547.jpgA daily/2026-09-26/6-d-181477aa44.jpgA daily/2026-09-26/edition.jsonA daily/index.jsonM index.html
Diff
commit 774ae8f8c0eba72db9aa69cc0668dd0608a785ed
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Sep 26 16:48:45 2026 -0700
P24 Daily Edition: all of today's news + top 6 with Shadow Man editorial-ink cartoons (TK-12354)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SC2DKkJkSNenmFz2Eqnvpk
---
assets/daily-edition.js | 101 ++++
assets/style.css | 34 ++
daily-edition-data.js | 2 +
daily-edition/.gitignore | 1 +
daily-edition/__pycache__/build.cpython-314.pyc | Bin 0 -> 38918 bytes
daily-edition/build.py | 427 ++++++++++++++
daily-edition/com.steve.p24-daily-edition.plist | 23 +
daily-edition/run-daily.sh | 33 ++
daily/2026-09-26/1-d-3840859107.jpg | Bin 0 -> 226425 bytes
daily/2026-09-26/2-d-767fab63ec.jpg | Bin 0 -> 182644 bytes
daily/2026-09-26/3-d-3808196cf2.jpg | Bin 0 -> 141863 bytes
daily/2026-09-26/4-d-7ce4ddf970.jpg | Bin 0 -> 69006 bytes
daily/2026-09-26/5-d-fb0714b547.jpg | Bin 0 -> 197697 bytes
daily/2026-09-26/6-d-181477aa44.jpg | Bin 0 -> 196612 bytes
daily/2026-09-26/edition.json | 739 ++++++++++++++++++++++++
daily/index.json | 1 +
index.html | 6 +
17 files changed, 1367 insertions(+)
diff --git a/assets/daily-edition.js b/assets/daily-edition.js
new file mode 100644
index 0000000..529408b
--- /dev/null
+++ b/assets/daily-edition.js
@@ -0,0 +1,101 @@
+/* P24 Daily Edition (TK-12354) — renders window.P24_DAILY (daily-edition-data.js, built by
+ daily-edition/build.py) into #dailyEdition: today's TOP 6 with "Shadow Man" editorial-ink
+ cartoons, then ALL of today's news grouped by section. Zero dependencies; if the data file
+ is missing the section stays hidden (the rest of the page is unaffected). */
+(function () {
+ "use strict";
+ var root = document.getElementById("dailyEdition");
+ var D = window.P24_DAILY;
+ if (!root || !D || !Array.isArray(D.top)) return;
+
+ function el(tag, attrs, kids) {
+ var n = document.createElement(tag);
+ if (attrs) Object.keys(attrs).forEach(function (k) {
+ if (k === "text") n.textContent = attrs[k];
+ else if (k === "cls") n.className = attrs[k];
+ else n.setAttribute(k, attrs[k]);
+ });
+ (kids || []).forEach(function (c) { if (c) n.appendChild(c); });
+ return n;
+ }
+ function when(iso) {
+ if (!iso) return "";
+ var d = new Date(iso);
+ if (isNaN(d)) return "";
+ return d.toLocaleString(undefined, { month: "short", day: "numeric", hour: "numeric", minute: "2-digit" });
+ }
+ function ext(href, text, cls) {
+ return el("a", { href: href, target: "_blank", rel: "noopener noreferrer", cls: cls || "", text: text });
+ }
+
+ var edDate = new Date(D.date + "T12:00:00");
+ var dateLabel = edDate.toLocaleDateString(undefined, { weekday: "long", year: "numeric", month: "long", day: "numeric" });
+ var ageH = (Date.now() - new Date(D.built_at).getTime()) / 36e5;
+
+ var head = el("div", { cls: "de-head" }, [
+ el("p", { cls: "de-kicker", text: "Today's Edition · All the News, Daily" }),
+ el("h2", { id: "dailyEditionTitle", cls: "de-title", text: dateLabel }),
+ el("p", { cls: "de-meta" }, [
+ el("time", { datetime: D.built_at, title: D.built_at, text: "Updated " + when(D.built_at) }),
+ document.createTextNode(" · " + D.counts.all + " stories · top " + D.top.length + " illustrated by " + (D.illustrator || "Shadow Man"))
+ ])
+ ]);
+ root.appendChild(head);
+ if (ageH > 30) {
+ root.appendChild(el("p", { cls: "de-stale", role: "status",
+ text: "Heads up: this edition was last refreshed " + Math.round(ageH) + " hours ago." }));
+ }
+
+ // ---- Top 6
+ var grid = el("ol", { cls: "de-top", "aria-label": "Top " + D.top.length + " stories" });
+ D.top.forEach(function (s, i) {
+ var c = s.concept || {};
+ var fig = s.image
+ ? el("img", { src: s.image, alt: "Editorial cartoon: " + (c.title || s.headline) + ". " + (c.caption || ""),
+ loading: i < 2 ? "eager" : "lazy", width: "1024", height: "657", decoding: "async" })
+ : el("div", { cls: "de-noimg", "aria-hidden": "true", text: "✒️" });
+ grid.appendChild(el("li", { cls: "de-card" }, [
+ el("figure", { cls: "de-fig" }, [
+ fig,
+ c.caption ? el("figcaption", { cls: "de-cap", text: "“" + c.caption + "”" }) : null
+ ]),
+ el("div", { cls: "de-body" }, [
+ el("p", { cls: "de-rank" }, [
+ el("span", { cls: "de-num", text: String(i + 1) }),
+ el("span", { cls: "de-sec", text: s.section })
+ ]),
+ el("h3", { cls: "de-h" }, [ext(s.url, s.headline)]),
+ el("p", { cls: "de-src", text: (s.outlet || "Source") + (s.published ? " · " + when(s.published) : "") })
+ ])
+ ]));
+ });
+ root.appendChild(grid);
+
+ // ---- All the news, grouped by section
+ var rest = D.all.filter(function (a) { return !a.top; });
+ var sections = [];
+ var bySec = {};
+ rest.forEach(function (a) {
+ if (!bySec[a.section]) { bySec[a.section] = []; sections.push(a.section); }
+ bySec[a.section].push(a);
+ });
+ var all = el("div", { cls: "de-all" }, [
+ el("h2", { cls: "de-all-h", text: "All the News · " + D.all.length + " stories today" })
+ ]);
+ sections.forEach(function (sec) {
+ var ul = el("ul", { cls: "de-list" });
+ bySec[sec].forEach(function (a) {
+ ul.appendChild(el("li", null, [
+ ext(a.url, a.headline),
+ el("span", { cls: "de-src", text: " — " + (a.outlet || "") + (a.published ? " · " + when(a.published) : "") })
+ ]));
+ });
+ all.appendChild(el("section", { cls: "de-sec-block", "aria-label": sec }, [
+ el("h3", { cls: "de-sec-h", text: sec + " (" + bySec[sec].length + ")" }), ul
+ ]));
+ });
+ all.appendChild(el("p", { cls: "de-credit", text: "Headlines via " + (D.source || "the wire") +
+ ", linking to each original publisher. Cartoons are original AI-generated satire signed Shadow Man; figures are invented, not real people." }));
+ root.appendChild(all);
+ root.hidden = false;
+})();
diff --git a/assets/style.css b/assets/style.css
index e25e38d..c80b405 100644
--- a/assets/style.css
+++ b/assets/style.css
@@ -1475,3 +1475,37 @@ body.shadow-man-page .sm-dialog img { width: 100%; height: auto; display: block;
body.shadow-man-page .sm-meta { font-size: .8rem; color: var(--text-dim); margin: 0; }
body.shadow-man-page .sm-caption { font-style: italic; margin: 0; }
body.shadow-man-page .sm-close { position: absolute; top: 10px; right: 12px; background: none; border: 0; color: var(--text); font-size: 1.6rem; cursor: pointer; line-height: 1; }
+
+/* ============================================================
+ P24 Daily Edition (TK-12354) — top 6 + all the news
+ ============================================================ */
+.daily-edition { max-width: 1100px; margin: 18px auto 28px; padding: 0 16px; box-sizing: border-box; }
+.daily-edition *, .daily-edition *::before, .daily-edition *::after { box-sizing: border-box; }
+.de-head { border-top: 4px double var(--text); border-bottom: 1px solid var(--text); padding: 10px 0 8px; margin-bottom: 14px; text-align: center; }
+.de-kicker { margin: 0; font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--accent); font-weight: 800; }
+.de-title { margin: 4px 0 2px; font-family: Georgia, 'Times New Roman', serif; font-size: clamp(1.4rem, 4vw, 2.2rem); line-height: 1.15; color: var(--text); }
+.de-meta { margin: 0; font-size: .82rem; color: var(--text-dim); }
+.de-stale { background: #fff3cd; border: 1px solid #e0b400; color: #5c4400; border-radius: 6px; padding: 8px 12px; font-size: .88rem; }
+.de-top { list-style: none; margin: 0; padding: 0; display: grid; gap: 16px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); }
+.de-card { background: var(--panel); border: 1px solid var(--panel-border); border-radius: 8px; overflow: hidden; display: flex; flex-direction: column; min-width: 0; }
+.de-fig { margin: 0; background: #fff; border-bottom: 3px solid #0b0b0c; }
+.de-fig img { display: block; width: 100%; height: auto; aspect-ratio: 1024 / 657; object-fit: cover; }
+.de-noimg { aspect-ratio: 1024 / 657; display: grid; place-items: center; font-size: 3rem; background: var(--bg); }
+.de-cap { font-family: Georgia, serif; font-style: italic; font-size: .92rem; padding: 8px 12px 10px; color: #111; text-align: center; }
+.de-body { padding: 10px 14px 14px; }
+.de-rank { margin: 0 0 4px; display: flex; align-items: center; gap: 8px; font-size: .72rem; text-transform: uppercase; letter-spacing: .1em; }
+.de-num { display: inline-grid; place-items: center; width: 1.7rem; height: 1.7rem; border-radius: 50%; background: var(--text); color: var(--panel); font-weight: 800; font-size: .85rem; letter-spacing: 0; }
+.de-sec { color: var(--accent); font-weight: 700; }
+.de-h { margin: 0 0 6px; font-family: Georgia, 'Times New Roman', serif; font-size: 1.12rem; line-height: 1.3; overflow-wrap: anywhere; }
+.de-h a, .de-list a { color: var(--text); text-decoration: none; }
+.de-h a:hover, .de-list a:hover { text-decoration: underline; }
+.de-h a:focus-visible, .de-list a:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; }
+.de-src { color: var(--text-dim); font-size: .8rem; margin: 0; }
+.de-all { margin-top: 26px; background: var(--panel); border: 1px solid var(--panel-border); border-radius: 8px; padding: 14px 16px; }
+.de-all-h { margin: 0 0 8px; font-family: Georgia, serif; font-size: 1.3rem; border-bottom: 2px solid var(--text); padding-bottom: 6px; }
+.de-sec-block { margin-top: 12px; }
+.de-sec-h { margin: 0 0 6px; font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
+.de-list { margin: 0; padding-left: 1.1rem; columns: 2 340px; column-gap: 28px; }
+.de-list li { break-inside: avoid; margin: 0 0 8px; line-height: 1.35; overflow-wrap: anywhere; }
+.de-credit { margin: 14px 0 0; font-size: .75rem; color: var(--text-dim); }
+@media (max-width: 480px) { .de-list { columns: 1; } .daily-edition { padding: 0 12px; } }
diff --git a/daily-edition-data.js b/daily-edition-data.js
new file mode 100644
index 0000000..fe917ed
--- /dev/null
+++ b/daily-edition-data.js
@@ -0,0 +1,2 @@
+// AUTO-GENERATED by daily-edition/build.py (TK-12354) — do not hand-edit.
+window.P24_DAILY = {"date": "2026-09-26", "built_at": "2026-09-26T16:48:43-07:00", "created_at": "2026-09-26T16:46:50-07:00", "source": "allnewsdaily wire", "source_updated_at": "2026-09-26T23:47:37.117000+00:00", "illustrator": "Shadow Man", "top": [{"id": "d-3840859107", "headline": "Heavy Rain and Wind Batter Northeast, Bringing Coastal Flooding", "url": "https://www.nytimes.com/live/2026/09/26/nyregion/noreaster-storm-rain-nyc-boston", "outlet": "NYT", "published": "2026-09-26T23:29:03+00:00", "section": "Top story", "section_key": "top", "splash": true, "concept": {"title": "Bureaucracy in the Storm", "caption": "A sweating official tries to hold back the tide with a bureaucratic form.", "scene": "A sweating official stands in a flooded street, holding a large, overly detailed bureaucratic form above their head like a shield. The form has tiny print and multiple checkboxes. Behind them, a tiny homeowner is being carried away by a wave, while a committee of identical bureaucrats stands on a raised platform, arguing over the form's wording. The background shows a stormy sky and flooded buildings with doors and windows sealed with the same forms.", "engine": "ollama:http://192.168.1.133:11434"}, "image": "daily/2026-09-26/1-d-3840859107.jpg", "image_prompt": "A sweating official stands in a flooded street, holding a large, overly detailed bureaucratic form above their head like a shield. The form has tiny print and multiple checkboxes. Behind them, a tiny homeowner is being carried away by a wave, while a committee of identical bureaucrats stands on a raised platform, arguing over the form's wording. The background shows a stormy sky and flooded buildings with doors and windows sealed with the same forms. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "nhwtyd6z1nrzw0d0w0as1m4a20", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:39:49-07:00"}, {"id": "d-767fab63ec", "headline": "Trump Administration Plans to Gut Clean Car Rules", "url": "https://www.nytimes.com/2026/09/26/climate/trump-fuel-economy-car-rules.html", "outlet": "NYT", "published": "2026-09-26T22:55:14+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "concept": {"title": "Crushing Clean", "caption": "A tiny homeowner fumes as a sweating official and a committee of identical bureaucrats gleefully dismantle a giant, sparkling clean car with a wrecking ball, leaving only a smoldering pile of rust and smoke in its place.", "scene": "A tiny homeowner, arms akimbo, stands in a small house as a sweating official and a committee of identical bureaucrats, all wearing identical grey suits, cheerfully use a giant wrecking ball to crush a gleaming, sparkling clean car. The background shows a smoldering pile of rust and smoke, with the car's parts scattered around. The absurd detail is that the car is still in perfect condition, with no visible damage before the wrecking ball makes contact.", "engine": "ollama:http://192.168.1.133:11434"}, "image": "daily/2026-09-26/2-d-767fab63ec.jpg", "image_prompt": "A tiny homeowner, arms akimbo, stands in a small house as a sweating official and a committee of identical bureaucrats, all wearing identical grey suits, cheerfully use a giant wrecking ball to crush a gleaming, sparkling clean car. The background shows a smoldering pile of rust and smoke, with the car's parts scattered around. The absurd detail is that the car is still in perfect condition, with no visible damage before the wrecking ball makes contact. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "ykea8phj35rzt0d0w0bvpnq344", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:41:16-07:00"}, {"id": "d-3808196cf2", "headline": "Trump rejects Iran deal to reopen Strait of Hormuz in seven days", "url": "https://www.bbc.co.uk/news/articles/cqgmrr9ekr7ko?at_medium=RSS&at_campaign=rss", "outlet": "BBC", "published": "2026-09-27T05:15:59+00:00", "section": "WORLD", "section_key": "world", "splash": false, "concept": {"title": "Peace Talks, Round 47", "caption": "The negotiating table has been extended again.", "scene": "generals on both sides of an absurdly long negotiating table that stretches past the horizon, doves nesting in their helmets", "engine": "template"}, "image": "daily/2026-09-26/3-d-3808196cf2.jpg", "image_prompt": "generals on both sides of an absurdly long negotiating table that stretches past the horizon, doves nesting in their helmets. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "bkq7f6q6n5rzw0d0w0casqjaqm", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:43:07-07:00"}, {"id": "d-7ce4ddf970", "headline": "Boeing flags 737 Max software glitch affecting some automated approach functions", "url": "https://www.cnbc.com/2026/09/26/boeing-737-max-navigation-software-glitch.html", "outlet": "CNBC", "published": "2026-09-27T04:55:01+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "concept": {"title": "Toaster Takeover", "caption": "A tiny homeowner squints at a flying toaster, while a committee of identical bureaucrats shrugs in unison.", "scene": "In the foreground, a tiny homeowner stands on a hill, arms outstretched, eyes squinting upward at a flying toaster that's emitting smoke and sparks. In the background, a committee of identical bureaucrats sits around a long table, all shrugging in perfect unison, their identical expressions and postures conveying complete indifference. The flying toaster is slightly larger than the homeowner, and there's a small, unmarked airplane in the distance, its wings slightly drooping, suggesting a malfunction.", "engine": "ollama:http://192.168.1.133:11434"}, "image": "daily/2026-09-26/4-d-7ce4ddf970.jpg", "image_prompt": "In the foreground, a tiny homeowner stands on a hill, arms outstretched, eyes squinting upward at a flying toaster that's emitting smoke and sparks. In the background, a committee of identical bureaucrats sits around a long table, all shrugging in perfect unison, their identical expressions and postures conveying complete indifference. The flying toaster is slightly larger than the homeowner, and there's a small, unmarked airplane in the distance, its wings slightly drooping, suggesting a malfunction. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "rk84pc05cxrzy0d0w0dby3rh68", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:44:20-07:00"}, {"id": "d-fb0714b547", "headline": "Pope Leo XIV celebrates open-air Mass in front of 800,000 people in central Paris", "url": "https://www.france24.com/en/france/20260926-pope-leo-xiv-celebrates-open-air-mass-in-front-of-800-000-people-in-central-paris", "outlet": "France 24", "published": "2026-09-27T03:28:37+00:00", "section": "WORLD", "section_key": "world", "splash": false, "concept": {"title": "Film at Eleven", "caption": "Details are developing, as they always seem to be.", "scene": "a harried newsman at a desk buried under an avalanche of paper headlines, only his hand visible holding a coffee cup aloft", "engine": "template"}, "image": "daily/2026-09-26/5-d-fb0714b547.jpg", "image_prompt": "a harried newsman at a desk buried under an avalanche of paper headlines, only his hand visible holding a coffee cup aloft. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "tkmf7t0x7hrzt0d0w0dsahk0kc", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:45:32-07:00"}, {"id": "d-181477aa44", "headline": "My friend grosses $300,000 a year with her pet-sitting business. She pays herself $50,000. Should I do the same?", "url": "https://www.marketwatch.com/story/my-friend-grosses-300-000-a-year-with-her-pet-sitting-business-she-pays-herself-50-000-should-i-do-the-same-8ab5cba3?mod=mw_rss_topstories", "outlet": "MarketWatch", "published": "2026-09-27T03:00:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "concept": {"title": "The Pet-Sitting Paradox", "caption": "Why pay yourself more when the dog's just waiting for a treat?", "scene": "A tiny homeowner sits at a desk, surrounded by stacks of cash, while a large, slobbery dog lounges on a pile of $50,000 bills, wagging its tail and drooling. The absurd detail is the dog's drool turning the money into a sticky, messy pile.", "engine": "ollama:http://192.168.1.133:11434"}, "image": "daily/2026-09-26/6-d-181477aa44.jpg", "image_prompt": "A tiny homeowner sits at a desk, surrounded by stacks of cash, while a large, slobbery dog lounges on a pile of $50,000 bills, wagging its tail and drooling. The absurd detail is the dog's drool turning the money into a sticky, messy pile. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.", "prediction_id": "e692wyaed5rzt0d0w0eap55xzg", "image_cost_usd": 0.003, "image_created_at": "2026-09-26T16:46:50-07:00"}], "all": [{"id": "d-3840859107", "headline": "Heavy Rain and Wind Batter Northeast, Bringing Coastal Flooding", "url": "https://www.nytimes.com/live/2026/09/26/nyregion/noreaster-storm-rain-nyc-boston", "outlet": "NYT", "published": "2026-09-26T23:29:03+00:00", "section": "Top story", "section_key": "top", "splash": true, "top": true}, {"id": "d-767fab63ec", "headline": "Trump Administration Plans to Gut Clean Car Rules", "url": "https://www.nytimes.com/2026/09/26/climate/trump-fuel-economy-car-rules.html", "outlet": "NYT", "published": "2026-09-26T22:55:14+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": true}, {"id": "d-4def2d37d2", "headline": "Nor'easter brings heavy flooding, major power outages to the East Coast", "url": "https://www.cbsnews.com/news/east-coast-noreaster-severe-flooding-winds-evacuations/", "outlet": "CBS News", "published": "2026-09-26T22:53:01+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-f02f3c0738", "headline": "Trump says he ended Biden electric vehicle rule, updated fuel economy standards", "url": "https://thehill.com/homenews/administration/6113324-trump-eliminates-biden-ev-mandate/", "outlet": "The Hill", "published": "2026-09-26T22:52:15+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-88a60bdd99", "headline": "This week on \"Sunday Morning\" (Sept. 27)", "url": "https://www.cbsnews.com/news/this-week-on-sunday-morning-sept-27-2026/", "outlet": "CBS News", "published": "2026-09-26T22:44:08+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-7abdabfdaa", "headline": "Former Kennedy Center employees claim officials halted repairs months prior to closure", "url": "https://thehill.com/homenews/administration/6113290-kennedy-center-whistleblower-letter-repairs/", "outlet": "The Hill", "published": "2026-09-26T22:37:20+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-74c3e09c9e", "headline": "Hurricane Nolo could cause \"catastrophic\" flooding in Hawaii, forecasters warn", "url": "https://www.cbsnews.com/news/storm-nolo-hurricane-hawaii/", "outlet": "CBS News", "published": "2026-09-26T21:46:38+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-2297c92b32", "headline": "Trump gave Xi Jinping a warm welcome. What did the talks accomplish?", "url": "https://www.npr.org/2026/09/26/nx-s1-5980066/trump-gave-xi-jinping-a-warm-welcome-what-did-the-talks-accomplish", "outlet": "NPR", "published": "2026-09-26T21:13:54+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-449fcae9f3", "headline": "Sunday shows preview: Trump rejects Iran deal after week of high-stakes meetings; GOP clammers to keep Congress", "url": "https://thehill.com/homenews/sunday-talk-shows/6113249-sunday-shows-trump-rejects-iran-proposal/", "outlet": "The Hill", "published": "2026-09-26T21:02:36+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-0efa634cfa", "headline": "Trump calls Iranian plan to reopen Strait of Hormuz not 'acceptable'", "url": "https://www.npr.org/2026/09/26/nx-s1-5981990/trump-rejects-iranian-deal-strait-of-hormuz", "outlet": "NPR", "published": "2026-09-26T20:08:28+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-147edb97f1", "headline": "How El Niño Is Shaping Storms on Two Sides of the U.S.", "url": "https://www.nytimes.com/2026/09/26/climate/el-nino-hurricane-noreaster.html", "outlet": "NYT", "published": "2026-09-26T17:23:22+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-96c7d053ce", "headline": "OpenAI says its models engaged with US government websites in misbehavior disclosure", "url": "https://www.npr.org/2026/09/26/nx-s1-5981979/openai-us-government-websites-misbehavior", "outlet": "NPR", "published": "2026-09-26T17:10:04+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-a8bc74f422", "headline": "States consider gas tax holidays ahead of Election Day", "url": "https://www.washingtonpost.com/business/2026/09/26/record-high-diesel-prices-have-states-weighing-gas-tax-holidays-before-midterms/", "outlet": "Washington Post", "published": "2026-09-26T10:00:01+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-73c970e3dd", "headline": "A horror story unfolds as police examine pornographer’s brutal trove", "url": "https://www.washingtonpost.com/nation/2026/09/26/police-search-house-filled-with-porn-clues-about-missing-women/", "outlet": "Washington Post", "published": "2026-09-26T10:00:01+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-37b6178fc6", "headline": "Judy Markey, whose trailblazing radio show caught ‘lightning in a bottle,’ dies at 82", "url": "https://www.washingtonpost.com/obituaries/2026/09/26/breaking-into-boys-club-talk-radio-she-became-beloved-chicago-broadcaster/", "outlet": "Washington Post", "published": "2026-09-26T10:00:01+00:00", "section": "U.S. / TOP", "section_key": "us", "splash": false, "top": false}, {"id": "d-7d55e4bbcd", "headline": "Four American tourists among 6 killed in suspected gas leak blast in Athens", "url": "https://www.aljazeera.com/news/2026/9/26/four-american-tourists-among-6-killed-in-suspected-gas-leak-blast-in-athens?traffic_source=rss", "outlet": "Al Jazeera", "published": "2026-09-26T23:26:31+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-242fdb2a6e", "headline": "Powerful storm brings flooding, power outages to northeastern United States", "url": "https://www.aljazeera.com/news/2026/9/26/powerful-storm-brings-flooding-power-outages-to-northeastern-united-states?traffic_source=rss", "outlet": "Al Jazeera", "published": "2026-09-26T22:51:57+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-22a2c93f1d", "headline": "Deadly shooting hits Caribbean islands of Saint Vincent and the Grenadines", "url": "https://www.aljazeera.com/news/2026/9/26/deadly-shooting-hits-caribbean-islands-of-saint-vincent-and-the-grenadines?traffic_source=rss", "outlet": "Al Jazeera", "published": "2026-09-26T22:38:01+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-3808196cf2", "headline": "Trump rejects Iran deal to reopen Strait of Hormuz in seven days", "url": "https://www.bbc.co.uk/news/articles/cqgmrr9ekr7ko?at_medium=RSS&at_campaign=rss", "outlet": "BBC", "published": "2026-09-27T05:15:59+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": true}, {"id": "d-8e8dd43e13", "headline": "Nor'easter brings flooding as New York and New Jersey declare emergency", "url": "https://www.bbc.co.uk/news/articles/ck1wxxzn5jndo?at_medium=RSS&at_campaign=rss", "outlet": "BBC", "published": "2026-09-27T05:04:26+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-0ecd35aef9", "headline": "At Summit, Xi Sought to Tilt Trump’s Stance on America’s Place in Asia", "url": "https://www.nytimes.com/2026/09/26/world/asia/summit-xi-trump-taiwan-japan.html", "outlet": "NYT World", "published": "2026-09-26T21:31:57+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-fb0714b547", "headline": "Pope Leo XIV celebrates open-air Mass in front of 800,000 people in central Paris", "url": "https://www.france24.com/en/france/20260926-pope-leo-xiv-celebrates-open-air-mass-in-front-of-800-000-people-in-central-paris", "outlet": "France 24", "published": "2026-09-27T03:28:37+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": true}, {"id": "d-9e39130e88", "headline": "Pope praises young people's 'energy and commitment' at huge open", "url": "https://www.bbc.co.uk/news/articles/cm4gjjwvvlzro?at_medium=RSS&at_campaign=rss", "outlet": "BBC", "published": "2026-09-27T02:48:06+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-4c16ac780c", "headline": "Germany news", "url": "https://www.dw.com/en/germany-news-eu-ministers-meet-for-migration-showdown/live-79441034?maca=en-rss-en-all-1573-rdf", "outlet": "Deutsche Welle", "published": "2026-09-26T19:09:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-d2c1fb55ec", "headline": "Backlash over data centers tests Europe's AI ambitions", "url": "https://www.dw.com/en/backlash-over-data-centers-tests-europe-s-ai-ambitions/a-79419800?maca=en-rss-en-all-1573-rdf", "outlet": "Deutsche Welle", "published": "2026-09-26T18:08:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-5d6323fd5c", "headline": "Maricarmen Vs The ‘Vultures’", "url": "https://www.france24.com/en/tv-shows/spotlight/20260926-maricarmen-vs-the-vultures-a-social-tragedy-mobilising-spaniards", "outlet": "France 24", "published": "2026-09-27T01:03:40+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-373d672713", "headline": "Pope Leo XIV addresses youth at giant Paris Mass", "url": "https://www.france24.com/en/video/20260926-pope-leo-xiv-addresses-youth-at-giant-paris-mass", "outlet": "France 24", "published": "2026-09-27T00:04:48+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-1651d8471d", "headline": "China, US agree to set up channel for AI safety incidents", "url": "https://www.dw.com/en/china-us-agree-to-set-up-channel-for-ai-safety-incidents/a-79443351?maca=en-rss-en-all-1573-rdf", "outlet": "Deutsche Welle", "published": "2026-09-26T16:26:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-8ac04fb3e7", "headline": "Six Dead After Explosion in Athens Tourist District", "url": "https://www.nytimes.com/2026/09/25/world/europe/athens-tourists-explosion.html", "outlet": "NYT World", "published": "2026-09-26T14:58:38+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-b6193059de", "headline": "A Tetris-Like Maze Blocks Protests in Pakistan’s Capital", "url": "https://www.nytimes.com/2026/09/26/world/asia/pakistan-protest-islamabad-containers.html", "outlet": "NYT World", "published": "2026-09-26T14:19:07+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-ef64b05589", "headline": "Ireland goalkeeper boycotting Nations League game against Israel", "url": "https://news.sky.com/story/ireland-confirms-nations-league-game-against-israel-will-go-ahead-13592048", "outlet": "Sky News", "published": "2026-09-26T12:02:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-fa2845ee52", "headline": "<a href='https://news.sky.com/story/the-most-striking-pictures-of-the-week-13592004'>The most striking pictures of the week</a>", "url": "https://news.sky.com/story/the-most-striking-pictures-of-the-week-13592010", "outlet": "Sky News", "published": "2026-09-26T09:00:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-caec500eee", "headline": "OpenAI models accessed US government data and 'tried to hack another site'", "url": "https://news.sky.com/story/openai-models-accessed-us-government-data-and-tried-to-hack-education-site-13591998", "outlet": "Sky News", "published": "2026-09-26T07:56:00+00:00", "section": "WORLD", "section_key": "world", "splash": false, "top": false}, {"id": "d-5123d4dd51", "headline": "Powerful nor'easter causes coastal flooding and knocks out power to parts of the Northeast", "url": "https://www.cnbc.com/2026/09/26/powerful-noreaster-causes-flooding-and-knocks-out-power.html", "outlet": "CNBC", "published": "2026-09-27T05:23:11+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-7ce4ddf970", "headline": "Boeing flags 737 Max software glitch affecting some automated approach functions", "url": "https://www.cnbc.com/2026/09/26/boeing-737-max-navigation-software-glitch.html", "outlet": "CNBC", "published": "2026-09-27T04:55:01+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": true}, {"id": "d-7597176acd", "headline": "Apple hit with $5.7 billion in damages over haptic patents", "url": "https://www.theverge.com/tech/1001118/apple-hit-with-5-7-billion-in-damages-over-haptic-patents", "outlet": "The Verge", "published": "2026-09-26T21:30:01+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-d70ce2b78b", "headline": "Insurers claim AI is already increasing healthcare costs", "url": "https://techcrunch.com/2026/09/26/insurers-claim-ai-is-already-increasing-healthcare-costs/", "outlet": "TechCrunch", "published": "2026-09-26T21:02:06+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-31b997b1e9", "headline": "TikTok agrees to pay at least $100M in Alabama settlement", "url": "https://techcrunch.com/2026/09/26/tiktok-agrees-to-pay-at-least-100m-in-alabama-settlement/", "outlet": "TechCrunch", "published": "2026-09-26T20:24:45+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-f67e72b378", "headline": "Welcome to the Medical Clinic at the Interplanetary Relay Station", "url": "https://www.lightspeedmagazine.com/fiction/welcome-to-the-medical-clinic-at-the-interplanetary-relay-station/", "outlet": "Hacker News", "published": "2026-09-26T20:08:50+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-181477aa44", "headline": "My friend grosses $300,000 a year with her pet-sitting business. She pays herself $50,000. Should I do the same?", "url": "https://www.marketwatch.com/story/my-friend-grosses-300-000-a-year-with-her-pet-sitting-business-she-pays-herself-50-000-should-i-do-the-same-8ab5cba3?mod=mw_rss_topstories", "outlet": "MarketWatch", "published": "2026-09-27T03:00:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": true}, {"id": "d-6d6114d2a1", "headline": "Decap is the man behind the drums behind your favorite song", "url": "https://www.theverge.com/report/1000994/decap-drums-that-knock-interview", "outlet": "The Verge", "published": "2026-09-26T19:22:40+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-2b0a89bd38", "headline": "‘We lived within our means’: I earned $30,000 as a pastor and still retired comfortably. Why don’t you tell people that?", "url": "https://www.marketwatch.com/story/we-lived-within-our-means-i-earned-30-000-as-a-pastor-and-still-retired-comfortably-why-dont-you-tell-people-that-6b9f231e?mod=mw_rss_topstories", "outlet": "MarketWatch", "published": "2026-09-27T02:00:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-755e3dc914", "headline": "DeepSeek Elastic Compute (DSec)", "url": "https://arxiv.org/abs/2609.22978", "outlet": "Hacker News", "published": "2026-09-26T18:22:41+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-0adc94c225", "headline": "From $6 eggs to $50,000 cars, these charts show how inflation has defined the past 5 years", "url": "https://www.marketwatch.com/story/from-6-eggs-to-50-000-cars-these-charts-show-how-inflation-has-defined-the-past-5-years-3c7b9ab9?mod=mw_rss_topstories", "outlet": "MarketWatch", "published": "2026-09-27T00:54:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-fcf88b0cd2", "headline": "Meta and YouTube say they will run ads for ‘Musk’ documentary after all", "url": "https://techcrunch.com/2026/09/26/meta-says-it-will-run-ads-for-musk-documentary-after-all/", "outlet": "TechCrunch", "published": "2026-09-26T17:44:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-464712ef80", "headline": "Japan moves to tighten rules for foreigners", "url": "https://www.aljazeera.com/economy/2026/9/25/japan-moves-to-tighten-rules-for-foreigners-throwing-futures-into-doubt", "outlet": "Hacker News", "published": "2026-09-26T17:43:11+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-3d8c5d8488", "headline": "Kids turned the comment section of an NPR podcast into a group chat", "url": "https://www.theverge.com/entertainment/1001056/this-american-life-npr-kids-group-chat-comment-section", "outlet": "The Verge", "published": "2026-09-26T17:32:35+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-7af8dfa058", "headline": "OpenAI expands review of model behavior after more rogue agent incidents emerge", "url": "https://www.cnbc.com/2026/09/26/openai-agent-model-behavior-review.html", "outlet": "CNBC", "published": "2026-09-27T00:10:32+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-13b36f07f6", "headline": "Old-School Credit Card Scams Are Far From Dead", "url": "https://www.wired.com/story/kernel-panic-old-timey-credit-card-scams/", "outlet": "Wired", "published": "2026-09-26T12:00:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-0bfe7fe567", "headline": "12 Best White Elephant Gifts, Plus a Prank Box to Put Them In (2026)", "url": "https://www.wired.com/gallery/best-white-elephant-gifts-2026/", "outlet": "Wired", "published": "2026-09-26T11:36:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-5ad3f05c60", "headline": "Best Mesh Wi-Fi Systems (2026)", "url": "https://www.wired.com/story/best-mesh-wifi-routers/", "outlet": "Wired", "published": "2026-09-26T11:00:00+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-e899f09f9f", "headline": "Tesla’s big electric truck faces an even bigger infrastructure challenge", "url": "https://arstechnica.com/cars/2026/09/teslas-big-electric-truck-faces-an-even-bigger-infrastructure-challenge/", "outlet": "Ars Technica", "published": "2026-09-26T10:45:09+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-13df8a7ee8", "headline": "Can Trump ever be wrong? His pick to lead FDA refused to say.", "url": "https://arstechnica.com/health/2026/09/can-trump-ever-be-wrong-his-pick-to-lead-fda-refused-to-say/", "outlet": "Ars Technica", "published": "2026-09-25T23:00:26+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}, {"id": "d-4a19c9abdc", "headline": "Court rules Pentagon can blacklist Anthropic for refusing to enable Claude features", "url": "https://arstechnica.com/tech-policy/2026/09/court-rules-trump-can-blacklist-anthropic-for-refusing-to-enable-claude-features/", "outlet": "Ars Technica", "published": "2026-09-25T21:36:20+00:00", "section": "MONEY / TECH", "section_key": "money_tech", "splash": false, "top": false}], "counts": {"all": 54, "top": 6, "illustrated": 6}, "spend_usd_this_run": 0.0, "spend_usd_today": 0.018};
diff --git a/daily-edition/.gitignore b/daily-edition/.gitignore
new file mode 100644
index 0000000..333c1e9
--- /dev/null
+++ b/daily-edition/.gitignore
@@ -0,0 +1 @@
+logs/
diff --git a/daily-edition/__pycache__/build.cpython-314.pyc b/daily-edition/__pycache__/build.cpython-314.pyc
new file mode 100644
index 0000000..ebdae87
Binary files /dev/null and b/daily-edition/__pycache__/build.cpython-314.pyc differ
diff --git a/daily-edition/build.py b/daily-edition/build.py
new file mode 100644
index 0000000..71204ed
--- /dev/null
+++ b/daily-edition/build.py
@@ -0,0 +1,427 @@
+#!/usr/bin/env python3
+"""P24 Daily Edition (TK-12354) — ALL of today's news + the TOP 6 stories, each with an
+original editorial-ink cartoon signed "Shadow Man" (the conrad.agentabrams.com house style).
+
+ python3 daily-edition/build.py # build/refresh today's edition
+ python3 daily-edition/build.py --no-images # $0: list + concepts only, no Replicate calls
+ python3 daily-edition/build.py --dry # print the top-6 picks and exit, writes nothing
+
+News source: the allnewsdaily wire (~/Projects/allnewsdaily/data/wire.json, rebuilt every
+10 min by com.steve.allnewsdaily-wire-push), falling back to this repo's real-news-data.js
+(Google News RSS) when the wire is missing or older than WIRE_MAX_AGE_H.
+
+Top 6 are LOCKED on the first run of the day: later same-day runs refresh the all-news list
+for $0 and never regenerate illustrations (so the daily spend is ~6 x $0.003 = $0.018).
+
+Illustrations: concept (gag + purely visual scene) from a local LLM ($0 — Mac1 Ollama
+qwen3:14b, then the local MLX server), falling back to a deterministic keyword template;
+image = Replicate flux-schnell (~$0.003) -> ink post-process -> "Shadow Man" signature.
+Hard daily cap P24_EDITION_CAP_USD (default 0.10), summed from ~/.claude/cost-ledger.jsonl
+(app=p24-daily-edition); every paid call is logged via the cost-tracker skill.
+
+Standing rules honoured: never name/depict real people/brands in a cartoon (invented
+archetypes only, DENY + proper-noun backstops); never name the research cartoonist anywhere
+(BANNED); every rendered cartoon carries the "Shadow Man" signature.
+"""
+import argparse, datetime, hashlib, io, json, os, re, subprocess, sys, urllib.request
+
+HERE = os.path.dirname(os.path.abspath(__file__))
+SITE = os.environ.get("P24_SITE_DIR") or os.path.dirname(HERE)
+sys.path.insert(0, os.path.join(os.path.dirname(HERE), "daily-cartoons"))
+import common as C # noqa: E402 (shared Replicate + cost-ledger helpers)
+
+C.APP = "p24-daily-edition"
+C.cap_usd = lambda: float(os.environ.get("P24_EDITION_CAP_USD", "0.10"))
+
+WIRE = os.path.expanduser(os.environ.get("P24_WIRE_JSON", "~/Projects/allnewsdaily/data/wire.json"))
+WIRE_MAX_AGE_H = float(os.environ.get("P24_WIRE_MAX_AGE_H", "36"))
+ITEM_MAX_AGE_H = float(os.environ.get("P24_ITEM_MAX_AGE_H", "36"))
+OUT_DIR = os.path.join(SITE, "daily")
+DATA_JS = os.path.join(SITE, "daily-edition-data.js")
+TOP_N = 6
+OLLAMA_HOSTS = [h for h in os.environ.get("P24_EDITION_OLLAMA", "http://192.168.1.133:11434").split(",") if h]
+OLLAMA_MODEL = os.environ.get("P24_EDITION_OLLAMA_MODEL", "qwen3:14b")
+MLX = os.environ.get("P24_EDITION_MLX", "http://127.0.0.1:8000")
+MLX_MODEL = os.environ.get("P24_EDITION_MLX_MODEL", "mlx-community/Qwen3-30B-A3B-Instruct-2507-4bit")
+
+SIGNATURE = "Shadow Man"
+STYLE = "bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire"
+STYLE_TAIL = (" Invented anonymous caricature figures only. No color, no text, no letters, no words, "
+ "no speech bubbles, no caption, no watermark, no signature.")
+BANNED = re.compile(r"conrad|in the style of|style of [A-Z]|pulitzer", re.I)
+DENY = re.compile(r"\b(trump|biden|harris|obama|pelosi|mcconnell|schumer|desantis|newsom|musk|bezos|zuckerberg|putin|"
+ r"xi jinping|zelensky|netanyahu|vance|aoc|ocasio|sanders|clinton|bush|reagan|kennedy|democrat|republican|"
+ r"gop|maga|google|apple|amazon|microsoft|meta|tesla|oracle|nvidia|openai)\b", re.I)
+FONT_SIG = "/System/Library/Fonts/Supplemental/Bradley Hand Bold.ttf"
+STOP = set("a an the of to in on for and or at by with from as is are was be it its this that new says after over into "
+ "amid report reports than more about up out who what how why will can".split())
+
+
+# ---------------------------------------------------------------- news
+def _parse_date(s):
+ if not s:
+ return None
+ for fmt in ("%a, %d %b %Y %H:%M:%S %z", "%a, %d %b %Y %H:%M:%S %Z"):
+ try:
+ return datetime.datetime.strptime(s.strip(), fmt).astimezone(datetime.timezone.utc)
+ except Exception:
+ pass
+ try:
+ return datetime.datetime.fromisoformat(s.replace("Z", "+00:00")).astimezone(datetime.timezone.utc)
+ except Exception:
+ return None
+
+
+def clean_topic(t):
+ t = re.sub(r"^\s*(report|breaking|update|live)\s*:\s*", "", t or "", flags=re.I).strip()
+ return (t[:1].upper() + t[1:]) if t else t
+
+
+def story_id(link):
+ return "d-" + hashlib.sha1((link or "").encode()).hexdigest()[:10]
+
+
+def load_wire():
+ """-> (source_label, updated_iso, [items]) or None when missing/stale/invalid."""
+ try:
+ w = json.load(open(WIRE))
+ except Exception as e:
+ print(f"[news] wire unavailable ({e}); falling back"); return None
+ upd = _parse_date(w.get("updatedAt"))
+ if not upd or (datetime.datetime.now(datetime.timezone.utc) - upd).total_seconds() > WIRE_MAX_AGE_H * 3600:
+ print(f"[news] wire stale (updatedAt={w.get('updatedAt')}); falling back"); return None
+ items = []
+ sp = w.get("splash")
+ if sp and sp.get("link"):
+ items.append(dict(sp, section="Top story", section_key="top", splash=True))
+ for col in w.get("columns") or []:
+ for it in col.get("items") or []:
+ items.append(dict(it, section=col.get("title") or col.get("key") or "News", section_key=col.get("key") or "news"))
+ return "allnewsdaily wire", upd.isoformat(), items
+
+
+def load_realnews_fallback():
+ p = subprocess.run(["node", os.path.join(SITE, "daily-cartoons", "extract_stories.mjs")],
+ capture_output=True, text=True, timeout=60)
+ if p.returncode != 0:
+ raise SystemExit(f"[news] no wire AND extract_stories failed: {p.stderr[:300]}")
+ items = []
+ for a in json.loads(p.stdout):
+ if a.get("source") != "real-news":
+ continue
+ items.append({"outlet": a.get("sourceName") or "", "link": a.get("sourceUrl"), "topic": a.get("headline"),
+ "date": a.get("publishedAt"), "image": None,
+ "section": (a.get("tags") or ["News"])[0].title(), "section_key": "real"})
+ return "Google News RSS (fallback)", None, items
+
+
+def normalize(items):
+ now = datetime.datetime.now(datetime.timezone.utc)
+ seen, out = set(), []
+ for it in items:
+ link, topic = it.get("link"), clean_topic(it.get("topic"))
+ if not link or not topic or link in seen:
+ continue
+ d = _parse_date(it.get("date"))
+ if d and (now - d).total_seconds() > ITEM_MAX_AGE_H * 3600:
+ continue
+ seen.add(link)
+ out.append({"id": story_id(link), "headline": topic, "url": link, "outlet": it.get("outlet") or "",
+ "published": d.isoformat() if d else None, "section": it.get("section") or "News",
+ "section_key": it.get("section_key") or "news", "splash": bool(it.get("splash"))})
+ return out
+
+
+def tokens(s):
+ s = s.lower().replace("’", "").replace("'", "")
+ return {w.rstrip("s") if len(w) > 4 else w for w in re.findall(r"[a-z0-9]+", s) if w not in STOP and len(w) > 2}
+
+
+def same_story(a, b):
+ ta, tb = tokens(a), tokens(b)
+ shared = len(ta & tb)
+ return shared >= 2 or shared / max(1, len(ta | tb)) >= 0.3
+
+
+def pick_top(items, n=TOP_N):
+ """Splash first, then round-robin across sections (newest first in each), skipping
+ near-duplicates of an already-picked (or already-skipped) story, so one big story
+ covered by five outlets fills ONE slot, not five."""
+ by_sec = {}
+ for it in items:
+ if it["splash"]:
+ continue
+ by_sec.setdefault(it["section_key"], []).append(it)
+ for v in by_sec.values():
+ v.sort(key=lambda x: x["published"] or "", reverse=True)
+ order = [it for it in items if it["splash"]]
+ queues = list(by_sec.values())
+ while any(queues):
+ for q in queues:
+ if q:
+ order.append(q.pop(0))
+ picked, seen_heads = [], []
+ for it in order:
+ if any(same_story(it["headline"], h) for h in seen_heads):
+ seen_heads.append(it["headline"])
+ continue
+ seen_heads.append(it["headline"])
+ picked.append(it)
+ if len(picked) >= n:
+ break
+ return picked
+
+
+# ---------------------------------------------------------------- concepts
+def concept_prompt(story):
+ return f"""/no_think You are the gag writer for P24, a satirical news site. Invent ONE ORIGINAL single-panel
+editorial-cartoon concept about the TOPIC of this real headline, generalized so it stands alone as a gag.
+HEADLINE: {story['headline']}
+Rules: invented anonymous archetypes only ("a sweating official", "a committee of identical bureaucrats",
+"a tiny homeowner"); NEVER name or depict any real person, party, company, brand, country, city or
+organization from the headline — use a generic stand-in for the same role; one strong absurd visual
+metaphor; nothing hateful. The drawing must contain NO written words, signs, labels, numbers, dates
+or quoted text of any kind — tell the joke with the picture alone.
+Return ONLY JSON: {{"title":"3-6 words","caption":"one witty line, max 16 words","scene":"40-80 word purely
+visual description: foreground figure(s), action, background, the absurd detail"}}"""
+
+
+def _ollama(host, prompt):
+ body = {"model": OLLAMA_MODEL, "prompt": prompt, "format": "json", "stream": False,
+ "options": {"temperature": 0.75, "num_predict": 450}}
+ r = urllib.request.Request(f"{host}/api/generate", data=json.dumps(body).encode(),
+ headers={"Content-Type": "application/json"})
+ return json.loads(json.load(urllib.request.urlopen(r, timeout=120))["response"])
+
+
+def _mlx(prompt):
+ body = {"model": MLX_MODEL, "messages": [{"role": "user", "content": prompt}], "max_tokens": 500, "temperature": 0.9}
+ r = urllib.request.Request(f"{MLX}/v1/chat/completions", data=json.dumps(body).encode(),
+ headers={"Content-Type": "application/json"})
+ txt = json.load(urllib.request.urlopen(r, timeout=25))["choices"][0]["message"]["content"]
+ return json.loads(txt[txt.index("{"): txt.rindex("}") + 1])
+
+
+def proper_nouns(headline):
+ """Capitalized non-initial words of a SENTENCE-case headline. Title-case headlines capitalize
+ everything, so there the check is skipped (the prompt rule + DENY list still apply)."""
+ words = re.findall(r"[A-Za-z][A-Za-z'’.-]+", headline)
+ caps = [w for i, w in enumerate(words) if i > 0 and w[0].isupper()]
+ if len(words) > 1 and len(caps) / (len(words) - 1) > 0.5:
+ return set()
+ return {w.strip(".’'").lower() for w in caps if len(w) > 2} - STOP
+
+
+QUOTED = re.compile(r"""(?:^|(?<=[\s(]))["'“‘][^"'”’]{1,80}["'”’]""")
+
+
+TEXTY = re.compile(r"\b(sign|signs|banner|label|labels|placard|headline|reads|reading|written|lettering|words?|slogan|poster)\b", re.I)
+
+
+def scrub_scene(scene):
+ """Drop sentences that would make flux paint lettering (quoted text, signs, labels)."""
+ keep = [x for x in re.split(r"(?<=[.!?])\s+", scene.strip()) if x and not QUOTED.search(x) and not TEXTY.search(x)]
+ return " ".join(keep)
+
+
+def valid_concept(c, story):
+ if not all(isinstance(c.get(k), str) and c[k].strip() for k in ("title", "caption", "scene")):
+ return False
+ c["scene"] = scrub_scene(c["scene"])
+ if len(c["scene"].split()) < 15:
+ return False
+ blob = " ".join(c[k] for k in ("title", "caption", "scene"))
+ if DENY.search(blob) or BANNED.search(blob):
+ return False
+ low = blob.lower()
+ return not any(re.search(r"\b" + re.escape(p) + r"\b", low) for p in proper_nouns(story["headline"]))
+
+
+TEMPLATES = [
+ (r"\b(storm|flood|flooding|rain|hurricane|wildfire|fire|heat|snow|weather|climate|nor.?easter)\b", "Forecast: More of This",
+ "Officials remain confident the situation is under a light drizzle of control.",
+ "a tiny official in a suit calmly holding a cocktail umbrella while a colossal wave curls over a row of houses behind him, a weather vane spinning off its roof"),
+ (r"\b(court|judge|lawsuit|sues|trial|ruling|legal|antitrust)\b", "Justice, Eventually",
+ "The verdict is expected sometime after the heat death of the universe.",
+ "a towering stack of legal paperwork reaching into the clouds, a very small judge climbing it with a rope and pickaxe, lawyers waving from base camp"),
+ (r"\b(rates?|inflation|markets?|stocks?|economy|prices?|banks?|mortgage|tariffs?|jobs|business|pays?|salary|income|grosses|\$[0-9])", "The Market Speaks",
+ "Analysts describe the outlook as 'a rollercoaster, but with fewer seatbelts.'",
+ "an ordinary family clinging to a runaway rollercoaster made of a price chart, a smiling banker selling tickets at the bottom"),
+ (r"\b(election|senate|congress|vote|polls?|campaign|lawmakers|administration|policy|bill|rules|regulations?)\b", "Business as Usual",
+ "Both sides agree on one thing: it's the other side's fault.",
+ "two identical politicians in a tug of war over a crumbling capitol dome, the rope fraying, a tiny citizen standing underneath holding a teacup"),
+ (r"\b(war|strikes?|military|missiles?|troops|attack|ceasefire|deal|talks|nuclear)\b", "Peace Talks, Round 47",
+ "The negotiating table has been extended again.",
+ "generals on both sides of an absurdly long negotiating table that stretches past the horizon, doves nesting in their helmets"),
+ (r"\bai\b|robot|tech|app|chip|data center|software|phone|internet|cyber", "Progress Report",
+ "The machine assures everyone it has their best interests memorized.",
+ "a giant friendly robot gently holding a tiny office worker like a pet, feeding him emails through a funnel, server racks humming behind"),
+ (r"\b(health|virus|vaccines?|hospitals?|drugs?|disease|medical)\b", "Second Opinion",
+ "Take two headlines and call me in the morning.",
+ "a doctor handing a patient an enormous pill the size of a boulder, a line of worried patients stretching out the door"),
+ (r"\b(games?|team|season|league|coach|playoffs?|championship|sports?)\b", "Game Day",
+ "The fans have announced they will now be coaching from the stands.",
+ "a stadium where the crowd has climbed onto the field to play while the players watch from the bleachers eating hot dogs"),
+]
+
+
+def template_concept(story):
+ h = story["headline"].lower()
+ for rx, title, cap, scene in TEMPLATES:
+ if re.search(rx, h):
+ return {"title": title, "caption": cap, "scene": scene, "engine": "template"}
+ return {"title": "Film at Eleven", "caption": "Details are developing, as they always seem to be.",
+ "scene": "a harried newsman at a desk buried under an avalanche of paper headlines, only his hand visible holding a coffee cup aloft",
+ "engine": "template"}
+
+
+DEAD_ENGINES = set() # an engine that errors once is skipped for the rest of the run
+
+
+def concept_for(story):
+ p = concept_prompt(story)
+ for name, fn in [(f"ollama:{h}", (lambda h=h: _ollama(h, p))) for h in OLLAMA_HOSTS] + [("mlx", lambda: _mlx(p))]:
+ if name in DEAD_ENGINES:
+ continue
+ for attempt in range(3):
+ try:
+ c = fn()
+ except json.JSONDecodeError as e:
+ print(f" [concept] {name} bad JSON (try {attempt+1}): {str(e)[:80]}"); continue
+ except Exception as e:
+ print(f" [concept] {name} error, disabling for this run: {str(e)[:120]}")
+ DEAD_ENGINES.add(name); break
+ if valid_concept(c, story):
+ return {"title": c["title"].strip(), "caption": c["caption"].strip(),
+ "scene": c["scene"].strip(), "engine": name}
+ print(f" [concept] {name} returned an invalid/unsafe concept (try {attempt+1})")
+ return template_concept(story)
+
+
+# ---------------------------------------------------------------- image
+BOTTOM_CROP = 0.10 # flux paints fake scribbled "artist signatures" along the bottom edge — cut them off
+
+
+def sign(art):
+ """Stamp the "Shadow Man" signature lower-right, in place (house style of conrad.agentabrams.com)."""
+ from PIL import ImageDraw, ImageFont
+ W, H = art.size
+ d = ImageDraw.Draw(art)
+ sf = ImageFont.truetype(FONT_SIG, max(24, W // 28))
+ bb = d.textbbox((0, 0), SIGNATURE, font=sf)
+ sw, sh = bb[2] - bb[0], bb[3] - bb[1]
+ x, y = W - sw - W // 30, H - sh - H // 20
+ d.rectangle([x - 10, y - 6, x + sw + 10, y + sh + 14], fill=(255, 255, 255))
+ d.text((x, y - bb[1]), SIGNATURE, font=sf, fill=(10, 10, 10))
+ d.line([x, y + sh + 7, x + sw, y + sh + 3], fill=(10, 10, 10), width=3)
+
+
+def ink_and_sign(raw, out_path):
+ from PIL import Image, ImageEnhance, ImageOps
+ im = Image.open(io.BytesIO(raw))
+ g = ImageEnhance.Contrast(ImageOps.grayscale(im)).enhance(1.5)
+ g = g.point(lambda p: 255 if p > 205 else (0 if p < 40 else p))
+ art = g.convert("RGB")
+ art = art.crop((0, 0, art.size[0], int(art.size[1] * (1 - BOTTOM_CROP))))
+ if art.size[0] > 1024:
+ art = art.resize((1024, int(art.size[1] * 1024 / art.size[0])))
+ sign(art)
+ art.save(out_path, "JPEG", quality=84, optimize=True, progressive=True)
+
+
+def gen_image(scene, tag):
+ prompt = f"{scene.rstrip('.')}. {STYLE}.{STYLE_TAIL}"
+ if BANNED.search(prompt):
+ raise RuntimeError("banned term in prompt")
+ C.guard("flux")
+ pr = C.api("https://api.replicate.com/v1/models/black-forest-labs/flux-schnell/predictions",
+ {"input": {"prompt": prompt, "aspect_ratio": "4:3", "output_format": "jpg",
+ "output_quality": 92, "num_outputs": 1, "megapixels": "1"}}, prefer_wait=True)
+ cost = C.log_cost("flux", f"p24 daily edition {tag} pred={pr.get('id')}")
+ pr = C.poll(pr, 2, 300)
+ if pr["status"] != "succeeded":
+ raise RuntimeError(f"flux {pr['status']}: {pr.get('error')}")
+ out = pr["output"]; out = out[0] if isinstance(out, list) else out
+ return urllib.request.urlopen(out, timeout=120).read(), cost, pr["id"], prompt
+
+
+# ---------------------------------------------------------------- main
+def main():
+ ap = argparse.ArgumentParser()
+ ap.add_argument("--no-images", action="store_true")
+ ap.add_argument("--dry", action="store_true")
+ ap.add_argument("--date", help="edition date YYYY-MM-DD (default: today, local)")
+ a = ap.parse_args()
+
+ date = a.date or datetime.date.today().isoformat()
+ src = load_wire() or load_realnews_fallback()
+ label, updated, raw = src
+ items = normalize(raw)
+ if not items:
+ print("[news] 0 items after normalize — refusing to publish an empty edition"); return 1
+ day_dir = os.path.join(OUT_DIR, date)
+ ed_path = os.path.join(day_dir, "edition.json")
+ prev = json.load(open(ed_path)) if os.path.exists(ed_path) else None
+
+ if prev and prev.get("top"):
+ top = prev["top"] # locked for the day
+ print(f"[top] locked from first run of {date}: {len(top)} stories")
+ else:
+ top = [dict(s) for s in pick_top(items)]
+ print(f"[top] picked {len(top)} new stories for {date}")
+ for i, s in enumerate(top, 1):
+ print(f" {i}. [{s['section']}] {s['headline'][:90]} — {s['outlet']}")
+ if a.dry:
+ return 0
+
+ os.makedirs(day_dir, exist_ok=True)
+ spent = 0.0
+ for i, s in enumerate(top, 1):
+ if not s.get("concept"):
+ s["concept"] = concept_for(s)
+ print(f" [concept] #{i} {s['concept']['engine']}: \"{s['concept']['title']}\"")
+ img_rel = f"daily/{date}/{i}-{s['id']}.jpg"
+ img_abs = os.path.join(SITE, img_rel)
+ if os.path.exists(img_abs):
+ s["image"] = img_rel
+ continue
+ if a.no_images:
+ s.setdefault("image", None)
+ continue
+ try:
+ raw_img, cost, pid, prompt = gen_image(s["concept"]["scene"], f"#{i} {s['id']}")
+ ink_and_sign(raw_img, img_abs)
+ spent += cost
+ s.update(image=img_rel, image_prompt=prompt, prediction_id=pid, image_cost_usd=cost,
+ image_created_at=datetime.datetime.now().astimezone().isoformat(timespec="seconds"))
+ print(f" [image] #{i} ok ${cost:.3f} -> {img_rel}")
+ except C.CapExceeded as e:
+ print(f" [image] #{i} CAP REFUSED: {e}"); s.setdefault("image", None)
+ except Exception as e:
+ print(f" [image] #{i} FAILED: {str(e)[:200]}"); s.setdefault("image", None)
+
+ top_ids = {s["id"] for s in top}
+ now = datetime.datetime.now().astimezone().isoformat(timespec="seconds")
+ edition = {
+ "date": date, "built_at": now, "created_at": (prev or {}).get("created_at", now),
+ "source": label, "source_updated_at": updated,
+ "illustrator": SIGNATURE, "top": top,
+ "all": [dict(it, top=it["id"] in top_ids) for it in items],
+ "counts": {"all": len(items), "top": len(top), "illustrated": sum(1 for s in top if s.get("image"))},
+ "spend_usd_this_run": round(spent, 4), "spend_usd_today": C.spent_today(),
+ }
+ tmp = ed_path + ".tmp"
+ json.dump(edition, open(tmp, "w"), indent=1)
+ os.replace(tmp, ed_path)
+ dates = sorted((d for d in os.listdir(OUT_DIR) if re.match(r"^\d{4}-\d{2}-\d{2}$", d)), reverse=True)
+ json.dump({"dates": dates}, open(os.path.join(OUT_DIR, "index.json"), "w"))
+ js = ("// AUTO-GENERATED by daily-edition/build.py (TK-12354) — do not hand-edit.\n"
+ "window.P24_DAILY = " + json.dumps(edition, ensure_ascii=False) + ";\n")
+ open(DATA_JS + ".tmp", "w").write(js)
+ os.replace(DATA_JS + ".tmp", DATA_JS)
+ print(f"[done] {date}: {edition['counts']} · source={label} · spent this run ${spent:.3f}, today ${edition['spend_usd_today']:.3f}")
+ return 0 if edition["counts"]["illustrated"] == len(top) or a.no_images else 3
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/daily-edition/com.steve.p24-daily-edition.plist b/daily-edition/com.steve.p24-daily-edition.plist
new file mode 100644
index 0000000..ed18184
--- /dev/null
+++ b/daily-edition/com.steve.p24-daily-edition.plist
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0"><dict>
+ <key>Label</key><string>com.steve.p24-daily-edition</string>
+ <key>ProgramArguments</key><array>
+ <string>/bin/bash</string>
+ <string>/Users/macstudio3/Projects/crazy-news-channel/daily-edition/run-daily.sh</string>
+ </array>
+ <key>EnvironmentVariables</key><dict>
+ <key>P24_EDITION_CAP_USD</key><string>0.10</string>
+ <key>P24_EDITION_PUSH</key><string>1</string>
+ <key>PATH</key><string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
+ </dict>
+ <!-- 06:10 locks today's top 6 + draws 6 cartoons (~$0.018); 12:10 and 18:10 refresh the all-news list ($0) -->
+ <key>StartCalendarInterval</key><array>
+ <dict><key>Hour</key><integer>6</integer><key>Minute</key><integer>10</integer></dict>
+ <dict><key>Hour</key><integer>12</integer><key>Minute</key><integer>10</integer></dict>
+ <dict><key>Hour</key><integer>18</integer><key>Minute</key><integer>10</integer></dict>
+ </array>
+ <key>RunAtLoad</key><false/>
+ <key>StandardOutPath</key><string>/Users/macstudio3/Projects/crazy-news-channel/daily-edition/logs/daily.log</string>
+ <key>StandardErrorPath</key><string>/Users/macstudio3/Projects/crazy-news-channel/daily-edition/logs/daily.log</string>
+</dict></plist>
diff --git a/daily-edition/run-daily.sh b/daily-edition/run-daily.sh
new file mode 100755
index 0000000..b7998cb
--- /dev/null
+++ b/daily-edition/run-daily.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# P24 Daily Edition runner (TK-12354). Builds today's edition (daily-edition/build.py) and,
+# ONLY when P24_EDITION_PUSH=1, rsyncs the edition data + today's cartoons to the p24 prod
+# docroot on Kamatera (same rsync-a-data-file pattern as allnewsdaily's push-wire.sh).
+# First run of the day locks the top 6 + generates 6 cartoons (~$0.018, capped at
+# P24_EDITION_CAP_USD, default $0.10/day); later runs refresh the all-news list for $0.
+# Stop: unload the launchd job (com.steve.p24-daily-edition). Undo a push: re-rsync the previous
+# daily-edition-data.js (git history) — nothing here deletes remote files.
+set -uo pipefail
+cd "$(dirname "$0")/.."
+export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH"
+PROD="${PROD_HOST:-root@45.61.58.125}"
+REMOTE="${P24_REMOTE_DIR:-/root/Projects/crazy-news-channel}"
+TODAY="$(date +%F)"
+echo "=== $(date '+%F %T') p24 daily edition start"
+python3 daily-edition/build.py; rc=$?
+echo "build exit=$rc"
+if [ "$rc" -ne 0 ] && [ "$rc" -ne 3 ]; then echo "build failed — not pushing"; exit "$rc"; fi
+# validate before any push: non-empty edition with >=1 story
+node -e "const vm=require('vm'),fs=require('fs');const c={window:{}};vm.createContext(c);vm.runInContext(fs.readFileSync('daily-edition-data.js','utf8'),c);const d=c.window.P24_DAILY;if(!d||!d.all||!d.all.length||!d.top||!d.top.length)process.exit(2)" \
+ || { echo "daily-edition-data.js invalid — not pushing"; exit 2; }
+if [ "${P24_EDITION_PUSH:-0}" = "1" ]; then
+ SSH="ssh -o ConnectTimeout=10 -o BatchMode=yes"
+ $SSH "$PROD" "mkdir -p '$REMOTE/daily/$TODAY'" \
+ && rsync -az -e "$SSH" "daily/$TODAY/" "$PROD:$REMOTE/daily/$TODAY/" \
+ && rsync -az -e "$SSH" daily/index.json "$PROD:$REMOTE/daily/index.json" \
+ && rsync -az -e "$SSH" daily-edition-data.js "$PROD:$REMOTE/daily-edition-data.js" \
+ && echo "pushed $TODAY edition → $PROD:$REMOTE" || { echo "PUSH FAILED"; exit 4; }
+else
+ echo "P24_EDITION_PUSH!=1 — built locally only, not pushed"
+fi
+echo "=== $(date '+%F %T') done (build rc=$rc)"
+exit "$rc"
diff --git a/daily/2026-09-26/1-d-3840859107.jpg b/daily/2026-09-26/1-d-3840859107.jpg
new file mode 100644
index 0000000..261b644
Binary files /dev/null and b/daily/2026-09-26/1-d-3840859107.jpg differ
diff --git a/daily/2026-09-26/2-d-767fab63ec.jpg b/daily/2026-09-26/2-d-767fab63ec.jpg
new file mode 100644
index 0000000..6121be9
Binary files /dev/null and b/daily/2026-09-26/2-d-767fab63ec.jpg differ
diff --git a/daily/2026-09-26/3-d-3808196cf2.jpg b/daily/2026-09-26/3-d-3808196cf2.jpg
new file mode 100644
index 0000000..1fd852d
Binary files /dev/null and b/daily/2026-09-26/3-d-3808196cf2.jpg differ
diff --git a/daily/2026-09-26/4-d-7ce4ddf970.jpg b/daily/2026-09-26/4-d-7ce4ddf970.jpg
new file mode 100644
index 0000000..797833d
Binary files /dev/null and b/daily/2026-09-26/4-d-7ce4ddf970.jpg differ
diff --git a/daily/2026-09-26/5-d-fb0714b547.jpg b/daily/2026-09-26/5-d-fb0714b547.jpg
new file mode 100644
index 0000000..395af3f
Binary files /dev/null and b/daily/2026-09-26/5-d-fb0714b547.jpg differ
diff --git a/daily/2026-09-26/6-d-181477aa44.jpg b/daily/2026-09-26/6-d-181477aa44.jpg
new file mode 100644
index 0000000..ed7f3a0
Binary files /dev/null and b/daily/2026-09-26/6-d-181477aa44.jpg differ
diff --git a/daily/2026-09-26/edition.json b/daily/2026-09-26/edition.json
new file mode 100644
index 0000000..7065df9
--- /dev/null
+++ b/daily/2026-09-26/edition.json
@@ -0,0 +1,739 @@
+{
+ "date": "2026-09-26",
+ "built_at": "2026-09-26T16:48:43-07:00",
+ "created_at": "2026-09-26T16:46:50-07:00",
+ "source": "allnewsdaily wire",
+ "source_updated_at": "2026-09-26T23:47:37.117000+00:00",
+ "illustrator": "Shadow Man",
+ "top": [
+ {
+ "id": "d-3840859107",
+ "headline": "Heavy Rain and Wind Batter Northeast, Bringing Coastal Flooding",
+ "url": "https://www.nytimes.com/live/2026/09/26/nyregion/noreaster-storm-rain-nyc-boston",
+ "outlet": "NYT",
+ "published": "2026-09-26T23:29:03+00:00",
+ "section": "Top story",
+ "section_key": "top",
+ "splash": true,
+ "concept": {
+ "title": "Bureaucracy in the Storm",
+ "caption": "A sweating official tries to hold back the tide with a bureaucratic form.",
+ "scene": "A sweating official stands in a flooded street, holding a large, overly detailed bureaucratic form above their head like a shield. The form has tiny print and multiple checkboxes. Behind them, a tiny homeowner is being carried away by a wave, while a committee of identical bureaucrats stands on a raised platform, arguing over the form's wording. The background shows a stormy sky and flooded buildings with doors and windows sealed with the same forms.",
+ "engine": "ollama:http://192.168.1.133:11434"
+ },
+ "image": "daily/2026-09-26/1-d-3840859107.jpg",
+ "image_prompt": "A sweating official stands in a flooded street, holding a large, overly detailed bureaucratic form above their head like a shield. The form has tiny print and multiple checkboxes. Behind them, a tiny homeowner is being carried away by a wave, while a committee of identical bureaucrats stands on a raised platform, arguing over the form's wording. The background shows a stormy sky and flooded buildings with doors and windows sealed with the same forms. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "nhwtyd6z1nrzw0d0w0as1m4a20",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:39:49-07:00"
+ },
+ {
+ "id": "d-767fab63ec",
+ "headline": "Trump Administration Plans to Gut Clean Car Rules",
+ "url": "https://www.nytimes.com/2026/09/26/climate/trump-fuel-economy-car-rules.html",
+ "outlet": "NYT",
+ "published": "2026-09-26T22:55:14+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "concept": {
+ "title": "Crushing Clean",
+ "caption": "A tiny homeowner fumes as a sweating official and a committee of identical bureaucrats gleefully dismantle a giant, sparkling clean car with a wrecking ball, leaving only a smoldering pile of rust and smoke in its place.",
+ "scene": "A tiny homeowner, arms akimbo, stands in a small house as a sweating official and a committee of identical bureaucrats, all wearing identical grey suits, cheerfully use a giant wrecking ball to crush a gleaming, sparkling clean car. The background shows a smoldering pile of rust and smoke, with the car's parts scattered around. The absurd detail is that the car is still in perfect condition, with no visible damage before the wrecking ball makes contact.",
+ "engine": "ollama:http://192.168.1.133:11434"
+ },
+ "image": "daily/2026-09-26/2-d-767fab63ec.jpg",
+ "image_prompt": "A tiny homeowner, arms akimbo, stands in a small house as a sweating official and a committee of identical bureaucrats, all wearing identical grey suits, cheerfully use a giant wrecking ball to crush a gleaming, sparkling clean car. The background shows a smoldering pile of rust and smoke, with the car's parts scattered around. The absurd detail is that the car is still in perfect condition, with no visible damage before the wrecking ball makes contact. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "ykea8phj35rzt0d0w0bvpnq344",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:41:16-07:00"
+ },
+ {
+ "id": "d-3808196cf2",
+ "headline": "Trump rejects Iran deal to reopen Strait of Hormuz in seven days",
+ "url": "https://www.bbc.co.uk/news/articles/cqgmrr9ekr7ko?at_medium=RSS&at_campaign=rss",
+ "outlet": "BBC",
+ "published": "2026-09-27T05:15:59+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "concept": {
+ "title": "Peace Talks, Round 47",
+ "caption": "The negotiating table has been extended again.",
+ "scene": "generals on both sides of an absurdly long negotiating table that stretches past the horizon, doves nesting in their helmets",
+ "engine": "template"
+ },
+ "image": "daily/2026-09-26/3-d-3808196cf2.jpg",
+ "image_prompt": "generals on both sides of an absurdly long negotiating table that stretches past the horizon, doves nesting in their helmets. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "bkq7f6q6n5rzw0d0w0casqjaqm",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:43:07-07:00"
+ },
+ {
+ "id": "d-7ce4ddf970",
+ "headline": "Boeing flags 737 Max software glitch affecting some automated approach functions",
+ "url": "https://www.cnbc.com/2026/09/26/boeing-737-max-navigation-software-glitch.html",
+ "outlet": "CNBC",
+ "published": "2026-09-27T04:55:01+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "concept": {
+ "title": "Toaster Takeover",
+ "caption": "A tiny homeowner squints at a flying toaster, while a committee of identical bureaucrats shrugs in unison.",
+ "scene": "In the foreground, a tiny homeowner stands on a hill, arms outstretched, eyes squinting upward at a flying toaster that's emitting smoke and sparks. In the background, a committee of identical bureaucrats sits around a long table, all shrugging in perfect unison, their identical expressions and postures conveying complete indifference. The flying toaster is slightly larger than the homeowner, and there's a small, unmarked airplane in the distance, its wings slightly drooping, suggesting a malfunction.",
+ "engine": "ollama:http://192.168.1.133:11434"
+ },
+ "image": "daily/2026-09-26/4-d-7ce4ddf970.jpg",
+ "image_prompt": "In the foreground, a tiny homeowner stands on a hill, arms outstretched, eyes squinting upward at a flying toaster that's emitting smoke and sparks. In the background, a committee of identical bureaucrats sits around a long table, all shrugging in perfect unison, their identical expressions and postures conveying complete indifference. The flying toaster is slightly larger than the homeowner, and there's a small, unmarked airplane in the distance, its wings slightly drooping, suggesting a malfunction. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "rk84pc05cxrzy0d0w0dby3rh68",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:44:20-07:00"
+ },
+ {
+ "id": "d-fb0714b547",
+ "headline": "Pope Leo XIV celebrates open-air Mass in front of 800,000 people in central Paris",
+ "url": "https://www.france24.com/en/france/20260926-pope-leo-xiv-celebrates-open-air-mass-in-front-of-800-000-people-in-central-paris",
+ "outlet": "France 24",
+ "published": "2026-09-27T03:28:37+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "concept": {
+ "title": "Film at Eleven",
+ "caption": "Details are developing, as they always seem to be.",
+ "scene": "a harried newsman at a desk buried under an avalanche of paper headlines, only his hand visible holding a coffee cup aloft",
+ "engine": "template"
+ },
+ "image": "daily/2026-09-26/5-d-fb0714b547.jpg",
+ "image_prompt": "a harried newsman at a desk buried under an avalanche of paper headlines, only his hand visible holding a coffee cup aloft. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "tkmf7t0x7hrzt0d0w0dsahk0kc",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:45:32-07:00"
+ },
+ {
+ "id": "d-181477aa44",
+ "headline": "My friend grosses $300,000 a year with her pet-sitting business. She pays herself $50,000. Should I do the same?",
+ "url": "https://www.marketwatch.com/story/my-friend-grosses-300-000-a-year-with-her-pet-sitting-business-she-pays-herself-50-000-should-i-do-the-same-8ab5cba3?mod=mw_rss_topstories",
+ "outlet": "MarketWatch",
+ "published": "2026-09-27T03:00:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "concept": {
+ "title": "The Pet-Sitting Paradox",
+ "caption": "Why pay yourself more when the dog's just waiting for a treat?",
+ "scene": "A tiny homeowner sits at a desk, surrounded by stacks of cash, while a large, slobbery dog lounges on a pile of $50,000 bills, wagging its tail and drooling. The absurd detail is the dog's drool turning the money into a sticky, messy pile.",
+ "engine": "ollama:http://192.168.1.133:11434"
+ },
+ "image": "daily/2026-09-26/6-d-181477aa44.jpg",
+ "image_prompt": "A tiny homeowner sits at a desk, surrounded by stacks of cash, while a large, slobbery dog lounges on a pile of $50,000 bills, wagging its tail and drooling. The absurd detail is the dog's drool turning the money into a sticky, messy pile. bold black ink editorial cartoon, heavy brush line, crosshatching, stark black and white, single panel satire. Invented anonymous caricature figures only. No color, no text, no letters, no words, no speech bubbles, no caption, no watermark, no signature.",
+ "prediction_id": "e692wyaed5rzt0d0w0eap55xzg",
+ "image_cost_usd": 0.003,
+ "image_created_at": "2026-09-26T16:46:50-07:00"
+ }
+ ],
+ "all": [
+ {
+ "id": "d-3840859107",
+ "headline": "Heavy Rain and Wind Batter Northeast, Bringing Coastal Flooding",
+ "url": "https://www.nytimes.com/live/2026/09/26/nyregion/noreaster-storm-rain-nyc-boston",
+ "outlet": "NYT",
+ "published": "2026-09-26T23:29:03+00:00",
+ "section": "Top story",
+ "section_key": "top",
+ "splash": true,
+ "top": true
+ },
+ {
+ "id": "d-767fab63ec",
+ "headline": "Trump Administration Plans to Gut Clean Car Rules",
+ "url": "https://www.nytimes.com/2026/09/26/climate/trump-fuel-economy-car-rules.html",
+ "outlet": "NYT",
+ "published": "2026-09-26T22:55:14+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": true
+ },
+ {
+ "id": "d-4def2d37d2",
+ "headline": "Nor'easter brings heavy flooding, major power outages to the East Coast",
+ "url": "https://www.cbsnews.com/news/east-coast-noreaster-severe-flooding-winds-evacuations/",
+ "outlet": "CBS News",
+ "published": "2026-09-26T22:53:01+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-f02f3c0738",
+ "headline": "Trump says he ended Biden electric vehicle rule, updated fuel economy standards",
+ "url": "https://thehill.com/homenews/administration/6113324-trump-eliminates-biden-ev-mandate/",
+ "outlet": "The Hill",
+ "published": "2026-09-26T22:52:15+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-88a60bdd99",
+ "headline": "This week on \"Sunday Morning\" (Sept. 27)",
+ "url": "https://www.cbsnews.com/news/this-week-on-sunday-morning-sept-27-2026/",
+ "outlet": "CBS News",
+ "published": "2026-09-26T22:44:08+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-7abdabfdaa",
+ "headline": "Former Kennedy Center employees claim officials halted repairs months prior to closure",
+ "url": "https://thehill.com/homenews/administration/6113290-kennedy-center-whistleblower-letter-repairs/",
+ "outlet": "The Hill",
+ "published": "2026-09-26T22:37:20+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-74c3e09c9e",
+ "headline": "Hurricane Nolo could cause \"catastrophic\" flooding in Hawaii, forecasters warn",
+ "url": "https://www.cbsnews.com/news/storm-nolo-hurricane-hawaii/",
+ "outlet": "CBS News",
+ "published": "2026-09-26T21:46:38+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-2297c92b32",
+ "headline": "Trump gave Xi Jinping a warm welcome. What did the talks accomplish?",
+ "url": "https://www.npr.org/2026/09/26/nx-s1-5980066/trump-gave-xi-jinping-a-warm-welcome-what-did-the-talks-accomplish",
+ "outlet": "NPR",
+ "published": "2026-09-26T21:13:54+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-449fcae9f3",
+ "headline": "Sunday shows preview: Trump rejects Iran deal after week of high-stakes meetings; GOP clammers to keep Congress",
+ "url": "https://thehill.com/homenews/sunday-talk-shows/6113249-sunday-shows-trump-rejects-iran-proposal/",
+ "outlet": "The Hill",
+ "published": "2026-09-26T21:02:36+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-0efa634cfa",
+ "headline": "Trump calls Iranian plan to reopen Strait of Hormuz not 'acceptable'",
+ "url": "https://www.npr.org/2026/09/26/nx-s1-5981990/trump-rejects-iranian-deal-strait-of-hormuz",
+ "outlet": "NPR",
+ "published": "2026-09-26T20:08:28+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-147edb97f1",
+ "headline": "How El Ni\u00f1o Is Shaping Storms on Two Sides of the U.S.",
+ "url": "https://www.nytimes.com/2026/09/26/climate/el-nino-hurricane-noreaster.html",
+ "outlet": "NYT",
+ "published": "2026-09-26T17:23:22+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-96c7d053ce",
+ "headline": "OpenAI says its models engaged with US government websites in misbehavior disclosure",
+ "url": "https://www.npr.org/2026/09/26/nx-s1-5981979/openai-us-government-websites-misbehavior",
+ "outlet": "NPR",
+ "published": "2026-09-26T17:10:04+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-a8bc74f422",
+ "headline": "States consider gas tax holidays ahead of Election Day",
+ "url": "https://www.washingtonpost.com/business/2026/09/26/record-high-diesel-prices-have-states-weighing-gas-tax-holidays-before-midterms/",
+ "outlet": "Washington Post",
+ "published": "2026-09-26T10:00:01+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-73c970e3dd",
+ "headline": "A horror story unfolds as police examine pornographer\u2019s brutal trove",
+ "url": "https://www.washingtonpost.com/nation/2026/09/26/police-search-house-filled-with-porn-clues-about-missing-women/",
+ "outlet": "Washington Post",
+ "published": "2026-09-26T10:00:01+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-37b6178fc6",
+ "headline": "Judy Markey, whose trailblazing radio show caught \u2018lightning in a bottle,\u2019 dies at 82",
+ "url": "https://www.washingtonpost.com/obituaries/2026/09/26/breaking-into-boys-club-talk-radio-she-became-beloved-chicago-broadcaster/",
+ "outlet": "Washington Post",
+ "published": "2026-09-26T10:00:01+00:00",
+ "section": "U.S. / TOP",
+ "section_key": "us",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-7d55e4bbcd",
+ "headline": "Four American tourists among 6 killed in suspected gas leak blast in Athens",
+ "url": "https://www.aljazeera.com/news/2026/9/26/four-american-tourists-among-6-killed-in-suspected-gas-leak-blast-in-athens?traffic_source=rss",
+ "outlet": "Al Jazeera",
+ "published": "2026-09-26T23:26:31+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-242fdb2a6e",
+ "headline": "Powerful storm brings flooding, power outages to northeastern United States",
+ "url": "https://www.aljazeera.com/news/2026/9/26/powerful-storm-brings-flooding-power-outages-to-northeastern-united-states?traffic_source=rss",
+ "outlet": "Al Jazeera",
+ "published": "2026-09-26T22:51:57+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-22a2c93f1d",
+ "headline": "Deadly shooting hits Caribbean islands of Saint Vincent and the Grenadines",
+ "url": "https://www.aljazeera.com/news/2026/9/26/deadly-shooting-hits-caribbean-islands-of-saint-vincent-and-the-grenadines?traffic_source=rss",
+ "outlet": "Al Jazeera",
+ "published": "2026-09-26T22:38:01+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-3808196cf2",
+ "headline": "Trump rejects Iran deal to reopen Strait of Hormuz in seven days",
+ "url": "https://www.bbc.co.uk/news/articles/cqgmrr9ekr7ko?at_medium=RSS&at_campaign=rss",
+ "outlet": "BBC",
+ "published": "2026-09-27T05:15:59+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": true
+ },
+ {
+ "id": "d-8e8dd43e13",
+ "headline": "Nor'easter brings flooding as New York and New Jersey declare emergency",
+ "url": "https://www.bbc.co.uk/news/articles/ck1wxxzn5jndo?at_medium=RSS&at_campaign=rss",
+ "outlet": "BBC",
+ "published": "2026-09-27T05:04:26+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-0ecd35aef9",
+ "headline": "At Summit, Xi Sought to Tilt Trump\u2019s Stance on America\u2019s Place in Asia",
+ "url": "https://www.nytimes.com/2026/09/26/world/asia/summit-xi-trump-taiwan-japan.html",
+ "outlet": "NYT World",
+ "published": "2026-09-26T21:31:57+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-fb0714b547",
+ "headline": "Pope Leo XIV celebrates open-air Mass in front of 800,000 people in central Paris",
+ "url": "https://www.france24.com/en/france/20260926-pope-leo-xiv-celebrates-open-air-mass-in-front-of-800-000-people-in-central-paris",
+ "outlet": "France 24",
+ "published": "2026-09-27T03:28:37+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": true
+ },
+ {
+ "id": "d-9e39130e88",
+ "headline": "Pope praises young people's 'energy and commitment' at huge open",
+ "url": "https://www.bbc.co.uk/news/articles/cm4gjjwvvlzro?at_medium=RSS&at_campaign=rss",
+ "outlet": "BBC",
+ "published": "2026-09-27T02:48:06+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-4c16ac780c",
+ "headline": "Germany news",
+ "url": "https://www.dw.com/en/germany-news-eu-ministers-meet-for-migration-showdown/live-79441034?maca=en-rss-en-all-1573-rdf",
+ "outlet": "Deutsche Welle",
+ "published": "2026-09-26T19:09:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-d2c1fb55ec",
+ "headline": "Backlash over data centers tests Europe's AI ambitions",
+ "url": "https://www.dw.com/en/backlash-over-data-centers-tests-europe-s-ai-ambitions/a-79419800?maca=en-rss-en-all-1573-rdf",
+ "outlet": "Deutsche Welle",
+ "published": "2026-09-26T18:08:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-5d6323fd5c",
+ "headline": "Maricarmen Vs The \u2018Vultures\u2019",
+ "url": "https://www.france24.com/en/tv-shows/spotlight/20260926-maricarmen-vs-the-vultures-a-social-tragedy-mobilising-spaniards",
+ "outlet": "France 24",
+ "published": "2026-09-27T01:03:40+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-373d672713",
+ "headline": "Pope Leo XIV addresses youth at giant Paris Mass",
+ "url": "https://www.france24.com/en/video/20260926-pope-leo-xiv-addresses-youth-at-giant-paris-mass",
+ "outlet": "France 24",
+ "published": "2026-09-27T00:04:48+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-1651d8471d",
+ "headline": "China, US agree to set up channel for AI safety incidents",
+ "url": "https://www.dw.com/en/china-us-agree-to-set-up-channel-for-ai-safety-incidents/a-79443351?maca=en-rss-en-all-1573-rdf",
+ "outlet": "Deutsche Welle",
+ "published": "2026-09-26T16:26:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-8ac04fb3e7",
+ "headline": "Six Dead After Explosion in Athens Tourist District",
+ "url": "https://www.nytimes.com/2026/09/25/world/europe/athens-tourists-explosion.html",
+ "outlet": "NYT World",
+ "published": "2026-09-26T14:58:38+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-b6193059de",
+ "headline": "A Tetris-Like Maze Blocks Protests in Pakistan\u2019s Capital",
+ "url": "https://www.nytimes.com/2026/09/26/world/asia/pakistan-protest-islamabad-containers.html",
+ "outlet": "NYT World",
+ "published": "2026-09-26T14:19:07+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-ef64b05589",
+ "headline": "Ireland goalkeeper boycotting Nations League game against Israel",
+ "url": "https://news.sky.com/story/ireland-confirms-nations-league-game-against-israel-will-go-ahead-13592048",
+ "outlet": "Sky News",
+ "published": "2026-09-26T12:02:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-fa2845ee52",
+ "headline": "<a href='https://news.sky.com/story/the-most-striking-pictures-of-the-week-13592004'>The most striking pictures of the week</a>",
+ "url": "https://news.sky.com/story/the-most-striking-pictures-of-the-week-13592010",
+ "outlet": "Sky News",
+ "published": "2026-09-26T09:00:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-caec500eee",
+ "headline": "OpenAI models accessed US government data and 'tried to hack another site'",
+ "url": "https://news.sky.com/story/openai-models-accessed-us-government-data-and-tried-to-hack-education-site-13591998",
+ "outlet": "Sky News",
+ "published": "2026-09-26T07:56:00+00:00",
+ "section": "WORLD",
+ "section_key": "world",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-5123d4dd51",
+ "headline": "Powerful nor'easter causes coastal flooding and knocks out power to parts of the Northeast",
+ "url": "https://www.cnbc.com/2026/09/26/powerful-noreaster-causes-flooding-and-knocks-out-power.html",
+ "outlet": "CNBC",
+ "published": "2026-09-27T05:23:11+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-7ce4ddf970",
+ "headline": "Boeing flags 737 Max software glitch affecting some automated approach functions",
+ "url": "https://www.cnbc.com/2026/09/26/boeing-737-max-navigation-software-glitch.html",
+ "outlet": "CNBC",
+ "published": "2026-09-27T04:55:01+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": true
+ },
+ {
+ "id": "d-7597176acd",
+ "headline": "Apple hit with $5.7 billion in damages over haptic patents",
+ "url": "https://www.theverge.com/tech/1001118/apple-hit-with-5-7-billion-in-damages-over-haptic-patents",
+ "outlet": "The Verge",
+ "published": "2026-09-26T21:30:01+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-d70ce2b78b",
+ "headline": "Insurers claim AI is already increasing healthcare costs",
+ "url": "https://techcrunch.com/2026/09/26/insurers-claim-ai-is-already-increasing-healthcare-costs/",
+ "outlet": "TechCrunch",
+ "published": "2026-09-26T21:02:06+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-31b997b1e9",
+ "headline": "TikTok agrees to pay at least $100M in Alabama settlement",
+ "url": "https://techcrunch.com/2026/09/26/tiktok-agrees-to-pay-at-least-100m-in-alabama-settlement/",
+ "outlet": "TechCrunch",
+ "published": "2026-09-26T20:24:45+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-f67e72b378",
+ "headline": "Welcome to the Medical Clinic at the Interplanetary Relay Station",
+ "url": "https://www.lightspeedmagazine.com/fiction/welcome-to-the-medical-clinic-at-the-interplanetary-relay-station/",
+ "outlet": "Hacker News",
+ "published": "2026-09-26T20:08:50+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-181477aa44",
+ "headline": "My friend grosses $300,000 a year with her pet-sitting business. She pays herself $50,000. Should I do the same?",
+ "url": "https://www.marketwatch.com/story/my-friend-grosses-300-000-a-year-with-her-pet-sitting-business-she-pays-herself-50-000-should-i-do-the-same-8ab5cba3?mod=mw_rss_topstories",
+ "outlet": "MarketWatch",
+ "published": "2026-09-27T03:00:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": true
+ },
+ {
+ "id": "d-6d6114d2a1",
+ "headline": "Decap is the man behind the drums behind your favorite song",
+ "url": "https://www.theverge.com/report/1000994/decap-drums-that-knock-interview",
+ "outlet": "The Verge",
+ "published": "2026-09-26T19:22:40+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-2b0a89bd38",
+ "headline": "\u2018We lived within our means\u2019: I earned $30,000 as a pastor and still retired comfortably. Why don\u2019t you tell people that?",
+ "url": "https://www.marketwatch.com/story/we-lived-within-our-means-i-earned-30-000-as-a-pastor-and-still-retired-comfortably-why-dont-you-tell-people-that-6b9f231e?mod=mw_rss_topstories",
+ "outlet": "MarketWatch",
+ "published": "2026-09-27T02:00:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-755e3dc914",
+ "headline": "DeepSeek Elastic Compute (DSec)",
+ "url": "https://arxiv.org/abs/2609.22978",
+ "outlet": "Hacker News",
+ "published": "2026-09-26T18:22:41+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-0adc94c225",
+ "headline": "From $6 eggs to $50,000 cars, these charts show how inflation has defined the past 5 years",
+ "url": "https://www.marketwatch.com/story/from-6-eggs-to-50-000-cars-these-charts-show-how-inflation-has-defined-the-past-5-years-3c7b9ab9?mod=mw_rss_topstories",
+ "outlet": "MarketWatch",
+ "published": "2026-09-27T00:54:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-fcf88b0cd2",
+ "headline": "Meta and YouTube say they will run ads for \u2018Musk\u2019 documentary after all",
+ "url": "https://techcrunch.com/2026/09/26/meta-says-it-will-run-ads-for-musk-documentary-after-all/",
+ "outlet": "TechCrunch",
+ "published": "2026-09-26T17:44:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-464712ef80",
+ "headline": "Japan moves to tighten rules for foreigners",
+ "url": "https://www.aljazeera.com/economy/2026/9/25/japan-moves-to-tighten-rules-for-foreigners-throwing-futures-into-doubt",
+ "outlet": "Hacker News",
+ "published": "2026-09-26T17:43:11+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-3d8c5d8488",
+ "headline": "Kids turned the comment section of an NPR podcast into a group chat",
+ "url": "https://www.theverge.com/entertainment/1001056/this-american-life-npr-kids-group-chat-comment-section",
+ "outlet": "The Verge",
+ "published": "2026-09-26T17:32:35+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-7af8dfa058",
+ "headline": "OpenAI expands review of model behavior after more rogue agent incidents emerge",
+ "url": "https://www.cnbc.com/2026/09/26/openai-agent-model-behavior-review.html",
+ "outlet": "CNBC",
+ "published": "2026-09-27T00:10:32+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-13b36f07f6",
+ "headline": "Old-School Credit Card Scams Are Far From Dead",
+ "url": "https://www.wired.com/story/kernel-panic-old-timey-credit-card-scams/",
+ "outlet": "Wired",
+ "published": "2026-09-26T12:00:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-0bfe7fe567",
+ "headline": "12 Best White Elephant Gifts, Plus a Prank Box to Put Them In (2026)",
+ "url": "https://www.wired.com/gallery/best-white-elephant-gifts-2026/",
+ "outlet": "Wired",
+ "published": "2026-09-26T11:36:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-5ad3f05c60",
+ "headline": "Best Mesh Wi-Fi Systems (2026)",
+ "url": "https://www.wired.com/story/best-mesh-wifi-routers/",
+ "outlet": "Wired",
+ "published": "2026-09-26T11:00:00+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-e899f09f9f",
+ "headline": "Tesla\u2019s big electric truck faces an even bigger infrastructure challenge",
+ "url": "https://arstechnica.com/cars/2026/09/teslas-big-electric-truck-faces-an-even-bigger-infrastructure-challenge/",
+ "outlet": "Ars Technica",
+ "published": "2026-09-26T10:45:09+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-13df8a7ee8",
+ "headline": "Can Trump ever be wrong? His pick to lead FDA refused to say.",
+ "url": "https://arstechnica.com/health/2026/09/can-trump-ever-be-wrong-his-pick-to-lead-fda-refused-to-say/",
+ "outlet": "Ars Technica",
+ "published": "2026-09-25T23:00:26+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ },
+ {
+ "id": "d-4a19c9abdc",
+ "headline": "Court rules Pentagon can blacklist Anthropic for refusing to enable Claude features",
+ "url": "https://arstechnica.com/tech-policy/2026/09/court-rules-trump-can-blacklist-anthropic-for-refusing-to-enable-claude-features/",
+ "outlet": "Ars Technica",
+ "published": "2026-09-25T21:36:20+00:00",
+ "section": "MONEY / TECH",
+ "section_key": "money_tech",
+ "splash": false,
+ "top": false
+ }
+ ],
+ "counts": {
+ "all": 54,
+ "top": 6,
+ "illustrated": 6
+ },
+ "spend_usd_this_run": 0.0,
+ "spend_usd_today": 0.018
+}
\ No newline at end of file
diff --git a/daily/index.json b/daily/index.json
new file mode 100644
index 0000000..7a24972
--- /dev/null
+++ b/daily/index.json
@@ -0,0 +1 @@
+{"dates": ["2026-09-26"]}
\ No newline at end of file
diff --git a/index.html b/index.html
index af6fdca..1a7ef91 100644
--- a/index.html
+++ b/index.html
@@ -59,6 +59,12 @@
</div>
</header>
+<!-- Daily Edition (TK-12354): all of today's news + top 6 with Shadow Man cartoons.
+ Rendered by assets/daily-edition.js from daily-edition-data.js (daily-edition/build.py). -->
+<section id="dailyEdition" class="daily-edition" aria-labelledby="dailyEditionTitle" hidden></section>
+<script src="daily-edition-data.js"></script>
+<script src="assets/daily-edition.js"></script>
+
<!-- Front-page featured editorial cartoon (TK-12153) -->
<section class="featured-cartoon" aria-labelledby="featuredCartoonTitle">
<div class="featured-cartoon-panel">
← 7868d09 auto-data-snapshot: 2026-09-26T03:43:38 (5 data files) — car
·
back to Crazy News Channel
·
(newest)