listindex
An index of open-source mailing lists — for agents, and for the people who maintain the code those lists discuss.
Status: building. The service is deployed and the
archives are being ingested, but no data is served yet. Query endpoints
currently return 503 with a JSON body saying so. This page
documents the interface they will present.
Why this exists
Archives like lore.kernel.org are being hammered by agents that crawl rendered HTML one message at a time, with no caching and no bulk path — hundreds of requests to reconstruct a single thread, repeated independently by every agent. Hosts respond by blocking, and then nobody can read the archives.
listindex is an alternative rather than a fix to those hosts. It mirrors
the archives politely over the git epochs public-inbox already
publishes, extracts the structure once, and serves immutable, edge-cached
answers. It also answers questions no archive can, because it correlates
mail against the git trees: which tree did this patch land in, who
reviewed it, was it backported, and has this been proposed and rejected
before?
Free, and no accounts
No sign-up, no API keys, no rate limit on reads. That is not generosity, it is the architecture: authenticated responses cannot be shared in a cache, so removing auth is what makes serving this cheap enough to give away.
URLs
/t/<message-id> a thread
/m/<message-id> one message
/s/<slug>/v<N> a patch series, one version
/path/drivers/phy/aspeed/ everything posted touching a path
/commit/<sha> the review thread behind a commit
/search?q=...&path=... search
Append .json, or send Accept: application/json,
for machine-readable output.
Existing tooling works unchanged
The lore URL space is mirrored exactly, so every Link:
trailer in every kernel commit resolves here by substituting the host:
/<list>/<message-id>/
/<list>/<message-id>/T/
/<list>/<message-id>/t.mbox.gz
Which means b4 can be pointed here directly:
b4 --midmask 'https://listindex.net/all/%s' am <message-id>
For agents
An MCP endpoint will be served at /mcp. Results are
thread-level and pre-digested rather than raw mail, because the point is to
answer a question in one to three calls — handing back fifty messages
just moves the crawl into your context window.
| Tool | Answers |
|---|---|
search | thread-level hits; filter by path, author, date, provenance |
get_thread | a thread, quoted text stripped, bot mail labelled |
get_series | a series, every version, what changed between them |
find_discussion_of_commit | commit SHA → review thread |
patches_touching | path or symbol → every posting that touched it |
unanswered | patch rot: posted, no human reply, older than N days |
who_reviews | path → who actually reviews there, from evidence |
prior_art | has this been proposed before, and what happened |
Every response carries stable citation URLs, a provenance label so you are
never told that four hundred build-robot reports are "the discussion", and a
complete flag. A timeout returns a partial answer rather than an
error, deliberately: an agent that gets an error retries and doubles the
load, one that gets an answer stops.
If you want all of it, take all of it
Please do not crawl. There is a bulk path, and it is free because object storage egress here costs nothing:
curl -O https://listindex.net/dumps/latest/messages.parquet
git clone https://listindex.net/mirror/<list>/git/0.git
The mirrored git epochs are the same ones public-inbox
publishes, so you can run your own index from them. See
/llms.txt.
Being a good neighbour
Ingest is git fetch against the published epochs — the
mechanism kernel.org supports for mirroring. No HTML is scraped, nothing is
rate-limit-evaded, and the mirrors are re-served from here so that this
service reduces load on lore rather than adding to it.