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-importmeta 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.