boardwire-ai

an autonomous ai-news channel that runs itself. boardwire collects what's happening in ai, decides what's actually worth posting through an editorial board of llm personas, writes the post, renders a branded image card, and publishes it — on a schedule, with no human in the loop. roughly 9,600 lines of python, 14 test suites, running on github actions three times a day.

the interesting part isn't that it posts automatically. it's what it refuses to post.

the problem

automated content channels are mostly slop. point a script at an rss feed, summarise each item, publish — and you get a firehose of "company x ships version y" with no judgment. the hard problem in an autonomous news channel isn't generation, it's editorial taste: deciding that 90% of what comes in isn't worth anyone's attention, and only shipping the thing a developer could actually act on this week.

boardwire is built around that filter, not around the generation.

the pipeline

each run moves candidates through a funnel that gets narrower and more expensive at each stage, so cheap heuristics kill the obvious junk before any llm tokens are spent:

  1. collect — pulls from rss, hacker news, and github trending into a common FeedItem model.
  2. cluster — tf-idf + cosine similarity (threshold 0.62) groups the same story arriving from five different sources into one cluster, so the channel never posts the same news twice.
  3. board evaluation — a fast rule-based pre-filter scores items on builder-signal keywords (release, weights, mcp, sdk → high; funding, "could eventually", merge commits → penalised), then an llm board makes the nuanced call.
  4. rerank — a cpu-friendly cross-encoder (ms-marco-MiniLM) reorders survivors against a builder-virality profile.
  5. quality gates — reject generic fallback sentences, boring-release phrasing, near-duplicates.
  6. write + card — generate a ≤280-char post, then render a 1200×1200 black-and-white editorial image card with playwright (no external assets).
  7. publish — pluggable backends, on a cron.

the editorial board

this is the idea i'm proudest of. instead of one prompt deciding "is this good", boardwire runs a panel of five personas, each with one job:

  • scout — would someone actively building an ai product care about this right now?
  • skeptic — kills hype: vague announcements, closed benchmarks, "researchers found ai might someday…", anything with no working artifact.
  • analyst — extracts the one concrete implication: what changed, what can you do with it today, what does it cost or save.
  • editor — writes it. direct, one fact + one builder implication, max 280 chars, no generic hype.
  • ceo — final gate: approves only if a developer, researcher or founder could act on it within the week.

splitting the decision into adversarial roles makes the filter much harder to fool than a single "rate this 1–10" prompt — the skeptic exists specifically to veto what the scout gets excited about.

design decisions i care about

safe defaults, everywhere. the default publisher is dry_run. real posting requires both BOARDWIRE_REAL_PUBLISH_ENABLED=true and an explicit --confirm-real-publish flag. an autonomous system that publishes to the open internet should be impossible to fire by accident, so nothing ships unless you've said so twice.

graceful degradation. every expensive component has a fallback. no llm configured? the reporter still produces an extractive dossier from fetched text. reranker weights won't load? it degrades to a no-op and keeps the original order. the funnel never breaks because an optional model is missing.

the virality z-score trick. boardwire trains a small local model on the engagement its own posts collect — but early on there are too few posts to learn anything (cold start). the fix is to also learn from larger comparable channels. the catch: a big channel gets more likes simply for having more followers, so training on raw counts would just teach "get more followers". instead each account's engagement is converted to a per-account z-score — how well a post did relative to that channel's own baseline — which is exactly the relative signal a ranker needs. our own posts are up-weighted so the model stays anchored on our voice.

newsroom (experimental). an opt-in mode that works like a real agency instead of "one source → one post": a news desk picks story leads from clusters and assigns a beat and angle; a reporter reads the full text of every source, optionally searches the web, and synthesises a structured dossier — facts, checkable claims each tagged with a support level (verified / single_source / unverified / conflicting), numbers, quotes, open questions. a persistent story memory tracks running storylines so developments can be framed as follow-ups. it runs alongside the main pipeline and changes nothing unless explicitly enabled.

what's actually running

it's live, not a demo. github actions runs collection and publishes on a 0 6,12,18 * * * cron; the pipeline has produced and exported real posts and web articles. publishing backends are implemented for bluesky, mastodon, instagram and threads (the meta platforms fetch the card by url because their graph api won't take a binary upload).

honest status

it's an mvp, and i'm calling it one. the virality model is still in its cold-start phase — it needs more of its own engagement history before its ranking signal is trustworthy. the newsroom's fact-check gate and multi-format editor are roadmap, not done. the classical-vs-llm split in the board means cost scales with volume, so the cheap pre-filter doing as much work as possible actually matters. what i'd build next: the fact-check gate on top of the dossier's support levels, and a proper engagement feedback loop once there's enough data to close it.