{"componentChunkName":"component---src-templates-blog-post-js","path":"/building-news-digest/","result":{"data":{"site":{"siteMetadata":{"title":"santos-luis.github.io"}},"markdownRemark":{"id":"eb4d4905-878f-5f64-a01d-654b07f87c6e","excerpt":"A small archive for daily context I wanted a way to keep the daily news summaries I was generating without losing them inside a chat thread or a Telegram…","html":"<h2>A small archive for daily context</h2>\n<p>I wanted a way to keep the daily news summaries I was generating without losing them inside a chat thread or a Telegram history. The result is <a href=\"https://santos-luis.github.io/news-digest/\">News Digest</a>, a small static archive where each day is just a Markdown file.</p>\n<p>The content model is deliberately simple:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">src/digests/2026-05-02.md</code></pre></div>\n<p>Each Markdown file becomes one article page. The filename gives the route and date, while the first line of the file becomes the display title. That means the generator does not need to know anything about Astro frontmatter, routing, or page metadata. It only needs to write a clean digest.</p>\n<h2>Feeding the archive</h2>\n<p>The digest is produced from a prompt and a topic list. The prompt describes the output format, and the topics file keeps the areas I care about in one place: software engineering, macro and markets, enterprise AI strategy, and developer tools.</p>\n<p>The command can be run by different agent environments. With Codex, the shape is:</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">codex <span class=\"token builtin class-name\">exec</span> --sandbox read-only --ephemeral -o src/digests/2026-05-02.md <span class=\"token string\">\"<span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">cat</span> generator/digest.md<span class=\"token variable\">)</span></span>\"</span></code></pre></div>\n<p>With Claude, the same idea can be expressed through <code class=\"language-text\">claude --print</code>, piping or redirecting the result into the daily Markdown file. The useful part is not the specific agent. The useful part is that the archive treats the agent as a replaceable producer of Markdown.</p>\n<h2>Scheduling with Taskdeck</h2>\n<p><a href=\"https://github.com/luissh-5/taskdeck\">Taskdeck</a> is the local-first scheduler I use to run shell-command jobs. It stores jobs in SQLite, runs them from a Fastify process, records run history, and provides a React UI for managing the jobs.</p>\n<p>That makes it a good fit for this workflow. Taskdeck can own the daily schedule, execute the chosen agent command, and leave the output in <code class=\"language-text\">src/digests/</code>. From there, the static site is just a normal Astro build and GitHub Pages deployment.</p>\n<p>The nice property of this setup is that each piece has a narrow responsibility:</p>\n<ul>\n<li>Taskdeck decides when the job runs.</li>\n<li>Codex, Claude, or another agent produces the Markdown.</li>\n<li>News Digest renders and archives the result.</li>\n<li>GitHub Pages hosts the static output.</li>\n</ul>\n<h2>Why this shape works</h2>\n<p>The system avoids a database, CMS, or custom backend. Markdown is the source of truth, Git is the history, and the static site is the archive.</p>\n<p>It also keeps the workflow portable. If I want to run the generator locally, from Taskdeck, from GitHub Actions, or through a different agent, the site does not need to change. As long as something writes <code class=\"language-text\">YYYY-MM-DD.md</code>, the archive can publish it.</p>","frontmatter":{"title":"News Digest","date":"May 03, 2026","description":"Personal archive that turns daily AI-generated news digests into a static Astro site. The digest is produced from a prompt and topic list, scheduled through Taskdeck, and can run through different coding agents such as Codex or Claude."}}},"pageContext":{"slug":"/building-news-digest/","previous":{"fields":{"slug":"/promo-codes/"},"frontmatter":{"title":"Promo Codes"}},"next":{"fields":{"slug":"/loci/"},"frontmatter":{"title":"Loci"}}}},"staticQueryHashes":["1046244732","3000541721"]}