320 tools · 4 endpoints · no key · no account · no rate limit
The JSON API
Four read endpoints, all open, no writes. Every figure below is live as of August 3, 2026.
Four endpoints
| Endpoint | Returns | Why |
|---|---|---|
| /api/tools | tool records | the whole board, with every raw signal — /api/tools |
| /api/tools/{slug} | one record | one tool, its answer sentence and up to 90 nightly captures — /api/tools/spec-kit |
| /api/dead | tool records | everything currently scored dead, most-starred first — 21 today — /api/dead |
| /api/stats | 4 counts | the summary counts and the timestamp of the last nightly refresh — /api/stats |
Responses are cached and revalidated hourly; the underlying verdicts move once a night.
GET/api/tools
the whole board, with every raw signal| Parameter | Accepts |
|---|---|
| verdict | maintained · stale · dead — exact match |
| category | spec-framework · orchestrator · cli-agent · ide-extension · harness |
| q | substring over name, slug, repository, tagline and aliases |
| order | freshness · stars · days_since_push · name (default stars) |
| dir | asc · desc (default desc, nulls always last) |
| limit | integer, default 200, capped at 2000 |
1{2 "count": 320,3 "refreshed_at": "2026-08-03T06:15:20.699+00:00",4 "generated_at": "when this response was built, not when the board was read",5 "tools": [6 {7 "slug": "spec-kit",8 "name": "Spec Kit",9 "repo_full_name": "github/spec-kit",10 "category": "spec-framework",11 "verdict": "maintained",12 "freshness": 100,13 "reasons": [{ "fact": "last commit", "effect": 0, "detail": "Pushed 1 day ago." }],14 "verdict_at": "...",15 "days_since_push": 1,16 "recent_commits": 100,17 "last_release_tag": "v0.15.1",18 "issue_response_hours": 0.8,19 "contributors_90d": 17,20 "bus_factor": 6,21 "archived": false,22 "license": "MIT",23 "stars": 12489524 }25 ]26}
GET/api/tools/{slug}
one tool, its answer sentence and up to 90 nightly captures1{2 "tool": { /* the same shape as above */ },3 "answer": "Yes. Spec Kit is actively maintained — last commit yesterday, freshness 100/100.",4 "history": [5 { "captured_on": "2026-08-03", "verdict": "maintained", "freshness": 100 }6 ]7}
GET/api/dead
everything currently scored dead, most-starred first — 21 today1{2 "count": 21,3 "refreshed_at": "2026-08-03T06:15:20.699+00:00",4 "generated_at": "...",5 "tools": [ /* … */ ]6}
GET/api/stats
the summary counts and the timestamp of the last nightly refresh1{2 "total": 320,3 "maintained": 278,4 "stale": 21,5 "dead": 21,6 "refreshed_at": "2026-08-03T06:15:20.699+00:00"7}
Responses are cached and revalidated hourly; the underlying verdicts change once a night. That is why the list endpoints carry two dates and not one: refreshed_at is when these rows were last read from the GitHub API and is the only one that means freshness, while generated_at is when the response itself was assembled and moves with the cache. Poll on the first and ignore the second. There is also an llms.txt for anything reading the board rather than browsing it.
The only writer is the nightly refresh job. Nothing on this site accepts input, which is also why there is no key to issue.
