Open dataset
Module × series × status × cause. Licence: CC BY 4.0. Please cite the source.
- modules.csv — module × series × status × cause
- devline.csv — the run of 2026-09-10 on Odoo’s development line (before the 20.0 branch existed): raw status, cause, and whose file failed
- devline-20.0.csv — the run of 2026-09-18 on the real 20.0 branch: the same columns, the same frozen set of modules
- In both devline files,
raw_causeis what actually failed;causeis the verdict after attribution, and for almost every row it readsdev_line_regression(the platform, not the module). The published breakdown is byraw_cause; grouping bycauseanswers a different question. - code_metrics.csv — counted from the module tree: lines, tests, migration scripts, models, raw SQL; with the tree sha and the counting rules
- blocking.csv — the full ranking from the blockers page, not only the 30 rows shown there
- stuck.csv — every 18.0 module that does not install on 19.0, one row each, with a
whycolumnwhyis derived from data only, first match wins:disabled_on_next(on the 19.0 branch with installable: False),in_review(an open pull request into 19.0 in the same repository names the module; a title is an intention, not a port),dep_missing(a direct dependency has no installable 19.0 version),repo_idle(no commit on the repository’s 18.0 or 19.0 branch for 180 days),unknown(everything else). We do not label any module as unmaintained: that is a claim about people, and we cannot prove it. Rows with an emptymissing_depsare the unblocked list. - pr-queue.csv — pull requests into 20.0 per repository: open, drafts, merged, opened in the last 24 hours, with the snapshot time
- modules.json — search index
modules.json — the schema
One file, regenerated hourly, fetched with a plain GET. This is not a live query API — there are no query parameters and nothing is computed on request: fetch it once and filter client-side, or diff it against your previous copy to catch new failures. Every module carries one entry per known series, and a series the module is not on is present with status: null — “we looked and it is not there”, which is not the same as a missing key.
{
"schema_version": 2,
"generated_at": "2026-01-01T00:00:00+00:00",
"license": "CC BY 4.0",
"source": "https://allservices.one",
"not_a_live_api": "Static file regenerated hourly; no query parameters. ...",
"series": ["16.0", "17.0", "18.0", "19.0"],
"count": 0,
"modules": [
{
"repo": "example-repo",
"module": "example_module",
"category": "Example/Category",
"author": ["Example Author"],
"license": "AGPL-3",
"maintainers": ["example-maintainer"],
"series": [
{
"version": "16.0",
"status": "ok",
"details": {
"result": "verified",
"message": null,
"module_version": "16.0.1.0.0",
"last_check": "2026-01-01T00:00:00+00:00"
}
},
{ "version": "17.0", "status": null, "details": null }
]
}
]
}status is the published state: one of ok · warn · dep · env · fail · timeout for a run, or pending · not_installable · not_verifiable when there was no run, or null when the module is not on that branch. details.message is a factual line in English — the dataset has one language, the pages have all of ours. schema_version changes when the shape does.