Auditable political-lean ratings for news outlets. A tiltmeter is an instrument that measures the tilt of the ground — this one measures the tilt of the news.
Commercial bias raters (AllSides, Ad Fontes, Media Bias/Fact Check) sell outlet ratings produced by human panels behind closed doors. You can't check their work. tiltmeter is the opposite bet: ratings computed by open code from open data, where every number can be re-derived, every methodology choice is cited to published research, and every score links to the actual headlines that produced it.
Do not trust us. Check.
tiltmeter watches which stories each of 20 US outlets chooses to cover, via their public politics feeds. Outlets making similar coverage choices land near each other on a map — a seating chart built from the outlets' own behavior, with no one voting on it. Which side of the map is "left" is decided by public records, not opinion: one pole's coverage sits closer to Democratic congressional speech, the other to Republican. Each outlet gets a dated score from −1 to +1 with an honest error range. Plain-language walkthrough: docs/how-it-works.md. Full technical spec with sources: METHODOLOGY.md.
Pre-alpha, pre-validation. The full pipeline runs — collection, scoring,
sensitivity sweeps, custody audits, and the read-only API — and a deployment
recomputes everything on a 6-hour tiltmeter cycle. The first validated
ratings release awaits the pre-declared M3 gate (≥2 weeks of corpus, Spearman
ρ ≥ 0.7 against both incumbent raters). Until then, published numbers carry
explicit unreliability flags and exist to watch the instrument converge.
Nothing here is a usable rating yet.
uv sync # install
uv run tiltmeter ingest # poll all 20 outlet feeds once
uv run tiltmeter status # article counts per outlet
# freeze a corpus window into a verifiable manifest
uv run tiltmeter snapshot --start 2026-07-10 --end 2026-07-24
# fetch the orientation anchor: congressional floor speeches + party records
uv run tiltmeter reference --end 2026-07-09 --days 10
# compute ratings + evidence pages from a manifest
uv run tiltmeter run --manifest releases/manifest-2026-07-10_2026-07-24.json
# serve the computed releases as a read-only JSON API on :8477
uv run tiltmeter serveOr with Docker (the pinned embedding model is baked into the image, so recomputation works offline):
docker compose up -d # API on :8477 + 6-hourly collector
docker compose run --rm api ingest # any pipeline command as one-shottiltmeter is a data layer: it computes and serves ratings JSON plus evidence pages. Visualization is deliberately someone else's job — point your news reader or dashboard at the API.
- Reproducible: same snapshot + same version ⇒ byte-identical ratings. Anyone can verify a release in ≤3 commands.
- Sourced: every methodology decision in METHODOLOGY.md cites the research behind it (literature review).
- Traceable: every score links to an evidence page of real headlines.
- Versioned: methodology changes require a decision record, a CHANGELOG entry, and a version bump. The method cannot move quietly.
- Readable: the plain-language docs are CI-gated to a grade-10 reading level. Jargon must be defined in the glossary.
| Path | What it is |
|---|---|
METHODOLOGY.md |
The product: every design decision, with sources |
docs/how-it-works.md |
The same thing, for humans in a hurry |
docs/research.md |
The literature this stands on |
docs/decisions/ |
Numbered methodology decision records (ADRs) |
config/outlets.yaml |
The 20 outlets and their feeds |
src/tiltmeter/ |
The pipeline (each module states its question in plain language) |
releases/ |
Corpus manifests and ratings, per release |
Code: MIT. Published ratings data: CC-BY-4.0. See NOTICE for development disclosure.