Financial markets do not have a natural ending. Europe closes while America is still trading; crypto never closes at all; and by the time one narrative has settled, another data release is already changing it. I wanted the News section of this site to keep pace without turning it into an endless stream of copied headlines.
The result is a small, automated newsroom with two shifts. At 07:00 it publishes a briefing for the day ahead. At 20:00 it returns to explain what actually happened. Claude researches and writes, Codex creates the editorial artwork, and a deliberately unglamorous shell script decides whether anything is safe to publish.
Two runs, two editorial jobs
The whole system begins with two entries in my crontab:
0 7 * * * /bin/bash ~/bin/financial-news-digest.sh # morning
0 20 * * * /bin/bash ~/bin/financial-news-digest.sh # evening
Both invoke the same wrapper and both ask for the previous 24 hours, but they do not produce the same article twice. The wrapper reads the real clock before Claude starts. A morning run is told to include the day's scheduled data, central-bank events, the next relevant FOMC date and any index-rebalancing deadline. The evening run is a same-day recap and deliberately drops that forward calendar.
That distinction matters. The first briefing answers, “What changed overnight, and what could move the market next?” The second asks, “Which of those risks mattered by the close?” It gives the feed a rhythm rather than simply doubling its volume.
Claude runs the news desk
Claude starts as a specialist financial-news agent with a narrow assignment: research the last 24 hours across macroeconomics, US and European equities, commodities, crypto prices and crypto regulation. It looks for primary or reliable sources, keeps the concrete market levels and percentage moves, and avoids manufacturing a story when the window is quiet.
The first output is a compact Telegram briefing. That is the fast channel: roughly a phone screen of text, designed to be useful now. Once that send has been attempted, the same research is passed through a second Claude skill that acts more like an editor. It restores headings and source links, keeps the important figures, writes a real headline around the dominant story and turns the briefing into a 300–500 word entry for this site's News section.
This is an important part of the setup: the web post is not a paste of the Telegram message. One is an alert; the other is a dated market snapshot that should still make sense when opened from an RSS reader several days later.
Codex draws the front page
Each digest also gets a companion image. Claude sends the finished digest through a small MCP tool, which invokes a script backed by the Codex CLI. Codex is asked to choose one genuinely market-moving story and reduce it to a single visual metaphor rather than attempting to draw a dense dashboard of every asset mentioned.
The art direction is intentionally consistent: warm newsprint, charcoal linework, muted red, plenty of negative space and no logos or portraits of public figures. There can be one short headline and, at most, one exact data point from the digest. The result is closer to an editorial newspaper illustration than a synthetic trading terminal.
That division of labour works well. Claude has the full research context and controls the words; Codex gets a much smaller creative problem—find the visual centre of gravity. The PNG is sent with the Telegram update. On the site, the same image can also serve as the article's hero, list thumbnail and social preview; if the asset is unavailable, the post is published without it.
The boring code has the final vote
The language model does not decide the filename, timestamp, Git branch or whether today is a publishing day. Those belong to the wrapper script because they should be deterministic.
Cron still sends a Telegram digest every day, including weekends. The site feed is more selective: automated posts are skipped on weekends, UK bank holidays and NYSE market holidays.
When publishing is allowed, Claude may write exactly one Markdown file. It cannot run Git or deploy the site. After Claude exits, the wrapper takes over:
- It looks for the matching generated image and, when present, copies it into the site's tracked static assets.
- It builds the entire Zola site in a temporary directory.
- It stages only the new post and its matching image, even if I have unrelated work in progress.
- It commits and pushes to
master, which triggers the GitHub Pages deployment.
If the image failed, the article can continue without it. If the Zola build fails, nothing is committed. If the push is rejected, the commit stays local for inspection—the automation never rebases or stashes my work to force its way through.
From Markdown to a separate feed
The final piece is Zola itself. News lives in its own content section with feed generation
enabled, so every published digest becomes an HTML page and an item in /news/rss.xml. The blog
keeps its separate /blog/rss.xml; readers interested in market briefings do not have to mix
them with longer research posts, and vice versa.
There is no database and no publishing API. The durable artefact is a Markdown file, reviewed by the same static-site build used for everything else here. That simplicity makes the automation easy to inspect: the post, its sources, its image and the commit that published it all remain together.
The useful boundary
The interesting part of this setup is not that an AI can write a market summary. It is deciding where its judgement is valuable and where it is dangerous. Selecting the dominant story, compressing research and finding a visual metaphor benefit from Claude and Codex. Calendars, paths, permissions, validation and version control benefit from ordinary code with predictable failure modes.
Twice a day the creative half wakes up, does its shift and hands the result back. The mechanical half checks the doors before anything goes live. That boundary is what turns a clever demo into a news feed I can leave running.