Reproducible tests for tools journalists use to read documents, work through websites, find sources, and collect public records.
A small, inspectable benchmark harness for comparing tools on real public-source tasks. It records the command, output, score, and failure state—rather than asking readers to trust a leaderboard.
Quick start · Methodology · Latest report · Contributing
Built and maintained by Buried Signals
This repository benchmarks four kinds of tools against public, journalist-relevant tasks:
- PDF extraction — preserve text, structure, and evidence from difficult documents.
- Browser automation — complete multi-step public-record workflows rather than merely load a page.
- Web scraping — retrieve civic and registry pages while retaining the details a reporter needs.
- Search — find useful, source-linked material for a concrete research question.
It also preserves one completed OSINT model benchmark as a fixed July 2026 study. It is not a runnable CI job or a rolling leaderboard: the work depended on controlled access to several model providers and a hand-verified ethics test. Read the final report, inspect its versioned cases, and find the authoritative OSINT tool database on Hugging Face.
Each case declares its public URL or fixture, task, and weighted checks. The runner stores the complete command result in JSON, marks unavailable paid or network tools as skipped, and rejects obvious error pages before scoring. A score is a result on these cases—not a general claim that one tool is universally best.
Requires Python 3.9+; no dependencies are needed for the harness itself.
git clone https://github.com/buriedsignals/benchmarks.git
cd benchmarks
python3 -m benchmarkers.cli list
python3 -m benchmarkers.cli doctor
python3 -m benchmarkers.cli run --category pdf_extraction --tool pdftotext_baseline
python3 -m benchmarkers.cli report
open public/index.htmlNetwork and paid tools are always opt-in:
python3 -m benchmarkers.cli doctor --allow-network --allow-paid
python3 -m benchmarkers.cli run --category scraping --allow-network --allow-paidCopy .env.example to .env to configure an API-backed tool. Never commit keys. See the methodology for the environment variables and cost rules.
The generated report is published at buriedsignals.github.io/benchmarks. GitHub Actions deploys the already-generated public/ directory when main changes; it does not run tools or spend API credits.
Before comparing scores, check:
- the exact cases and probes in
cases/; - the tool command and access requirements in
configs/tools.json; - the run artifact in
results/<timestamp>/results.json; and - whether a row is a pass, failure, timeout, skipped tool, or invalid source.
For a durable report assembled from more than one run, combine artifacts rather than rerunning paid tools:
python3 -m benchmarkers.cli combine \
results/run-a/results.json \
results/run-b/results.json \
--output results/combined-current.json \
--update-latest
python3 -m benchmarkers.cli reportbenchmarkers/ CLI runner and static-report templates
cases/ Public benchmark cases, grouped by category
configs/tools.json Tool commands, requirements, and network/cost gates
scripts/adapters/ Thin adapters that normalise each tool's output
tests/ Regression tests for runner safety and result combining
docs/ Methodology and contributor-facing documentation
results/ Local JSON run artifacts (ignored by Git)
public/ Generated static report, published through GitHub Pages
data/ Versioned inputs for completed, non-runnable studies
- Add a public, stable, task-shaped case in
cases/. - Add a tool entry in
configs/tools.json; setnetworkandpaidtruthfully. - Use a small adapter only when a direct command cannot provide comparable text output.
- Run
doctor, then a focused run with explicit permission for any network or paid work. - Add a regression test when changing runner behaviour, and update the report only from reviewed results.
Do not tune a tool using a case's expected probe values. Do not commit credentials, local binaries, model caches, or paid-run artifacts by default.
Issues and pull requests are welcome, especially for reproducible cases that expose a real reporting task or for corrections to a tool adapter. Please include the source URL, why the task matters, the command used, and any cost or access requirement.
This project depends on public records and open-source infrastructure. Listing does not imply affiliation or endorsement.
| Area | Projects and institutions |
|---|---|
| Browser and scraping | Playwright, Crawl4AI, Scrapy, Scrapling, and Trafilatura |
| Document extraction | Poppler (pdftotext), Docling, Marker, and Surya |
| Public-interest source material | The councils, registries, archives, and public institutions whose pages make these tests possible |
| Publication | GitHub Pages for hosting the static report |
If a project or institution should be credited differently, please open an issue or pull request.