Self-hosted · local LLM · no cloud
Cruxwire is a personal news dashboard in a single container. A local LLM scores, summarizes, and de-duplicates your feeds, clusters the same story across outlets, and quietly learns what you actually read.
The Home view, a ranked, magazine-style digest.
Why it's different
Most aggregators sort by recency or hand your reading habits to someone else's servers. Cruxwire does the ranking on a model you own, and keeps every byte on your network.
Every article gets a 0–10 relevance score, a one-line summary, and a category from your own Ollama model. Nothing is sent to a third party.
The same story across five outlets is clustered by meaning into one card, with the other coverage collapsed underneath. No more reading the same headline twice.
A per-source affinity multiplier and an embedding-based "taste" boost float up the sources and topics you open, and sink the ones you dismiss. Automatically.
One Docker container, a local volume, and an Ollama endpoint. No build step, no Python dependencies, no external services. Built for a private network.
What it is
Cruxwire fetches your RSS and Atom feeds on a schedule, then a background pipeline scores and summarizes each article, clusters duplicate coverage, and carries unread stories forward so nothing important slips off the bottom of the page while you weren't looking.
The result is a single ranked page that reads like a magazine: a hero story, a "Latest" grid, and an "Earlier this week" rail that stays balanced as you clear it.
Read Later, saved articles with on-demand TL;DRs.
It tunes itself
Cruxwire tracks opens, saves, and dismisses per source and turns them into an affinity multiplier. Sources you engage with get boosted above 1.0×; ones you skip drop toward 0.5×. You can see and override every number in Settings.
Define your own categories with plain-English interest descriptions, those sentences are woven directly into the scoring prompt, so ranking reflects what you actually care about.
| Source | Opens | Saves | Dismisses | Affinity |
|---|---|---|---|---|
Wirefront wirefront.example/feed | 11.1 | 34.4 | 115.8 | 2.00× |
The Relay therelay.example/rss | 7.1 | 15.3 | 93.4 | 0.50× |
Pinegrove pinegrove.example/rss | 0.9 | 1.9 | 77.2 | 0.50× |
Northbound northbound.example/rss.xml | 4.5 | 4.6 | 67.9 | 0.50× |
Settings → Feeds, learned per-source affinity.
Under the hood
Every run fetches, carries unread forward, scores, clusters, retains, and writes a fresh digest, atomically.
Two files, one Ollama endpoint, and docker compose up. Cruxwire seeds a starter feed list and generates your first digest in about a minute.