Initial commit: The Daily EPUB full implementation

Full implementation of a personalized daily newspaper delivered as an
EPUB.

Articles are pulled from a local self-hosted Miniflux instance, enriched
with comments, summarized and filtered by DeepSeek AI, and then
assembled into two EPUB editions: standard and optimized for the Xteink
X4 e-ink reader. Both are served by the local self-hosted BookOrbit OPDS
server in a separate library. Then the X4 edition is futher converted to
XTC format and served over a separate OPDS server hosted by the Rust
binary. Runs are tracked in a local SQLite database so runs are
idempotent per date.

Full documentation of the plan is in docs/plans and setup and install
instructions are in the README.md file.
This commit is contained in:
2026-08-15 17:46:19 +00:00
commit 9e30c1dcdf
80 changed files with 27578 additions and 0 deletions
View File
+8
View File
@@ -0,0 +1,8 @@
{
"from_the_editor": "Two of today's pieces are, underneath, the same story: what it costs to move data you no longer trust. The lead — a team hauling forty terabytes off Postgres, rollback plans and all — is the version with the invoices attached, and it earns the front page by refusing to tidy up its failures. Read it first, while the coffee is hot; it rewards attention and it is long.\n\nThe local desk supplies the counterpoint. Somebody has finally put the MBTA's slow-zone data into a shape a rider can argue with, and the charts do more persuading than a year of press releases. It is a short read and a satisfying one, and it pairs unreasonably well with the migration story: both are about institutions discovering what they actually have.\n\nThe rest of the issue is quieter than usual. That is not a complaint — a thin Friday is a good excuse to finish the long one properly rather than skimming six. If you only get through the lead today, you will not have missed much else.",
"section_intros": {
"Top Stories": "The day's most substantial piece: a full account of a forty-terabyte migration, with the failures left in. It is long, technical and unusually honest about what went wrong.",
"Boston & Local": "Transit data gets the treatment it deserves. A rider-built analysis of MBTA slow zones, with charts you can check yourself and a methodology section that holds up.",
"Niche Corner": "A section the model wrote an intro for even though nothing was placed in it today — a stray thread about tape-drive firmware and the people who still maintain it. The issue drops intros for sections that never ran."
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"picks": [
{ "id": 101, "section": "Top Stories", "position": 1, "lead_story": true },
{ "id": 102, "section": "Tech & Engineering", "position": 1, "lead_story": false },
{ "id": 103, "section": "Tech & Engineering", "position": 2, "lead_story": false },
{ "id": 104, "section": "AI & Machine Learning", "position": 1, "lead_story": false },
{ "id": 105, "section": "Boston & Local", "position": 1, "lead_story": false },
{ "id": 106, "section": "Culture & Essays", "position": 1 },
{ "section": "Niche Corner", "position": 2, "lead_story": false },
"the model sometimes trails off like this"
]
}
+32
View File
@@ -0,0 +1,32 @@
{
"articles": [
{
"id": 101,
"score": 8.5,
"category": "Tech & Engineering",
"rationale": "first-hand 40TB Postgres migration with numbers, failures and rollback plan",
"is_paywalled_guess": false
},
{
"id": 102,
"score": 3.0,
"category": "AI & Machine Learning",
"rationale": "model release announcement, no independent evaluation",
"is_paywalled_guess": false
},
{
"id": 103,
"score": 6.5,
"category": "Boston & Local",
"rationale": "MBTA slow-zone data analysis with original charts",
"is_paywalled_guess": false
},
{
"id": 104,
"score": 5.0,
"category": "Culture & Essays",
"rationale": "promising essay on typesetting, body appears truncated",
"is_paywalled_guess": true
}
]
}
+35
View File
@@ -0,0 +1,35 @@
{
"articles": [
{
"id": 201,
"score": 7.0,
"category": "Science & Space",
"rationale": "careful write-up of an amateur radio occultation measurement",
"is_paywalled_guess": false
},
{
"id": "202",
"score": "6",
"category": "Niche Corner",
"rationale": "mailing-list argument about tape drives, oddly gripping",
"is_paywalled_guess": "false"
},
{
"id": 203,
"score": 4
},
{
"id": 204,
"score": 12.5,
"category": "Top Stories",
"rationale": "model ignored the rubric ceiling here",
"is_paywalled_guess": false
},
{
"score": 9.0,
"category": "Top Stories",
"rationale": "no id at all, unusable"
},
"a bare string where an object belongs"
]
}
+54
View File
@@ -0,0 +1,54 @@
{
"id": 40100000,
"created_at": "2026-08-15T09:12:00.000Z",
"type": "story",
"author": "poster",
"title": "A Story About Databases",
"url": "https://example.com/databases",
"points": 342,
"text": null,
"children": [
{
"id": 40100001,
"type": "comment",
"author": "alice",
"text": "The <i>write path</i> is the interesting part here.<p>Especially fsync batching.",
"points": 61,
"children": [
{
"id": 40100002,
"type": "comment",
"author": "bob",
"text": "Agreed — and the group commit numbers match my own benchmarks.",
"points": 24,
"children": []
}
]
},
{
"id": 40100003,
"type": "comment",
"author": "carol",
"text": "Counterpoint: the benchmark hardware is unrealistic.",
"points": 12,
"children": []
},
{
"id": 40100004,
"type": "comment",
"author": null,
"text": null,
"points": null,
"children": [
{
"id": 40100005,
"type": "comment",
"author": "dana",
"text": "Replying to a since-deleted comment, but the point stands.",
"points": 3,
"children": []
}
]
}
]
}
+41
View File
@@ -0,0 +1,41 @@
{
"short_id": "abcdef",
"title": "A Story About Databases",
"url": "https://example.com/databases",
"score": 48,
"comment_count": 4,
"comments": [
{
"short_id": "c1",
"comment": "<p>Nice writeup of the write path.</p>",
"score": 20,
"indent_level": 1,
"parent_comment": null,
"commenting_user": "pushcx"
},
{
"short_id": "c2",
"comment": "<p>Do you have numbers for NVMe?</p>",
"score": 9,
"indent_level": 2,
"parent_comment": "c1",
"commenting_user": { "username": "second" }
},
{
"short_id": "c3",
"comment": "<p>Yes, in the appendix.</p>",
"score": 4,
"indent_level": 3,
"parent_comment": "c2",
"commenting_user": "third"
},
{
"short_id": "c4",
"comment": "<p>Unrelated: the site's typography is lovely.</p>",
"score": 3,
"indent_level": 1,
"parent_comment": null,
"commenting_user": "other"
}
]
}
+82
View File
@@ -0,0 +1,82 @@
{
"id": 41234567,
"created_at": "2026-08-14T13:02:11.000Z",
"created_at_i": 1786748531,
"type": "story",
"author": "tylerh",
"title": "A Deep Dive Into B-Trees",
"url": "https://blog.dev/post",
"text": null,
"points": 342,
"parent_id": null,
"story_id": null,
"children": [
{
"id": 41234600,
"created_at": "2026-08-14T13:20:00.000Z",
"type": "comment",
"author": "dbnerd",
"title": null,
"url": null,
"text": "<p>The section on page splits is the clearest I have read. <i>Bookmarked.</i></p>",
"points": 88,
"parent_id": 41234567,
"story_id": 41234567,
"children": [
{
"id": 41234611,
"created_at": "2026-08-14T13:41:00.000Z",
"type": "comment",
"author": "tylerh",
"title": null,
"url": null,
"text": "<p>Thanks &mdash; the diagrams took longer than the prose.</p>",
"points": 31,
"parent_id": 41234600,
"story_id": 41234567,
"children": [
{
"id": 41234620,
"created_at": "2026-08-14T14:00:00.000Z",
"type": "comment",
"author": "gridlines",
"title": null,
"url": null,
"text": "<p>What did you draw them with?</p>",
"points": 4,
"parent_id": 41234611,
"story_id": 41234567,
"children": []
}
]
}
]
},
{
"id": 41234700,
"created_at": "2026-08-14T15:05:00.000Z",
"type": "comment",
"author": "deleted_user",
"title": null,
"url": null,
"text": null,
"points": null,
"parent_id": 41234567,
"story_id": 41234567,
"children": []
},
{
"id": 41234800,
"created_at": "2026-08-14T16:12:00.000Z",
"type": "comment",
"author": "skeptic",
"title": null,
"url": null,
"text": "<p>Counterpoint: LSM trees win on write-heavy workloads.</p>",
"points": 45,
"parent_id": 41234567,
"story_id": 41234567,
"children": []
}
]
}
+50
View File
@@ -0,0 +1,50 @@
{
"hits": [
{
"created_at": "2026-08-14T13:02:11.000Z",
"title": "A Deep Dive Into B-Trees",
"url": "https://blog.dev/post",
"author": "tylerh",
"points": 342,
"story_text": null,
"comment_text": null,
"num_comments": 210,
"story_id": null,
"story_title": null,
"story_url": null,
"parent_id": null,
"created_at_i": 1786748531,
"_tags": ["story", "author_tylerh", "story_41234567"],
"objectID": "41234567",
"_highlightResult": {
"url": {
"value": "https://blog.dev/post",
"matchLevel": "full",
"matchedWords": ["https://blog.dev/post"]
}
}
},
{
"created_at": "2026-08-10T09:15:00.000Z",
"title": "A Deep Dive Into B-Trees (2019)",
"url": "https://blog.dev/post?utm_source=twitter",
"author": "someoneelse",
"points": 12,
"story_text": null,
"comment_text": null,
"num_comments": 3,
"story_id": null,
"created_at_i": 1786396500,
"_tags": ["story", "author_someoneelse", "story_41000000"],
"objectID": "41000000"
}
],
"nbHits": 2,
"page": 0,
"nbPages": 1,
"hitsPerPage": 20,
"exhaustiveNbHits": true,
"query": "https://blog.dev/post",
"params": "query=https%3A%2F%2Fblog.dev%2Fpost&restrictSearchableAttributes=url",
"processingTimeMS": 3
}
+11
View File
@@ -0,0 +1,11 @@
{
"hits": [],
"nbHits": 0,
"page": 0,
"nbPages": 0,
"hitsPerPage": 20,
"exhaustiveNbHits": true,
"query": "https://blog.dev/never-submitted",
"params": "query=https%3A%2F%2Fblog.dev%2Fnever-submitted&restrictSearchableAttributes=url",
"processingTimeMS": 1
}
+74
View File
@@ -0,0 +1,74 @@
{
"short_id": "abcdef",
"short_id_url": "https://lobste.rs/s/abcdef",
"created_at": "2026-08-14T09:11:04.000-05:00",
"title": "A Deep Dive Into B-Trees",
"url": "https://blog.dev/post",
"score": 78,
"flags": 1,
"comment_count": 4,
"description": "",
"description_plain": "",
"comments_url": "https://lobste.rs/s/abcdef/a_deep_dive_into_b_trees",
"submitter_user": "alice",
"user_is_author": false,
"tags": ["databases", "rust"],
"comments": [
{
"short_id": "c00001",
"short_id_url": "https://lobste.rs/c/c00001",
"created_at": "2026-08-14T09:40:00.000-05:00",
"is_deleted": false,
"is_moderated": false,
"score": 21,
"flags": 0,
"parent_comment": null,
"comment": "<p>The page-split diagrams are excellent.</p>",
"comment_plain": "The page-split diagrams are excellent.",
"indent_level": 1,
"commenting_user": "bob"
},
{
"short_id": "c00002",
"short_id_url": "https://lobste.rs/c/c00002",
"created_at": "2026-08-14T10:02:00.000-05:00",
"is_deleted": false,
"is_moderated": false,
"score": 9,
"flags": 0,
"parent_comment": "c00001",
"comment": "<p>Agreed &mdash; and the prose is tight too.</p>",
"comment_plain": "Agreed - and the prose is tight too.",
"indent_level": 2,
"commenting_user": { "username": "carol", "karma": 4021 }
},
{
"short_id": "c00003",
"short_id_url": "https://lobste.rs/c/c00003",
"created_at": "2026-08-14T11:15:00.000-05:00",
"is_deleted": false,
"is_moderated": false,
"score": 33,
"flags": 0,
"parent_comment": null,
"comment": "<p>Prior art: the 1979 Comer survey covers most of this.</p>",
"comment_plain": "Prior art: the 1979 Comer survey covers most of this.",
"indent_level": 1,
"commenting_user": "dave"
},
{
"short_id": "c00004",
"short_id_url": "https://lobste.rs/c/c00004",
"created_at": "2026-08-14T11:59:00.000-05:00",
"is_deleted": true,
"is_moderated": false,
"score": 0,
"flags": 0,
"parent_comment": "c00003",
"comment": "",
"comment_plain": "",
"indent_level": 2,
"commenting_user": "erin"
}
]
}
+105
View File
@@ -0,0 +1,105 @@
[
{
"kind": "Listing",
"data": {
"children": [
{
"kind": "t3",
"data": {
"subreddit": "programming",
"id": "1abcd2",
"name": "t3_1abcd2",
"title": "A Deep Dive Into B-Trees",
"score": 845,
"num_comments": 231,
"permalink": "/r/programming/comments/1abcd2/a_deep_dive_into_btrees/",
"url": "https://blog.dev/post"
}
}
]
}
},
{
"kind": "Listing",
"data": {
"children": [
{
"kind": "t1",
"data": {
"id": "kx1",
"name": "t1_kx1",
"author": "index_nerd",
"score": 412,
"body": "Fan-out is the whole ballgame; everything else is bookkeeping.",
"depth": 0,
"stickied": false,
"replies": {
"kind": "Listing",
"data": {
"children": [
{
"kind": "t1",
"data": {
"id": "kx2",
"name": "t1_kx2",
"author": "pagecache",
"score": 130,
"body": "Until your keys are variable length & the math gets ugly.",
"depth": 1,
"stickied": false,
"replies": ""
}
},
{
"kind": "more",
"data": {
"count": 18,
"name": "t1_more1",
"id": "more1",
"children": ["kx9", "kx10"]
}
}
]
}
}
}
},
{
"kind": "t1",
"data": {
"id": "kx3",
"name": "t1_kx3",
"author": "AutoModerator",
"score": 1,
"body": "Please keep discussion civil.",
"depth": 0,
"stickied": true,
"replies": ""
}
},
{
"kind": "t1",
"data": {
"id": "kx4",
"name": "t1_kx4",
"author": "[deleted]",
"score": null,
"body": "[removed]",
"depth": 0,
"stickied": false,
"replies": ""
}
},
{
"kind": "more",
"data": {
"count": 205,
"name": "t1_more2",
"id": "more2",
"children": []
}
}
]
}
}
]
+69
View File
@@ -0,0 +1,69 @@
{
"kind": "Listing",
"data": {
"after": null,
"dist": 3,
"modhash": "",
"geo_filter": "",
"before": null,
"children": [
{
"kind": "t3",
"data": {
"subreddit": "programming",
"id": "1abcd2",
"name": "t3_1abcd2",
"title": "A Deep Dive Into B-Trees",
"score": 845,
"ups": 845,
"num_comments": 231,
"permalink": "/r/programming/comments/1abcd2/a_deep_dive_into_btrees/",
"url": "https://blog.dev/post",
"author": "u_someone",
"created_utc": 1786748531.0,
"over_18": false,
"stickied": false,
"is_self": false
}
},
{
"kind": "t3",
"data": {
"subreddit": "databases",
"id": "1efgh3",
"name": "t3_1efgh3",
"title": "A Deep Dive Into B-Trees",
"score": 96,
"ups": 96,
"num_comments": 14,
"permalink": "/r/databases/comments/1efgh3/a_deep_dive_into_btrees/",
"url": "https://blog.dev/post",
"author": "dbperson",
"created_utc": 1786752000.0,
"over_18": false,
"stickied": false,
"is_self": false
}
},
{
"kind": "t3",
"data": {
"subreddit": "rust",
"id": "1ijkl4",
"name": "t3_1ijkl4",
"title": "A Deep Dive Into B-Trees",
"score": 12,
"ups": 12,
"num_comments": 2,
"permalink": "/r/rust/comments/1ijkl4/a_deep_dive_into_btrees/",
"url": "https://blog.dev/post",
"author": "ferris",
"created_utc": 1786755000.0,
"over_18": false,
"stickied": false,
"is_self": false
}
}
]
}
}
+11
View File
@@ -0,0 +1,11 @@
{
"kind": "Listing",
"data": {
"after": null,
"dist": 0,
"modhash": "",
"geo_filter": "",
"before": null,
"children": []
}
}
+76
View File
@@ -0,0 +1,76 @@
[
{
"kind": "Listing",
"data": {
"children": [
{
"kind": "t3",
"data": {
"title": "A Story About Databases",
"permalink": "/r/rust/comments/abc/title/",
"score": 512,
"num_comments": 87
}
}
]
}
},
{
"kind": "Listing",
"data": {
"children": [
{
"kind": "t1",
"data": {
"author": "ferris",
"score": 55,
"body": "The borrow checker earns its keep here.",
"body_html": "&lt;div class=\"md\"&gt;&lt;p&gt;The borrow checker earns its keep here.&lt;/p&gt;&lt;/div&gt;",
"replies": {
"kind": "Listing",
"data": {
"children": [
{
"kind": "t1",
"data": {
"author": "crab",
"score": 12,
"body_html": "&lt;div class=\"md\"&gt;&lt;p&gt;Only if you never fight it.&lt;/p&gt;&lt;/div&gt;",
"replies": ""
}
},
{
"kind": "more",
"data": { "count": 14, "children": ["x1", "x2"] }
}
]
}
}
}
},
{
"kind": "t1",
"data": {
"author": "[deleted]",
"score": 1,
"body_html": "&lt;div class=\"md\"&gt;&lt;p&gt;[removed]&lt;/p&gt;&lt;/div&gt;",
"replies": ""
}
},
{
"kind": "t1",
"data": {
"author": "rustacean",
"score": 31,
"body_html": "&lt;div class=\"md\"&gt;&lt;p&gt;The section on &amp;quot;unsafe&amp;quot; is the best part.&lt;/p&gt;&lt;/div&gt;",
"replies": ""
}
},
{
"kind": "more",
"data": { "count": 40, "children": ["y1"] }
}
]
}
}
]
+36
View File
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html prefix="dc: http://purl.org/dc/terms/" about="http://en.wikipedia.org/wiki/Special:Redirect/revision/1">
<head><meta charset="utf-8"/><title>Portal:Current events/2026 August 15</title></head>
<body id="mwAA" lang="en" class="mw-content-ltr sitedir-ltr ltr mw-body-content parsoid-body mediawiki mw-parser-output">
<section data-mw-section-id="0" id="mwAQ">
<div class="current-events-main vevent" id="mwAg">
<div class="current-events-heading">
<span class="summary"><span class="current-events-title">August 15, 2026</span></span>
<span class="mw-editsection"><a href="/w/index.php?title=Portal:Current_events/2026_August_15&amp;action=edit">edit</a></span>
</div>
<div class="current-events-content description" id="mwAw">
<p><b>Armed conflicts and attacks</b></p>
<ul>
<li><a href="./Border_dispute" title="Border dispute">Border dispute</a> in the region continues for a fourth day, with mediators from the <a href="./United_Nations" title="United Nations">United Nations</a> arriving overnight.<sup class="reference" id="cite_ref-1"><a href="#cite_note-1">[1]</a></sup>
<ul>
<li>A second-level detail about the mediation timetable.</li>
</ul>
</li>
<li>Officials report no casualties.<sup class="reference"><a href="#cite_note-2">[2]</a></sup></li>
</ul>
<p><b>Disasters and accidents</b></p>
<ul>
<li>Heavy rain floods the Charles River basin in <a href="./Boston" title="Boston">Boston</a>, <a href="./Massachusetts" title="Massachusetts">Massachusetts</a>, closing several stations.<sup class="reference"><a href="#cite_note-3">[3]</a></sup></li>
</ul>
<p><b>Science and technology</b></p>
<ul>
<li>A long-duration flight test concludes successfully.</li>
</ul>
</div>
</div>
<div class="navbox" role="navigation">
<ul><li>Ongoing events</li><li>Recent deaths</li></ul>
</div>
</section>
</body>
</html>
+17
View File
@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html prefix="dc: http://purl.org/dc/terms/ mw: http://mediawiki.org/rdf/" about="//en.wikipedia.org/wiki/Special:Redirect/revision/1369461094"><head prefix="mwr: //en.wikipedia.org/wiki/Special:Redirect/"><meta charset="utf-8"/><link rel="dc:replaces" resource="mwr:revision/0"/><meta property="mw:revisionSHA1" content="bqap22vqgtaw0lrodhv0ng2kbg1lo4i"/><meta property="dc:modified" content="2026-08-15T03:30:02Z"/><meta property="mw:pageNamespace" content="100"/><meta property="mw:pageId" content="83976994"/><meta property="mw:htmlVersion" content="2.8.0"/><meta property="mw:html:version" content="2.8.0"/><base href="//en.wikipedia.org/wiki/"/><link rel="dc:isVersionOf" href="//en.wikipedia.org/wiki/Portal:Current_events/2026_August_16"/><title>Portal:Current events/2026 August 16</title><meta property="mw:jsConfigVars" content='{"wgParsoidHtmlVersion":"2.8.0"}'/><meta property="mw:moduleStyles" content="mediawiki.skinning.content.parsoid"/><link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=mediawiki.skinning.content.parsoid%7Cmediawiki.skinning.interface%7Csite.styles&amp;only=styles&amp;skin=vector"/><meta http-equiv="content-language" content="en"/><meta http-equiv="vary" content="Accept"/><meta http-equiv="x-mediawiki-render-id" content="9a187c46-9859-11f1-ac0e-b9eb5a8a3066"/></head><body class="mw-content-ltr sitedir-ltr ltr mw-body-content mediawiki mw-parser-output parsoid-body" lang="en" dir="ltr" data-mw-parsoid-version="0.24.0.0-alpha19" data-mw-html-version="2.8.0"><section data-mw-section-id="0" id="mwAQ"><span class="mw-empty-elt" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Current events","href":"./Template:Current_events"},"params":{"year":{"wt":"2026"},"month":{"wt":"08"},"day":{"wt":"16"},"top":{"wt":"yes"}},"i":0}},"\n\n&lt;!-- All news items below this line -->\n*\n&lt;!-- All news items above this line -->\n\n",{"template":{"target":{"wt":"Current events","href":"./Template:Current_events"},"params":{"year":{"wt":"2026"},"month":{"wt":"08"},"day":{"wt":"16"},"bottom":{"wt":"yes"}},"i":1}}]}' id="mwAg"><style data-mw-deduplicate="TemplateStyles:r1305593205" typeof="mw:Extension/templatestyles" about="#mwt2" data-mw='{"name":"templatestyles","attrs":{"src":"Current events/styles.css"}}'>.mw-parser-output .current-events-main{margin:0.5em 0;padding:0.3em;background-color:var(--background-color-base,#fff);color:inherit;border:1px #cef2e0 solid}.mw-parser-output .current-events-heading{background-color:#cef2e0;color:inherit;font-weight:bold}@media screen{html.skin-theme-clientpref-night .mw-parser-output .current-events-heading{background-color:#0b281a}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .current-events-heading{background-color:#0b281a}}.mw-parser-output .current-events-title{padding:0.4em}.mw-parser-output .current-events-navbar{list-style:none;margin:0;font-size:small}.mw-parser-output .current-events-navbar li{display:inline-block;padding:0 0.4em}.mw-parser-output .current-events-content{padding:0 0.3em}.mw-parser-output .current-events-content-heading{margin-top:0.3em;font-weight:bold}.mw-parser-output .current-events-more{border-width:2px;font-size:10pt;font-weight:bold;padding:0.3em 0.6em}.mw-parser-output .current-events-nav{margin:auto;text-align:center;line-height:1.2}.mw-parser-output .current-events-nav a{display:inline-block;margin:0.5em;padding:0.5em;background-color:var(--background-color-neutral,#eaecf0)}.mw-parser-output .current-events-nav a>div{font-weight:bold}@media all and (min-width:480px){.mw-parser-output .current-events-heading{align-items:center;display:flex}.mw-parser-output .current-events-title{flex:1}.mw-parser-output .current-events-navbar{flex:0 auto;text-align:right;white-space:nowrap}.mw-parser-output .current-events-nav{max-width:22em}.mw-parser-output .current-events-nav a{width:9em}}</style></span><div class="current-events" about="#mwt1" id="mwAw">
<div role="region" aria-label="August 16" id="2026_August_16" class="current-events-main vevent">
<div class="current-events-heading plainlinks">
<div class="current-events-title" role="heading"><span class="summary">August<span typeof="mw:Entity"> </span>16,<span typeof="mw:Entity"> </span>2026<span style="display: none;"><span typeof="mw:Entity"> </span>(<span class="bday dtstart published updated itvstart">2026-08-16</span>)</span> (Sunday)</span><link rel="mw:PageProp/Category" href="./Category:2026_by_day#2026-08-16"/>
</div>
<ul class="current-events-navbar editlink noprint"><li><a rel="mw:ExtLink" href="https://en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=edit&amp;editintro=Portal:Current_events/Edit_instructions" class="external text" data-mw-original-href="//en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=edit&amp;editintro=Portal:Current_events/Edit_instructions">edit</a></li><li><a rel="mw:ExtLink" href="https://en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=history" class="external text" data-mw-original-href="//en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=history">history</a></li><li><a rel="mw:ExtLink" href="https://en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=watch" class="external text" data-mw-original-href="//en.wikipedia.org/w/index.php?title=Portal:Current_events/2026_August_16&amp;action=watch">watch</a></li>
</ul>
</div>
<div class="current-events-content description">
<!-- All news items below this line -->
<ul></ul>
<!-- All news items above this line -->
</div></div><div class="current-events-nav" role="navigation">
<div><a rel="mw:WikiLink" href="./Portal:Current_events/August_2026" title="Portal:Current events/August 2026">Month<div>August 2026</div></a></div><a rel="mw:WikiLink" href="./Portal:Current_events/2026_August_15" title="Portal:Current events/2026 August 15">Previous day<div>August 15</div></a><a rel="mw:WikiLink" href="./Portal:Current_events/2026_August_17?action=edit&amp;redlink=1" title="Portal:Current events/2026 August 17" class="new" typeof="mw:LocalizedAttrs" data-mw-i18n='{"title":{"lang":"x-page","key":"red-link-title","params":["Portal:Current events/2026 August 17"]}}'>Next day<div>August 17</div></a></div></div></section></body></html>