CEREBRO
machine-read, human-curated
CEREBRO is a pipeline, not a person with a bookmark folder. Every morning it reads a few hundred candidates, throws away almost all of them, and writes up what is left.
Nothing on this page is typed by hand — every figure is computed from the corpus at build time.
How a briefing is made
- Collect
Every enabled channel runs concurrently and isolated. One that errors is logged and skipped; it can never take the run down.
- Junk gate
Drops the obviously empty and the mostly-non-English. Deliberately lenient — relevance is the triage model’s job, not this one’s.
- Deduplicate
A canonical-URL hash plus a 63-bit simhash over title and text at a hamming distance of 3, both measured against a rolling 14-day watermark, so near-duplicates across channels collapse to one.
- Pre-rank
A cheap software gate scores term overlap against the interest matrix and keeps the top slice. No model runs here; it exists to shrink the bill.
- Triage
Claude Haiku scores each candidate for relevance with a one-line reason. Anything below the 0.50 bar is dropped. The score and the reason are both published on the signal.
- Extract
Only survivors are fetched and parsed for article text, and only the top slice of them.
- Enrich
Hacker News threads get their discussion summarised into a community take.
- Digest
Claude Sonnet writes the briefing: themed sections, one line per signal, no preamble.
What gets published
The pipeline extracts each article’s text so the digest model can summarise it. That extraction appears on exactly one surface, and a build-time scan fails the build if it ever appears anywhere else.
Signal page · /cerebro/signal/<hash> | full extracted text, source named, link out |
| Briefings, archive, JSON, weekly, feed | ten fields only — never the body |
It is published at all because cerebro-vault is already a public repository. Hiding it here while shipping it on GitHub would have been a pose, not a policy. Every headline points at the original; reading the original is the intended outcome.
What the numbers mean
- Score
- The triage model’s relevance judgement for that item, on the day it was read. Anything under 0.50 never reaches a briefing, so the published range is narrower than the model’s range: across the whole corpus the scores actually published run from 0.50 to 0.95. It is a filter threshold, not a quality grade, and it is not comparable across days.
- Fetched vs in briefing
- Each briefing carries a per-channel ledger. Fetched is how many items that channel returned that morning; in briefing is how many survived the whole funnel. The ratio is the interesting part, and it is usually brutal; see the source ledger. A channel with a zero row still appears: a channel that returned nothing is information too.
- Count, and the quiet days
- A briefing’s count is the number of signals it kept. 8 of the 78 briefings published so far kept nothing at all. Those days are still published, deliberately: a pipeline that only shows you the days it found something is a pipeline you cannot calibrate. Across every briefing, 1,733 signals have been kept.
- Channels
- 12 channels appear in at least one briefing’s ledger, and 11 of them have contributed at least one signal that was kept. Both numbers are counted from the corpus rather than from the configuration, so a channel added tomorrow appears here the morning after its first briefing rather than when someone remembers to edit this page.
- Cost
- Every run meters its own token use and dollar spend and writes them into the briefing’s frontmatter. Those are summed on the cost page. They are the model spend of this pipeline and nothing else.
By the numbers
- Briefings
- 78
- Signals kept
- 1,252
- Channels listed
- 12
- Categories
- 4
- Score range
- 0.50–0.95
- Quiet days
- 8
Run your own
CEREBRO is open source. The interest matrix is a config file, not a model — so pointed at your own sources and your own definition of relevant, it becomes your research pipeline rather than a copy of this one.
| stevengonsalvez/cerebro | the pipeline |
| stevengonsalvez/cerebro-vault | this corpus, as plain markdown |
config/sources.yaml | what it reads |
config/interest-matrix.yaml | what counts as relevant to you |
It runs on a laptop on a timer, writes markdown into an Obsidian vault, and needs no API key — the models are driven through a Claude Code subscription. Adding a source is a config line; adding a kind of source is one Python file.