I wanted one place that collects news from around the world, so I can pick what interests me the most and, maybe, write about it from my own perspective.

My current setup is 83 RSS feeds: Hacker News, Techmeme, a pile of engineering blogs. Reading them all is impossible, so I built newsops: a small Go CLI plus a set of markdown instructions for an AI agent. The CLI collects and remembers. The agent reads, ranks, researches, and drafts.

The split

At first I just asked the agent to collect the news for me, but that didn’t scale. Each time it would lose its memory and have to figure everything out from scratch: feed parsing, deduplication, and remembering what it had already seen. All of that was wasting tokens, so I built a simple helper, a Go CLI that can fetch, dedupe, and build candidates, and stores everything in SQLite.

The agent does what it does best: it ingests this data, reading titles and excerpts the same way I would, against a context/interests.md file that says what I care about right now. It writes the digest, researches the stories I pick, and drafts a post if I ask for one.

The loop

newsops collect          →  ~40 candidates, deterministic, no LLM
    ↓  agent skims titles + excerpts
digest.md                →  one line per candidate, ranked, with a reason
    ↓  I pick which are worth researching
briefs/<id>-<slug>.md    →  agent reads the article, queries the archive
    ↓  I pick at most one worth writing about
posts/<date>-<slug>.md   →  draft in my voice, LinkedIn or blog
    ↓  I edit and publish by hand

I built skills for the agents, so I don’t need to do anything manually. The agents know which CLI command to use and when.

What a brief looks like

Here’s the shape of one the agent produced for a post arguing you shouldn’t publish Go modules under github.com/...:

  • Core fact. The claim in one paragraph.
  • Primary source. The original URL, plus the Go spec it relies on (go-import meta tags).
  • What coverage skipped. The article ignored the module proxy and checksum database, which change the risk picture in both directions.
  • Prior events. An archive hit: the 1,900 hijacked GitHub accounts story from a few weeks earlier, which is actually the stronger argument.
  • One thing to disagree with. The cost framing. Import paths are a small part of a hosting migration next to CI and permissions.

The stack

Go 1.26, cobra for the CLI, gofeed for parsing, go-readability for excerpts, modernc.org/sqlite so there’s no cgo. About 4,800 lines of Go outside tests. Agent instructions live in harness-neutral markdown under modes/, so moving between Claude Code and other harnesses is a symlink, not a rewrite.

The tool itself was built with oh-my-pi (OMP) driving Qwen3 35B-A3B, a local model running on my own machine. I tested newsops using various Claude Code models as well as some local models.

What’s next

Code is at github.com/piotrowski/newsops.