From Zero to Blog in a Day: Dispatch Learns to Publish
Today was one of those days where a small idea — "what if dispatch could write blog posts?" — snowballed into a full publishing pipeline. Along the way, I also tackled a batch of ludus stability fixes and landed a new issue-triage workflow for the arena skill.
Dispatch Gets a Blog
The day's marquee feature was teaching the arena dispatch workflow to produce polished blog articles. Until now, dispatch only had two modes: a tabloid-style newsletter (posted as a GitHub Gist) and a forward-looking daily briefing. I added a third — blog mode — that reuses the same git + ccusage data collection but synthesizes it into a publication-ready Markdown article written directly to tabula/blog/.
Getting there required more than just a new template. I replaced the placeholder Docusaurus authors and tags with b4arena-specific entries (goern, durandom, and the b4arena dispatch bot), defined topical tags like dispatch, infra, ludus, and agents, and then enabled the blog plugin in docusaurus.config.ts — it had been set to false since the initial scaffold. A navbar link went in, template posts came out, and suddenly Tabula had a blog section.
The icing: a personal author mode. Saying "blog by me" resolves the operator's GitHub username via gh api user, validates it against authors.yml, and switches the post to first-person voice. The weekly recap published earlier today was the first automated dispatch blog — this post is the first personal one. → blog mode commit
Ludus Gets Stabler
While the blog work was the most visible, a significant chunk of the day went into stabilizing ludus. Marcel and I tag-teamed a series of fixes that had been piling up:
- Cron job failures traced to missing environment variables and empty JSON responses crashing the parser — fixed by adding proper env injection and defensive parsing in
remote.pyandinfo.py - Agent workspace permissions hardened so container UID 996 (ca-leash) can actually write to workspace directories
- Deploy pipeline fixed to preserve web dependencies during full deploys — previously, a clean deploy would wipe the
node_modulesneeded by the web dashboard - Image builds now properly depend on the ca-leash wheel, preventing build failures when the wheel artifact wasn't ready yet
- Stale tests cleaned up after the intercom skill refactor — removed a
primaryEnvtest that was asserting against a schema that no longer existed
These aren't glamorous changes, but they're the kind of plumbing work that keeps the platform from surprising us at 2 AM. → cron fix
Issue Triage Joins the Arena Skill
Marcel landed a new issue-triage workflow for the arena skill, extending the existing arena_triage.sh script to surface open GitHub issues across all b4arena repos. The workflow presents issues in a scannable table, lets the operator take action (investigate, assign, close, skip), and executes decisions immediately. It's the issues counterpart to the existing PR review workflow — together they cover the two main "what needs attention" loops. → issue-triage workflow
By the Numbers
| Metric | Value |
|---|---|
| Commits | 21 |
| Active repos | 3 (meta, ludus, tabula) |
| Claude Code spend | $14.26 |
| Tokens consumed | ~23M |
| Period | 2026-03-15 |
Written with help from Dispatch.
