Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"python",
"opendata",
"flask",
"vue",
"vuejs",
"flask-restplus",
"portal"
],
"is_fork": false,
"size_kb": 37032,
"has_wiki": false,
"homepage": "http://udata.readthedocs.org",
"languages": {
"HTML": 20197,
"Shell": 10594,
"Python": 3105349
},
"pushed_at": "2026-07-23T10:51:24Z",
"created_at": "2014-04-25T09:57:34Z",
"owner_type": "Organization",
"updated_at": "2026-07-23T10:51:29Z",
"description": "Customizable and skinnable social platform dedicated to open data.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "AGPL-3.0",
"default_branch": "main",
"license_spdx_raw": "AGPL-3.0",
"primary_language": "Python",
"significant_languages": [
"Python"
]
},
"owner": {
"blog": "https://udata.readthedocs.io/en/stable/",
"name": "Open Data Team",
"type": "Organization",
"login": "opendatateam",
"company": null,
"location": "World",
"followers": 27,
"avatar_url": "https://avatars.githubusercontent.com/u/19330690?v=4",
"created_at": "2016-05-12T16:04:11Z",
"is_verified": null,
"public_repos": 48,
"account_age_days": 3723
},
"license": {
"state": "standard",
"spdx_id": "AGPL-3.0",
"raw_spdx": "AGPL-3.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v17.0.5",
"kind": "patch",
"published_at": "2026-07-22T14:13:24Z"
},
{
"tag": "v17.0.4",
"kind": "patch",
"published_at": "2026-07-06T15:04:52Z"
},
{
"tag": "v17.0.3",
"kind": "patch",
"published_at": "2026-06-29T12:42:21Z"
},
{
"tag": "v17.0.2",
"kind": "patch",
"published_at": "2026-06-23T12:57:14Z"
},
{
"tag": "v17.0.1",
"kind": "patch",
"published_at": "2026-06-10T08:58:16Z"
},
{
"tag": "v17.0.0",
"kind": "major",
"published_at": "2026-06-09T11:25:41Z"
},
{
"tag": "v16.6.1",
"kind": "patch",
"published_at": "2026-06-05T12:29:51Z"
},
{
"tag": "v16.6.0",
"kind": "minor",
"published_at": "2026-06-02T12:32:03Z"
},
{
"tag": "v16.5.0",
"kind": "minor",
"published_at": "2026-05-18T08:34:08Z"
},
{
"tag": "v16.4.0",
"kind": "minor",
"published_at": "2026-05-07T07:58:26Z"
},
{
"tag": "v16.3.0",
"kind": "minor",
"published_at": "2026-04-27T07:56:25Z"
},
{
"tag": "v16.2.0",
"kind": "minor",
"published_at": "2026-04-09T14:40:24Z"
},
{
"tag": "v16.1.0",
"kind": "minor",
"published_at": "2026-04-08T06:42:27Z"
},
{
"tag": "v16.0.0",
"kind": "major",
"published_at": "2026-03-24T14:35:19Z"
},
{
"tag": "v15.4.1",
"kind": "patch",
"published_at": "2026-03-19T15:05:28Z"
},
{
"tag": "v15.4.0",
"kind": "minor",
"published_at": "2026-03-19T11:30:59Z"
},
{
"tag": "v15.3.0",
"kind": "minor",
"published_at": "2026-03-16T10:19:54Z"
},
{
"tag": "v15.2.0",
"kind": "minor",
"published_at": "2026-03-09T14:47:06Z"
},
{
"tag": "v15.1.0",
"kind": "minor",
"published_at": "2026-02-19T16:23:37Z"
},
{
"tag": "v15.0.0",
"kind": "major",
"published_at": "2026-02-12T09:44:13Z"
},
{
"tag": "v14.13.0",
"kind": "minor",
"published_at": "2026-02-10T14:43:25Z"
},
{
"tag": "v14.12.0",
"kind": "minor",
"published_at": "2026-02-10T09:16:55Z"
},
{
"tag": "v14.11.0",
"kind": "minor",
"published_at": "2026-02-09T09:57:14Z"
},
{
"tag": "v14.10.0",
"kind": "minor",
"published_at": "2026-01-29T14:09:18Z"
},
{
"tag": "v14.9.0",
"kind": "minor",
"published_at": "2026-01-27T14:28:25Z"
},
{
"tag": "v14.8.0",
"kind": "minor",
"published_at": "2026-01-22T11:44:04Z"
},
{
"tag": "v14.7.2",
"kind": "patch",
"published_at": "2026-01-15T08:15:39Z"
},
{
"tag": "v14.7.1",
"kind": "patch",
"published_at": "2026-01-13T11:30:25Z"
},
{
"tag": "v14.7.0",
"kind": "minor",
"published_at": "2026-01-13T09:46:33Z"
},
{
"tag": "v14.6.0",
"kind": "minor",
"published_at": "2026-01-06T15:01:43Z"
},
{
"tag": "v14.5.0",
"kind": "minor",
"published_at": "2026-01-05T10:06:13Z"
},
{
"tag": "v14.4.0",
"kind": "minor",
"published_at": "2025-12-16T14:33:02Z"
},
{
"tag": "v14.3.0",
"kind": "minor",
"published_at": "2025-12-04T10:49:07Z"
},
{
"tag": "v14.2.0",
"kind": "minor",
"published_at": "2025-12-02T08:54:46Z"
},
{
"tag": "v14.1.0",
"kind": "minor",
"published_at": "2025-11-25T08:59:09Z"
},
{
"tag": "v14.0.2",
"kind": "patch",
"published_at": "2025-11-19T13:34:10Z"
},
{
"tag": "v14.0.1",
"kind": "patch",
"published_at": "2025-11-19T09:22:35Z"
},
{
"tag": "v14.0.0",
"kind": "major",
"published_at": "2025-11-17T13:30:14Z"
},
{
"tag": "v13.0.0",
"kind": "major",
"published_at": "2025-10-22T12:25:48Z"
},
{
"tag": "v12.0.1",
"kind": "patch",
"published_at": "2025-10-13T14:41:51Z"
},
{
"tag": "v12.0.0",
"kind": "major",
"published_at": "2025-10-13T07:38:02Z"
},
{
"tag": "v11.1.1",
"kind": "patch",
"published_at": "2025-10-02T09:28:38Z"
},
{
"tag": "v7.0.3",
"kind": "patch",
"published_at": "2024-02-16T08:36:45Z"
},
{
"tag": "v7.0.2",
"kind": "patch",
"published_at": "2024-01-23T18:53:36Z"
},
{
"tag": "v2.7.1",
"kind": "patch",
"published_at": "2021-05-27T15:41:21Z"
},
{
"tag": "v2.7.0",
"kind": "minor",
"published_at": "2021-05-25T12:03:15Z"
},
{
"tag": "v2.6.5",
"kind": "patch",
"published_at": "2021-05-19T15:33:55Z"
},
{
"tag": "v2.6.4",
"kind": "patch",
"published_at": "2021-03-24T17:25:37Z"
},
{
"tag": "v2.6.3",
"kind": "patch",
"published_at": "2021-03-23T10:15:24Z"
},
{
"tag": "v2.6.2",
"kind": "patch",
"published_at": "2021-03-22T14:57:19Z"
},
{
"tag": "v2.6.1",
"kind": "patch",
"published_at": "2021-01-26T10:50:45Z"
},
{
"tag": "v2.6.0",
"kind": "minor",
"published_at": "2021-01-25T14:02:55Z"
},
{
"tag": "v2.5.1",
"kind": "patch",
"published_at": "2020-12-31T17:31:29Z"
},
{
"tag": "v2.5.0",
"kind": "minor",
"published_at": "2020-11-30T10:39:55Z"
},
{
"tag": "v2.4.1",
"kind": "patch",
"published_at": "2020-11-09T16:07:46Z"
},
{
"tag": "v2.4.0",
"kind": "minor",
"published_at": "2020-10-16T14:27:59Z"
},
{
"tag": "v2.3.0",
"kind": "minor",
"published_at": "2020-09-29T10:00:51Z"
},
{
"tag": "v2.2.1",
"kind": "patch",
"published_at": "2020-08-25T14:32:13Z"
},
{
"tag": "v2.2.0",
"kind": "minor",
"published_at": "2020-08-05T13:11:58Z"
},
{
"tag": "v2.1.3",
"kind": "patch",
"published_at": "2020-06-29T09:01:28Z"
},
{
"tag": "v2.1.2",
"kind": "patch",
"published_at": "2020-06-17T11:29:40Z"
},
{
"tag": "v2.1.1",
"kind": "patch",
"published_at": "2020-06-16T12:42:08Z"
},
{
"tag": "v2.1.0",
"kind": "minor",
"published_at": "2020-05-12T15:16:18Z"
},
{
"tag": "v2.0.4",
"kind": "patch",
"published_at": "2020-05-04T16:03:08Z"
},
{
"tag": "v2.0.3",
"kind": "patch",
"published_at": "2020-04-30T13:44:25Z"
},
{
"tag": "v2.0.2",
"kind": "patch",
"published_at": "2020-04-07T19:03:32Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2020-03-24T16:27:41Z"
},
{
"tag": "v2.0.0",
"kind": "major",
"published_at": "2020-03-11T14:47:06Z"
},
{
"tag": "v1.6.20",
"kind": "patch",
"published_at": "2020-01-21T09:51:58Z"
},
{
"tag": "v1.6.19",
"kind": "patch",
"published_at": "2020-01-06T14:04:39Z"
},
{
"tag": "v1.6.18",
"kind": "patch",
"published_at": "2019-12-13T15:17:06Z"
},
{
"tag": "v1.6.17",
"kind": "patch",
"published_at": "2019-10-28T14:44:40Z"
},
{
"tag": "v1.6.16",
"kind": "patch",
"published_at": "2019-10-22T12:50:24Z"
},
{
"tag": "v1.6.15",
"kind": "patch",
"published_at": "2019-09-11T13:16:29Z"
},
{
"tag": "v1.6.14",
"kind": "patch",
"published_at": "2019-08-14T08:15:36Z"
},
{
"tag": "v1.6.13",
"kind": "patch",
"published_at": "2019-07-11T16:57:04Z"
},
{
"tag": "v1.6.12",
"kind": "patch",
"published_at": "2019-06-26T15:08:00Z"
},
{
"tag": "v1.6.11",
"kind": "patch",
"published_at": "2019-05-29T10:00:10Z"
},
{
"tag": "v1.6.10",
"kind": "patch",
"published_at": "2019-05-23T14:38:16Z"
},
{
"tag": "v1.6.9",
"kind": "patch",
"published_at": "2019-05-20T15:20:34Z"
},
{
"tag": "v1.6.8",
"kind": "patch",
"published_at": "2019-05-13T13:20:33Z"
},
{
"tag": "v1.6.7",
"kind": "patch",
"published_at": "2019-05-10T14:16:49Z"
},
{
"tag": "v1.6.6",
"kind": "patch",
"published_at": "2019-03-27T16:43:10Z"
},
{
"tag": "v1.6.5",
"kind": "patch",
"published_at": "2019-02-27T10:52:26Z"
},
{
"tag": "v1.6.4",
"kind": "patch",
"published_at": "2019-02-02T13:35:59Z"
},
{
"tag": "v1.6.3",
"kind": "patch",
"published_at": "2019-02-01T16:24:19Z"
},
{
"tag": "v1.6.2",
"kind": "patch",
"published_at": "2018-11-05T17:38:14Z"
},
{
"tag": "v1.6.1",
"kind": "patch",
"published_at": "2018-10-11T16:32:59Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2018-10-02T14:26:58Z"
},
{
"tag": "v1.5.3",
"kind": "patch",
"published_at": "2018-08-27T10:29:51Z"
},
{
"tag": "v1.5.2",
"kind": "patch",
"published_at": "2018-08-08T09:08:51Z"
},
{
"tag": "v1.5.1",
"kind": "patch",
"published_at": "2018-08-03T15:31:59Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2018-07-30T14:35:23Z"
},
{
"tag": "v1.4.1",
"kind": "patch",
"published_at": "2018-06-15T10:38:16Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2018-06-06T11:18:05Z"
},
{
"tag": "v1.3.12",
"kind": "patch",
"published_at": "2018-05-31T08:21:52Z"
},
{
"tag": "v1.3.11",
"kind": "patch",
"published_at": "2018-05-29T07:00:58Z"
},
{
"tag": "v1.3.10",
"kind": "patch",
"published_at": "2018-05-11T09:50:36Z"
},
{
"tag": "v1.3.9",
"kind": "patch",
"published_at": "2018-05-07T17:53:56Z"
},
{
"tag": "v1.3.8",
"kind": "patch",
"published_at": "2018-04-25T10:22:46Z"
}
],
"recent_commits": [
{
"oid": "e86ab6a74129945125fbb90d91e079c1ae550960",
"body": "Prevents Elasticsearch from going read-only when disk space is low.",
"is_bot": false,
"headline": "chore(docker): disable elasticsearch disk threshold (#3861)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-07-23T10:51:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "06e774413269cc35a5194e9447de90915594b4da",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.5",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-07-22T14:13:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c447840dc543f8a43956a66eb74911938abdd55f",
"body": "Needed for https://github.com/ecolabdata/ecospheres/issues/1130.\n\nChanges:\n- Expose missing `harvest` information in dataset and dataservices\ncatalog exports.\n- Add `harvest.modified_at` to dataservices, for symmetry with dataset\nharvest info.\n- Reorganize fields to facilitate comparison between the\ndatasets/dataservices harvest structures.",
"is_bot": false,
"headline": "feat(harvest,catalog): sync dataset/dataservice harvest info (#3864)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-07-21T18:02:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9f1995ffd13180ddf9b0225337bc2b11f5ea533",
"body": "…h (#3783)\n\nOpenAPI documents (up to 1.5 MB for API Entreprise) were truncated at\n100 KB before reaching ES, hiding terms like \"transfert de siège\" that\nlive deep in the spec. Worse, all ~30 fiches sharing a bouquet swagger\ngot the same indexed text, so a hit on any term matched every fiche.\n\nfix https://github.com/datagouv/data.gouv.fr/issues/1905",
"is_bot": false,
"headline": "fix(dataservices): parse swagger and scope to bouquet fiche for searc…",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-07-13T09:48:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "79a7baeb845915e77e8e9b558321f4d08d951631",
"body": "Add a 'reuses' metric to the Dataservice model, computed from the reuses\nthat reference it via their 'dataservices' field, mirroring the existing\nDataset.count_reuses pattern.\n\nA signal handler recomputes the metric whenever a reuse is created,\nupdated or deleted, so the count stays in sync. Without this the\ndataservice reuses tab always displayed 'Réutilisations (0)'.\n\nrelated https://github.com/datagouv/cdata/pull/1120",
"is_bot": false,
"headline": "feat(dataservices): compute reuses metric (#3816)",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-07-08T07:01:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62b9bfb55e4758caee5693ade26f9bb3f6b7bded",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.4",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-07-06T15:04:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "80c4069e7b14878e11cb42d8ce55176696a3252a",
"body": null,
"is_bot": false,
"headline": "fix: removing logo on description update (#3859)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-07-06T15:04:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dd09c364d205748f870baa1f14c71225ffce47f",
"body": "This PR contains the following updates:\n\n| Update | Change |\n|---|---|\n| lockFileMaintenance | All locks refreshed |\n\n🔧 This Pull Request updates lock files to use the latest dependency\nversions.\n\n---\n\n### Configuration\n\n📅 **Schedule**: (UTC)\n\n- Branch creation\n - Between 12:00 AM and 03:59 AM, onl\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4yNDIuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI0Mi4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3850)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-07-06T07:18:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "58066af6ac945f505e15de6a3006c46aeec43b2d",
"body": "Accept WebP as image format for upload resource, since we accept many\nothers. WebP is a widely supported web image standard that is\nincreasingly used.\n\nSee also https://github.com/datagouv/cdata/pull/1160",
"is_bot": false,
"headline": "feat: accept webp as image format (#3855)",
"author_name": "Adrien Carpentier",
"author_login": "bolinocroustibat",
"committed_at": "2026-07-02T08:32:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44679f43500f7d9bf1ff2ad4d0099c847666c889",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.3",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-29T12:42:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ad9da2263dbe99348f45dac2c91410bbc45219f",
"body": "Part of https://github.com/datagouv/data.gouv.fr/issues/1971\n\n## Contexte\n\nBranche `org_edito_blocs`. La PR ajoute un champ `blocs` au modèle\n`Organization` :\n```python\n# udata/core/organization/models.py\nfrom udata.core.edito_blocs.models import Bloc\n\n@generate_fields(read_mask_exclude=[\"blocs\"])\nc\n[…]\nmodels`\n(registre incomplet) →\n `RuntimeError` (logique non triviale → test unitaire justifié).\n- Non-régression swagger : comparer `/api/1/swagger.json` avant/après\nsur Dataset, Organization, Reuse.",
"is_bot": false,
"headline": "feat: org edito blocs (#3780)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-29T12:12:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "92c2b494e3150f0005b84ae3f1ae6aa4b01bb9aa",
"body": "Fix https://errors.data.gouv.fr/organizations/sentry/issues/295623/",
"is_bot": false,
"headline": "fix: paginations with negative page and page_size (#3847)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-29T11:35:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "346989d1335736fe025ed57b2dbe5154bdb432f3",
"body": null,
"is_bot": false,
"headline": "feat: add parsing_table for tabular detection (#3845)",
"author_name": "Nicolas KEMPF",
"author_login": "nicolaskempf57",
"committed_at": "2026-06-25T09:42:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb49b7c6fdc8716629643e9985b46294d6d55b66",
"body": "- fix https://github.com/datagouv/data.gouv.fr/issues/2044",
"is_bot": false,
"headline": "fix: wiping metrics on metric-api failures (#3846)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-25T09:08:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "756ca8bbd07cdc64a955a4953bb01f619fbbeb76",
"body": null,
"is_bot": false,
"headline": "feat: remove tmp file upload (#3828)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-24T08:40:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af54acb73bf101caab7b2d88c7a7566627a2a495",
"body": "See [resulting\nexport](https://www.data.gouv.fr/datasets/jeu-de-donnees-de-test-dexploration?resource_id=7e962d64-c8b7-4748-ae8f-e0a07c9c6429)\n(231Mo uncompressed vs 221Mo previously)",
"is_bot": false,
"headline": " feat(catalog): add spatial geom in dataset catalog (#3842)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-23T14:13:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3dc8e33a421e8c091368b2a2b97404e8fa543792",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.2",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-23T12:57:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc5b3f026827ba1e65ae3e43bb845964626729bc",
"body": "We revert to lowercase `apiso:title` and\n`apiso:identifier` that match the standard.\nWe keep the `gmd` namespace addition that is compliant.",
"is_bot": false,
"headline": "chore(harvest): partially revert csw xml update (#3843)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-23T12:38:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9178746895f4b1d34d6cd78dde1562a670c7b407",
"body": null,
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3829)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-06-23T09:08:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ad46c269e18f42c6f7bbd79c022cc475276ed13",
"body": null,
"is_bot": false,
"headline": "test: improve ElasticSearch tests stability (#3841)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-23T08:04:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5eda350886e109b6a657b781341b2c097382c6d2",
"body": "I have set `UV_PUBLISH_TOKEN` in CI context",
"is_bot": false,
"headline": "chore(CI): use recommended UV_PUBLISH_TOKEN (#3840)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-22T08:42:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "955ee703cbfcea35035578f198b1b062d74bcabb",
"body": "Close https://github.com/datagouv/data.gouv.fr/issues/2007",
"is_bot": false,
"headline": "feat: add API v2 for reuses listing (#3800)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-22T07:55:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "237520806c810c26ad9350a64338b56ed0304414",
"body": "Part of https://github.com/datagouv/data.gouv.fr/issues/2020",
"is_bot": false,
"headline": "feat: add file to charts (#3809)",
"author_name": "Nicolas KEMPF",
"author_login": "nicolaskempf57",
"committed_at": "2026-06-22T06:59:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64c7d1820a3bf6603dfaed70b39963ac0457b477",
"body": "Fix slow dataset listing when filtering by reuse/dataservice\n\nFiltering datasets by `reuse` or `dataservice` (e.g.\n`/api/2/datasets/?reuse=<id>`) dereferenced the whole `reuse.datasets` /\n`dataservice.datasets` list, loading every referenced Dataset with its\nfull embedded `resources` array just to r\n[…]\nced datasets' size.\nAdded regression tests asserting the filter issues a single DB query (no\ndereference) via `query_counter`.\n\nShould fix this slow page https://www.data.gouv.fr/reuses/api-rncp-et-rs",
"is_bot": false,
"headline": "fix(perfs): filter datasets by reuse or dataservice (#3822)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-18T07:49:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5f0d88320a5cde0379d89b26cf26a616fd564d2d",
"body": "Part of https://github.com/datagouv/data.gouv.fr/issues/2036\n\n### Problem\n\n`GET /api/2/datasets/<id>/resources/` loads the **entire** dataset\ndocument — all its resources — on every request, then filters (`type`,\n`q`) and slices in Python, just to return one page. The cost scales with\nthe *total* re\n[…]\naviour is unchanged: same `type` / `q` (case-insensitive substring)\nfiltering, same pagination links. `q` is now matched via `$regexMatch`\nwith `re.escape`, preserving the literal-substring semantics.",
"is_bot": false,
"headline": "fix(perfs): paginate ressources MongoDB side instead of Python (#3823)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-18T07:38:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b959ae7a0d4d227e543f2398781cc3b2e078d645",
"body": null,
"is_bot": false,
"headline": "fix: protect hosted resource checksum (#3834)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-18T06:45:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56699d0cf69099d5d9ed3d4b4fccb49a6b332a4c",
"body": ":warning: Stacked PR over\nhttps://github.com/opendatateam/udata/pull/3835, will need to be rebased\nonce parent is merged.\n\nOptimizes `udata harvest clean` by only recomputing metrics at the end\nof the cleanup.\n\nBefore/after on a local 700-dataset source: 1432s -> 15s.\n\n---------\n\nCo-authored-by: Thibaud Dauce <git@hadibut.fr>",
"is_bot": false,
"headline": "perf: optimize harvest clean command (#3836)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-06-17T09:29:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55e482e4b456a28704cf55f86629207e38f99813",
"body": "Fix CSW request to [PyCSW](https://pycsw.org/) instances, ie `udata dcat\nparse-url --iso https://meta.atmosud.org`",
"is_bot": false,
"headline": "chore(harvest): improve CSW request XML compliance (#3837)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-17T08:18:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c752d6f43e1128a6acda7b7baca0b7f243c3a49d",
"body": null,
"is_bot": false,
"headline": "refactor: add missing signal kwargs (#3835)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-06-17T07:54:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "441f37688e7dc372709f3a24987555821d99a7f4",
"body": "Fix https://github.com/ecolabdata/ecospheres/issues/1075",
"is_bot": false,
"headline": "feat(harvest): harvest spatial resolution (#3773)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-06-15T15:56:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0bff0002bf9cc46abba11687e405f37ade8ada6c",
"body": null,
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3820)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-06-12T12:30:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "22f3379a45cd6f8e3898832d3a247572a2fde79f",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.1",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-10T08:58:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10ffe3f51f36ff1f43b8392faf48e22ba064cca4",
"body": null,
"is_bot": false,
"headline": "feat: improve backfill harvest migration (#3826)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-10T08:26:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "66d3d33fb4f2ea75b5f65f27240c6365cf438bc9",
"body": null,
"is_bot": false,
"headline": "Bump version 17.0.0",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-09T11:25:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dea406c59263e6aa5857efa61f4ea858aa1acaed",
"body": "Part of https://github.com/datagouv/data.gouv.fr/issues/1974\n\nFollowing a report from @estellebertrand, we use `7.17.24` in\nproduction. We could revert this change when deploying the `8.19.13` in\nproduction. And then 9.3.2 ?\n\n- [x] Revert the ElasticSearch SDK to 7.17.28 to match the production\n- [x\n[…]\nto ES 8\nwithout auth.\n\nWhen migrating the server to ES 8 in production:\n1. Deploy ES 8 with security disabled\n2. Upgrade the SDK to 8.x with auth support configured\n3. Re-enable security on the server",
"is_bot": false,
"headline": "feat: prepare ElasticSearch 8 (#3714)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-09T09:54:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "27f48f2554f5ad41207478533eec3ab0621a05d9",
"body": "- Require https://github.com/datagouv/cdata/pull/1074\n\n## Summary\n\n- Migrate harvest API models to the model-driven `@generate_fields`\nsystem (replaces manual flask-restx models for `HarvestError`,\n`HarvestLog`, `HarvestItem`, `HarvestSourceValidation`, `HarvestJob`,\n`HarvestSource`)\n- Replace `Harv\n[…]\npermission` and a redundant\n`# Details are reserved to super-admins` comment\n\n---------\n\nCo-authored-by: Nicolas KEMPF <nicolas@conciergerie.dev>\nCo-authored-by: maudetes <estelle.maudet@data.gouv.fr>",
"is_bot": false,
"headline": "feat: harvest API refactor (#3759)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-09T08:32:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c215ad2945ec5d14a3ca7c0d9ec7a848d74ce53",
"body": "Fix https://github.com/ecolabdata/ecospheres/issues/1126\n\nAdds `Topic.elements[].(title|description|tags)` to the Topic ES index\n(like it's done in Mongo + tags).",
"is_bot": false,
"headline": "feat(search): index Topic.elements (#3811)",
"author_name": "Alexandre Bulté",
"author_login": "abulte",
"committed_at": "2026-06-08T13:46:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe75597d2bb6c39ef11cf9158a4d43426105eed8",
"body": "Currently, only reports about discussions and messages have an URL link\ndue to `spam_report_message` override.\n\nAdds a link to `self_web_url` if defined.",
"is_bot": false,
"headline": "feat(spam): add web url in message report (#3821)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-08T13:44:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6fbb477bd58334a211365d70300c0cab1055b949",
"body": null,
"is_bot": false,
"headline": "Bump version 16.6.1",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-05T12:29:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58c4d227c85909594edc78822cc378dcc33fbf0e",
"body": "Reverts opendatateam/udata#3802\n\nWe have in issue with harvest previews in uwsgi context with saxonche\n(ie [try preview this\nharvester](https://demo.data.gouv.fr/admin/harvesters/696e15daf47c74a7c3d5aea2/)):\n```\ngraal_create_isolate error\nFatal error: Failed to enter the specified IsolateThread context. (code 2)\n```\n\nWe don't encounter any error in the celery worker or with a python\ninterpreter, only in the uwsgi context.",
"is_bot": false,
"headline": "fix(deps): downgrade saxonche to v12 (#3817)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-05T12:12:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b747746cb9bd9a27adafbac0b269d8670aa2a139",
"body": "Temporary fix for\nhttps://errors.data.gouv.fr/organizations/sentry/issues/293834/.\n\nReverts https://github.com/opendatateam/udata/pull/3745/.\n\nWe're running an investigation to submit an upstream fix on\nFlask-Security.",
"is_bot": false,
"headline": "chore(deps): temporary bcrypt downgrade (#3814)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-05T09:08:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7122ae5013303113cd9d714fb673228a0b141056",
"body": "…3810)\n\nFix https://errors.data.gouv.fr/organizations/sentry/issues/293060/\n\n```\nDecodeError udata.tags in normalize\n'<' not supported between instances of 'int' and 'LocalProxy'\n```\n\nWe can't use `TAG_MIN_LENGTH` LocalProxy in celery unpickling.\nWe shouldn't run validation in `clean`, since it is \n[…]\nxts.\n\nPartially reverts https://github.com/opendatateam/udata/pull/3782 by\nmoving tag validation in harvest logic.\n\n---------\n\nCo-authored-by: Thibaud Ollagnier <ThibaudDauce@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(tags): move validation in harvest logic to fix tags unpickling (#…",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-04T12:41:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d79e8782cc79dbbb68f458173a7f0651b6e78cba",
"body": "- Replace https://github.com/opendatateam/udata/pull/3072\n- Fix https://github.com/ecolabdata/ecospheres/issues/263\n- Require https://github.com/datagouv/cdata/pull/1110",
"is_bot": false,
"headline": "feat: allow external URL and name for discussions (#3765)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-04T07:01:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c2ac4af89aefd6699aa8009bd109e70fe9a96f2",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [faker](https://redirect.github.com/joke2k/faker)\n([changelog](https://redirect.github.com/joke2k/f\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4yMDYuMSIsInVwZGF0ZWRJblZlciI6IjQzLjIwOS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): update dependency faker to >=40.21, <40.22 (#3806)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-06-04T07:01:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e452ad4528abddec28efe8d6f759e9d9311f0951",
"body": "A few additional tests missing from\nhttps://github.com/opendatateam/udata/pull/3812 (new files not staged…)",
"is_bot": false,
"headline": "test: add missing tests (#3813)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-03T11:57:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "783516d6be7ebfecf4957fe1fc2d838ef04eb4ab",
"body": "Fix https://errors.data.gouv.fr/organizations/sentry/issues/293899\n\nAnd broken page in\nhttps://www.data.gouv.fr/posts/jeux-de-donnees-liees-aux-elections-municipales\n\n- [x] fix missing accordion refs in purge\n- [x] add a auto cleanup in marshalling to prevent 500 on page if purge\nfail in some way",
"is_bot": false,
"headline": "fix: dataset deleted in accordion (#3812)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-03T06:58:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e98274c83d03a2ed4393921ce2b5282adcdc4bf1",
"body": "Part of https://github.com/opendatateam/udata/issues/3793",
"is_bot": false,
"headline": "feat(harvest): add resource harvest timestamp (#3805)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-06-02T17:01:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4f7b0f1899a6c019700d7c168141f9ea9166d39",
"body": null,
"is_bot": false,
"headline": "Bump version 16.6.0",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-02T12:28:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b84d1aa0bc1a90084b55f3a949bd72a8255349be",
"body": "- [x] add missing `body` text (I have witness \"_\" in Android\nnotifications a few times)\n- [x] delay posting to tchap in queue (we do not need this to by sync,\nit slows down the dataset creation and a problem with Matrix crash the\nHTTP POST)\n- [x] `TCHAP_ROOM_URL` is replaced by `TCHAP_ROOM_ID` and we need to\nprovide the `TCHAP_HOMESERVER` to construct the full URL",
"is_bot": false,
"headline": "fix: tchap problems on spam (#3807)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-06-02T08:59:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f28e5d8ef6e812b3200d653fe5912387f4b1b44",
"body": null,
"is_bot": true,
"headline": "fix(deps): update dependency saxonche to v13 (#3802)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-06-01T10:22:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7dad5fa74a15f8df7636df46349164941035517d",
"body": null,
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3803)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-06-01T08:09:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1b376f0a628ffcdde350bcfdb4de2c91b0bb69c1",
"body": "They are now the same packages, however it is recommended to use\nflask-security.\n\nSee [getting started\ndocumentation](https://flask-security-too.readthedocs.io/en/stable/installation.html)\nas well as [the pypi project\nnote](https://pypi.org/project/Flask-Security-Too/#description).",
"is_bot": false,
"headline": "chore: use flask-security instead of flask-security-too (#3801)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-06-01T06:32:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0aed265f6762616bad6c28962a409c5b41475f81",
"body": "Fix https://github.com/opendatateam/udata/issues/3767",
"is_bot": false,
"headline": "feat(harvest): harvest DCAT DatasetSeries as udata Dataset (#3797)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-29T15:36:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f758f3da6373ac08290a4025d76c49ddfa3d424",
"body": "Close https://github.com/datagouv/data.gouv.fr/issues/1674\n\nWe are building the 2FA custom requirement based on\nhttps://github.com/pallets-eco/flask-security/pull/1170.",
"is_bot": false,
"headline": "Add 2FA requirement for sysadmin (#3642)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-05-29T14:50:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41d3cb01fb98249925ef0020de78b9fb04b6f460",
"body": null,
"is_bot": false,
"headline": "fix: lint rdf file (#3798)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-28T06:57:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "910f06394616ee4d28b0d6e7930bc61b5ea1ea61",
"body": "Fix https://github.com/opendatateam/udata/issues/3789\n\n---------\n\nCo-authored-by: Thibaud Ollagnier <ThibaudDauce@users.noreply.github.com>",
"is_bot": false,
"headline": "feat(harvest): support dct:spatial geoJSONLiteral datatype (#3790)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-28T06:55:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "28942002a5a591ad25757f7554d94695f84bbd92",
"body": "Alternative to https://github.com/opendatateam/udata/pull/3751\n\nAdd automatic version update using tag-version.sh script",
"is_bot": false,
"headline": "chore: update publiccode (#3785)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-05-27T12:20:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "548a64011717b47cf53d2dc397dc6532a7fbc0b9",
"body": "Fix https://errors.data.gouv.fr/organizations/sentry/issues/292144 by\ncreating a local `ObjectId` in preview",
"is_bot": false,
"headline": "fix: harvest previews bugs (#3779)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-26T15:52:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b25da0709f4d49ff60fb1de6c813b371054a1708",
"body": null,
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3788)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-26T12:57:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91f344f1ecc857293efc5ed0db059e67d6ba0d4a",
"body": "## Harden CORS and session cookie configuration\n\nFix https://github.com/datagouv/data.gouv.fr/issues/2017\n\n### Context\n\nThe CORS layer reflected **any** request `Origin` back in\n`Access-Control-Allow-Origin` while also sending\n`Access-Control-Allow-Credentials: true`. Combined with the API\naccepting\n[…]\nit Bearer token instead of the session cookie for\nwrite operations would be a stronger model but is an architectural\nchange that would break cdata's cookie-based auth — left for a separate\ndiscussion.",
"is_bot": false,
"headline": "feat: improve cors (#3781)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-26T09:01:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "346227bcb45dd7659b2a691315f65731ecdb800e",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [faker](https://redirect.github.com/joke2k/faker)\n([changelog](https://redirect.github.com/joke2k/f\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4xOTQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE5NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): update dependency faker to >=40.19, <40.20 (#3786)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-26T06:31:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee2dbc9a5522f2df309c3e682131fee12593c131",
"body": null,
"is_bot": true,
"headline": "fix(deps): update dependency bcrypt to v5 (#3745)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-21T15:22:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7747bcfdcc948bf2201af5a96e00a1d65e0fed3d",
"body": null,
"is_bot": true,
"headline": "chore(deps): lock file maintenance (#3772)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-21T13:48:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5138653b450a8f2bada7f6c2591019ace33e4438",
"body": "… input (#3782)\n\n## What\n\nA single dcat:keyword that's empty, punctuation-only, too short, or too\nlong\n crashes the whole document save during harvest:\n\nValidationError (Dataset:None) (Tag \"df\" must be between 3 and 96\ncharacters\n long.: ['tags'])\n\nThe harvest aborts the record, losing the dataset\n[…]\n The Mongo-level error\nbecomes a true\nbackstop that shouldn't fire in normal use — which is what it always\nseemed to\n have been intended as.\n\n---------\n\nCo-authored-by: Thibaud Dauce <git@hadibut.fr>",
"is_bot": false,
"headline": "fix(harvest): normalize tag values in TagListField to match harvester…",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-05-21T07:57:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6b4f02b124beb3324cdd5cdd2484699a1d4ee2d7",
"body": null,
"is_bot": false,
"headline": "Enhance/doc (#3778)",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-05-20T06:45:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "73462ab93246ca40d7c3d0fb01f8325825c4ffa0",
"body": "Misc CLI improvements, commit-per-commit",
"is_bot": false,
"headline": "Fix/cli (#3776)",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-05-19T09:36:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3a73c0112c4e66a103d7860a58e25e86e9c5f71",
"body": "The `udata harvest delete` CLI command was unusable: it declared an\n`identifier` positional parameter but lacked the corresponding\n`@click.argument('identifier')` decorator. Running it raised:\n\nTypeError: delete() missing 1 required positional argument: 'identifier'\n\nwhile passing an identifier produced:\n\n Error: Got unexpected extra argument (<slug>)\n\nAdd the missing decorator to match the pattern used by sibling commands\n(`launch`, `run`, `validate`).",
"is_bot": false,
"headline": "fix(harvest): add missing click argument to delete command (#3774)",
"author_name": "Samuel-Zacharie FAURE",
"author_login": "Samuelfaure",
"committed_at": "2026-05-19T08:41:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a3bbe65edb7f4192c4f5f677c2b1a22263f9d34",
"body": "Fix https://github.com/ecolabdata/ecospheres/issues/1017\n\n<img width=\"600\"\nsrc=\"https://github.com/user-attachments/assets/b23c3a56-fa43-41ea-9aec-5a69cd53ee8a\"\n/>",
"is_bot": false,
"headline": "feat(harvest): report conflicting record ownership (#3771)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-19T06:50:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f5d31b375430a0326428aec13301ac0e4688ece",
"body": "Fix https://github.com/opendatateam/udata/issues/3737\n\n<img width=\"800\"\nsrc=\"https://github.com/user-attachments/assets/81e3fa6c-1545-4e92-878f-eedd94dadd70\"\n/>\n\n<img width=\"500\"\nsrc=\"https://github.com/user-attachments/assets/497568e1-9ea6-45ee-aa95-e1243fba8c7b\"\n/>\n\nMakes for a huge error message but at least we capture all the\ninformation available to help trace the problem back to the source.\nOtherwise we get none (first screenshot).",
"is_bot": false,
"headline": "fix(harvest): csw-dcat harvester fails on a record parsing error (#3770)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-19T06:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d0307aea63f4270e597563d3d43bd7ce6cfbea5",
"body": null,
"is_bot": false,
"headline": "Bump version 16.5.0",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-18T08:34:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ab8570004a4da41c88de9918560f87ad67b47bf",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [faker](https://redirect.github.com/joke2k/faker)\n([changelog](https://redirect.github.com/joke2k/f\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4xNzkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjE3OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): update dependency faker to >=40.18, <40.19 (#3769)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-18T07:52:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c522dd740c3ed438ad3a83805fd158edf3bacc64",
"body": "Broke in https://github.com/opendatateam/udata/pull/3710",
"is_bot": false,
"headline": "fix: missing last_login_at in org members response (#3766)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-13T07:37:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f79e07b03c6fce77c8965c01275ce660ab2680ad",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [invoke](https://redirect.github.com/pyinvoke/invoke)\n([changelog](https://www.pyinvoke.org/changel\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4xMzkuNyIsInVwZGF0ZWRJblZlciI6IjQzLjEzOS43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): update dependency invoke to v3 (#3744)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-12T06:41:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ebaeabf708a635095d7b80e7553658fe3ee488b0",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n| [faker](https://redirect.github.com/joke2k/faker)\n([changelog](https://redirect.github.com/joke2k/f\n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4xMzkuNyIsInVwZGF0ZWRJblZlciI6IjQzLjEzOS43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): update dependency faker to v40 (#3742)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-12T06:40:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1c3e87e3938264dc61f04197a7aa8dad3d00caa8",
"body": "This PR contains the following updates:\n\n| Package | Change |\n[Age](https://docs.renovatebot.com/merge-confidence/) |\n[Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n|\n[importlib-resources](https://redirect.github.com/python/importlib_resources)\n| `>=6.5.2,<7.0.0` → \n[…]\neyJjcmVhdGVkSW5WZXIiOiI0My4xMzkuNyIsInVwZGF0ZWRJblZlciI6IjQzLjEzOS43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->\n\nCo-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "fix(deps): update dependency importlib-resources to v7 (#3747)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-05-12T06:40:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3c1066a5e820f78b41cbb107efb076b9366ffdd3",
"body": null,
"is_bot": false,
"headline": "feat: upgrade dependencies",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-11T10:53:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ddd7885ed36abfcbb68b805c5d8c80ba81b072c7",
"body": "…ur datasets (#3763)\n\nCloses https://github.com/datagouv/data.gouv.fr/issues/1930",
"is_bot": false,
"headline": "feat: send notifications for a new reuse and dataservice on one of yo…",
"author_name": "Nicolas KEMPF",
"author_login": "nicolaskempf57",
"committed_at": "2026-05-11T07:05:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95abdbc188cfdbf70d57f299e2e2a8b1c4ba4671",
"body": null,
"is_bot": false,
"headline": "Bump version 16.4.0",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-07T07:58:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a4e93a96dbc5fb306d13e812065438858d9f2336",
"body": null,
"is_bot": false,
"headline": "feat: ask user password rotation via API (#3762)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-07T07:32:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "adf0b8554b79c930cd11788ab9e11dfd5d234395",
"body": "Fix https://github.com/opendatateam/udata/issues/3760",
"is_bot": false,
"headline": "feat: use volumes for all services (#3761)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-07T06:58:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b42a9aca53d3cd745d6698d1c7d30fd178e0c33f",
"body": "Fix https://github.com/opendatateam/udata/issues/3757\n\nLocally tested with\nhttps://demo.data.gouv.fr/admin/harvesters/58b68fdcc751df10ea84f9cc/configuration\n=> no more error.\n\nNote: Most items are now ignored because of missing identifiers. This is\na separate, known problem, to be fixed at the source catalog level.",
"is_bot": false,
"headline": "fix(harvest): csw-* harvesters fail on some XML comments (#3758)",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-06T09:57:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "404227ea8d1e67e5c69c379cb9be6571d9bcce34",
"body": null,
"is_bot": false,
"headline": "fix: membership api with user=None (#3754)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-06T06:40:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2804826b03754ce39a6fd1b3206c6bcb76d1252c",
"body": "…eachother (#3752)\n\nFix https://github.com/ecolabdata/ecospheres/issues/862\n\nWe now use URL+title to retrieve OGC services (WFS/WMS/WMTS)\ndistributions.\nOther types of distributions are still retrieved by URL only.\n\n---------\n\nCo-authored-by: Thibaud Ollagnier <ThibaudDauce@users.noreply.github.com>",
"is_bot": false,
"headline": "fix(harvest): distributions of separate WFS/WMS/WMTS layers override …",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-05-05T09:57:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2bea07d5c5629f9b33b718364b1960c12cc2865d",
"body": "Fix https://github.com/opendatateam/udata/issues/3755",
"is_bot": false,
"headline": "fix: incorrect mask on topic element (#3756)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-05-05T07:10:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4f0cd7efc45a5daab478ac8c3536e5d4acb7561",
"body": null,
"is_bot": false,
"headline": "refactor: ping on tchap (#3750)",
"author_name": "Pierlou Ramade",
"author_login": "Pierlou",
"committed_at": "2026-04-30T07:16:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1083db093f2e14d4b7cf6d084b6ce9cab5751faf",
"body": "…able (#3749)\n\nFix https://github.com/ecolabdata/ecospheres/issues/956",
"is_bot": false,
"headline": "feat(harvest): use distribution service protocol as format when avail…",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-04-29T07:58:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c7907c9c860198c347fcc6c9c237b8165a48a80",
"body": null,
"is_bot": false,
"headline": "Bump version 16.3.0",
"author_name": "Thibaud Dauce",
"author_login": "ThibaudDauce",
"committed_at": "2026-04-27T07:56:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ee17fc74776f89c02b31df840da7f6f7393f686",
"body": null,
"is_bot": false,
"headline": "feat: add spam detection to all objects (#3717)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-04-27T07:36:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5816918d2336e23cb41ec64fc5be82aa8771bd33",
"body": null,
"is_bot": false,
"headline": "feat: add harvest config in csv export (#3734)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-04-24T16:55:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "42d0534e589cf657690fc1252b68a6226e560725",
"body": "…\" codespace (#3724)\n\nFix https://github.com/ecolabdata/ecospheres/issues/1019",
"is_bot": false,
"headline": "fix(harvest): invalid remote URL on record identifiers with \"urn:uuid…",
"author_name": "streino",
"author_login": "streino",
"committed_at": "2026-04-24T16:01:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9bbd56ced23c7ea4c89f095f33c35e0d574b9646",
"body": null,
"is_bot": true,
"headline": "chore(config): migrate Renovate config (#3743)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-04-24T13:15:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e925d84913c3ff0d1890f7460d41c4cb4aa1e62",
"body": "See [`best-practices`\ndocumentation](https://docs.renovatebot.com/presets-config/#configbest-practices).\nAmong other things, it includes:\n>\n[:maintainLockFilesWeekly](https://docs.renovatebot.com/presets-default/#maintainlockfilesweekly):\nRun lock file maintenance (updates) early Monday mornings.\n\nM\n[…]\nl configuration.\n\nWe may want to keep using renovate for now as it supports other\nplatforms than Github, preventing vendor lock-in. But as said, I don't\nhave strong opinion, we can switch if relevant.",
"is_bot": false,
"headline": "chore: use renovate best practices config (#3740)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-04-24T10:15:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ecce6b765af2847c4d85c43181b151aec2f4c479",
"body": null,
"is_bot": true,
"headline": "chore(deps): update dependency lxml to v6.1.0 [security] (#3736)",
"author_name": "renovate[bot]",
"author_login": "renovate[bot]",
"committed_at": "2026-04-22T16:21:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ee76fa8267c10cb01342668ab3305530c4e2066",
"body": "Part of https://github.com/datagouv/data.gouv.fr/issues/1868",
"is_bot": false,
"headline": "feat: migrate topics to api fields (#3695)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-04-22T07:09:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3676755df16c8105a160c37747a34afea47eac38",
"body": null,
"is_bot": false,
"headline": "feat: better user commands output (#3733)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-04-21T15:57:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7a2cbd97a0b507aa49688db87f617f96ad913910",
"body": "Require to add a warning on the moderation dashboard if a report is\nblocking callbacks. And we don't want to expose internals (even for\nsuper-admins)",
"is_bot": false,
"headline": "feat: expose callbacks_count for reports (#3726)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-04-21T07:33:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc27c6cad6a6a30bd6b9a77ebfc18a4c691284f4",
"body": "This brings back the `api/oauth_authorize.html` template from\nhttps://raw.githubusercontent.com/datagouv/udata-front/refs/heads/master/udata_front/theme/gouvfr/templates/api/oauth_authorize.html.\n\nThis lets a standalone udata process the whole oauth login flow.",
"is_bot": false,
"headline": "fix: reintroduce oauth_authorize template (#3731)",
"author_name": "Alexandre Bulté",
"author_login": "abulte",
"committed_at": "2026-04-21T07:06:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e3d1cd2dc6a96106e62a7badce050374650946d",
"body": "```\nuv sync --upgrade\n - authlib==1.6.10\n + authlib==1.6.11\n - boto3==1.42.89\n + boto3==1.42.90\n - botocore==1.42.89\n + botocore==1.42.90\n - filelock==3.25.2\n + filelock==3.28.0\n - flask-security-too==5.7.1\n + flask-security-too==5.8.0\n - packaging==26.0\n + packaging==26.1\n - ruff==0.15.10\n + ruff==0.15.11\n - virtualenv==21.2.3\n + virtualenv==21.2.4\n```\n\nClose https://github.com/opendatateam/udata/pull/3728",
"is_bot": false,
"headline": "chore(deps): update deps (#3730)",
"author_name": "maudetes",
"author_login": "maudetes",
"committed_at": "2026-04-17T13:46:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "621e565c71473b15b9d3213f00f1e98ad18be941",
"body": "Fix https://errors.data.gouv.fr/organizations/sentry/issues/286646 and\nhttps://errors.data.gouv.fr/organizations/sentry/issues/28664\n\nYou can reproduce with\nhttps://www.data.gouv.fr/api/2/datasets/search/page=1678&page_size=20",
"is_bot": false,
"headline": "fix: errors on high pages on search endpoints (#3729)",
"author_name": "Thibaud Ollagnier",
"author_login": "ThibaudDauce",
"committed_at": "2026-04-17T13:38:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3028fdd6d71739907bbf6b2ed12d5f52a4d3b317",
"body": "Co-authored-by: Thibaud Dauce <git@hadibut.fr>",
"is_bot": false,
"headline": "feat: add viz poc 1 (#3680)",
"author_name": "Nicolas KEMPF",
"author_login": "nicolaskempf57",
"committed_at": "2026-04-16T13:35:38Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 100,
"commits_last_year": 435,
"latest_release_at": "2026-07-22T14:13:24Z",
"latest_release_tag": "v17.0.5",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 51,
"days_since_latest_release": 0,
"mean_days_between_releases": 8.5
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 50,
"has_issue_template": true,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "udata",
"exists": true,
"license": "MIT",
"keywords": [
"udata",
"open data",
"portal",
"data",
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: System :: Software Distribution"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/udata/",
"is_deprecated": false,
"latest_version": "17.0.5",
"repository_url": "https://github.com/opendatateam/udata",
"versions_count": 1317,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": "2017-01-10T11:58:25.931855Z",
"latest_published_at": "2026-07-22T14:19:52.451504Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 93,
"stars": 266,
"watchers": 13,
"fork_history": {
"days": [
{
"date": "2014-05-20",
"count": 1
},
{
"date": "2014-12-02",
"count": 1
},
{
"date": "2015-04-08",
"count": 1
},
{
"date": "2015-08-20",
"count": 1
},
{
"date": "2015-10-17",
"count": 1
},
{
"date": "2015-11-20",
"count": 1
},
{
"date": "2015-12-29",
"count": 1
},
{
"date": "2016-04-02",
"count": 1
},
{
"date": "2016-05-23",
"count": 1
},
{
"date": "2016-06-09",
"count": 1
},
{
"date": "2016-06-24",
"count": 1
},
{
"date": "2016-08-31",
"count": 1
},
{
"date": "2017-01-05",
"count": 1
},
{
"date": "2017-01-24",
"count": 1
},
{
"date": "2017-04-06",
"count": 1
},
{
"date": "2017-04-14",
"count": 1
},
{
"date": "2017-04-24",
"count": 1
},
{
"date": "2017-05-25",
"count": 1
},
{
"date": "2017-05-26",
"count": 1
},
{
"date": "2017-06-07",
"count": 1
},
{
"date": "2017-06-14",
"count": 1
},
{
"date": "2017-07-05",
"count": 1
},
{
"date": "2017-07-12",
"count": 2
},
{
"date": "2017-09-20",
"count": 1
},
{
"date": "2017-10-12",
"count": 1
},
{
"date": "2017-10-30",
"count": 1
},
{
"date": "2017-11-11",
"count": 1
},
{
"date": "2017-11-25",
"count": 1
},
{
"date": "2017-12-19",
"count": 1
},
{
"date": "2018-01-04",
"count": 1
},
{
"date": "2018-01-05",
"count": 1
},
{
"date": "2018-01-29",
"count": 1
},
{
"date": "2018-02-02",
"count": 1
},
{
"date": "2018-02-07",
"count": 1
},
{
"date": "2018-04-10",
"count": 1
},
{
"date": "2018-06-05",
"count": 1
},
{
"date": "2018-06-18",
"count": 1
},
{
"date": "2018-08-16",
"count": 1
},
{
"date": "2018-08-22",
"count": 1
},
{
"date": "2018-09-05",
"count": 1
},
{
"date": "2018-10-30",
"count": 1
},
{
"date": "2019-02-02",
"count": 1
},
{
"date": "2019-03-29",
"count": 1
},
{
"date": "2019-06-05",
"count": 1
},
{
"date": "2019-11-18",
"count": 1
},
{
"date": "2019-12-17",
"count": 1
},
{
"date": "2020-03-09",
"count": 1
},
{
"date": "2020-04-06",
"count": 1
},
{
"date": "2020-05-20",
"count": 2
},
{
"date": "2020-05-27",
"count": 1
},
{
"date": "2020-08-04",
"count": 1
},
{
"date": "2020-08-15",
"count": 1
},
{
"date": "2020-09-15",
"count": 1
},
{
"date": "2020-10-13",
"count": 1
},
{
"date": "2020-11-05",
"count": 1
},
{
"date": "2021-03-19",
"count": 1
},
{
"date": "2021-03-22",
"count": 1
},
{
"date": "2021-03-30",
"count": 1
},
{
"date": "2021-05-03",
"count": 1
},
{
"date": "2021-06-03",
"count": 1
},
{
"date": "2021-07-17",
"count": 1
},
{
"date": "2021-09-06",
"count": 1
},
{
"date": "2021-09-24",
"count": 1
},
{
"date": "2021-10-26",
"count": 1
},
{
"date": "2021-12-01",
"count": 1
},
{
"date": "2022-03-05",
"count": 1
},
{
"date": "2022-09-07",
"count": 1
},
{
"date": "2022-09-26",
"count": 1
},
{
"date": "2023-01-17",
"count": 1
},
{
"date": "2023-02-27",
"count": 1
},
{
"date": "2023-09-05",
"count": 1
},
{
"date": "2023-09-30",
"count": 1
},
{
"date": "2023-11-21",
"count": 1
},
{
"date": "2024-01-13",
"count": 1
},
{
"date": "2024-05-29",
"count": 1
},
{
"date": "2024-06-07",
"count": 1
},
{
"date": "2024-07-26",
"count": 1
},
{
"date": "2024-11-25",
"count": 1
},
{
"date": "2024-12-04",
"count": 1
},
{
"date": "2025-01-22",
"count": 1
},
{
"date": "2025-03-15",
"count": 1
},
{
"date": "2025-08-22",
"count": 1
},
{
"date": "2025-11-03",
"count": 1
},
{
"date": "2025-11-06",
"count": 1
},
{
"date": "2025-12-07",
"count": 1
},
{
"date": "2025-12-18",
"count": 1
},
{
"date": "2026-04-29",
"count": 1
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-07-21",
"count": 1
}
],
"complete": true,
"collected": 91,
"total_forks": 93
},
"star_history": null,
"open_issues_and_prs": 142
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 128718,
"source_files_sampled": 562,
"oversized_source_files": 6,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 7943
},
"dependencies": {
"manifests": [
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "pillow",
"direct": true,
"version": "12.2.0",
"severity": "critical",
"ecosystem": "pypi",
"cvss_score": 9.1,
"advisory_ids": [
"GHSA-45hq-cxwh-f6vc",
"GHSA-4x4j-2g7c-83w6",
"GHSA-5x94-69rx-g8h2",
"GHSA-62p4-gmf7-7g93",
"GHSA-6r8x-57c9-28j4",
"GHSA-8v84-f9pq-wr9x",
"GHSA-9hw9-ch79-4vh6",
"GHSA-fj7v-r99m-22gq",
"GHSA-jjj6-mw9f-p565",
"GHSA-pg7v-jwj7-p798"
],
"fixed_version": "12.3.0",
"advisory_count": 22,
"oldest_advisory_days": 16
},
{
"name": "setuptools",
"direct": false,
"version": "82.0.1",
"severity": "moderate",
"ecosystem": "pypi",
"cvss_score": 6.1,
"advisory_ids": [
"GHSA-h35f-9h28-mq5c",
"PYSEC-2026-3447"
],
"fixed_version": "83.0.0",
"advisory_count": 2,
"oldest_advisory_days": 14
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"critical": 1,
"moderate": 1
},
"advisory_count": 24,
"affected_count": 2,
"assessed_count": 172,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 1
},
"ecosystems": [
"pypi"
],
"dependencies": [
{
"name": "authlib",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.5.1,<2.0.0"
},
{
"name": "awesome-slugify",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.6.5,<2.0.0"
},
{
"name": "babel",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.17.0,<3.0.0"
},
{
"name": "bcrypt",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.0.0,<5.0.0"
},
{
"name": "bleach",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=6.2.0,<7.0.0"
},
{
"name": "blinker",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.5,<2.0"
},
{
"name": "boto3",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.26.102,<2.0.0"
},
{
"name": "botocore",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.29.165,<2.0.0"
},
{
"name": "celery",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=5.4.0,<6.0.0"
},
{
"name": "celerybeat-mongo",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.2.0,<1.0.0"
},
{
"name": "click",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=8.1.8,<9.0.0"
},
{
"name": "email-validator",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.2.0,<3.0.0"
},
{
"name": "factory-boy",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.3.3,<4.0.0"
},
{
"name": "feedgenerator",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.1.0,<3.0.0"
},
{
"name": "flask",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.0.0,<4.0.0"
},
{
"name": "flask-babel",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.0.0,<5.0.0"
},
{
"name": "flask-caching",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.3.1,<3.0.0"
},
{
"name": "flask-cdn",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.5.3,<2.0.0"
},
{
"name": "flask-gravatar",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.5.0,<1.0.0"
},
{
"name": "flask-login",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.6.3,<1.0.0"
},
{
"name": "flask-mail",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.10.0,<1.0.0"
},
{
"name": "flask-principal",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.4.0,<1.0.0"
},
{
"name": "flask-restx",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.3.0,<2.0.0"
},
{
"name": "flask-security",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=5.1.2,<6.0.0"
},
{
"name": "flask-sitemap",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.4.0,<1.0.0"
},
{
"name": "flask-storage",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.4.0,<2.0.0"
},
{
"name": "flask-wtf",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.2.2,<2.0.0"
},
{
"name": "geojson",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.2.0,<4.0.0"
},
{
"name": "geomet",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.1.0,<2.0.0"
},
{
"name": "html2text",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": "==2025.4.15"
},
{
"name": "humanfriendly",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=10.0,<11.0.0"
},
{
"name": "importlib-resources",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=7.1.0,<7.2.0"
},
{
"name": "itsdangerous",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.2.0,<3.0.0"
},
{
"name": "jinja2",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.1.6,<4.0.0"
},
{
"name": "jsonschema",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.23.0,<5.0.0"
},
{
"name": "kombu",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=5.5.0,<6.0.0"
},
{
"name": "langdetect",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.0.9,<2.0.0"
},
{
"name": "levenshtein",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.27.1,<1.0.0"
},
{
"name": "lxml",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=6.0.0,<7.0.0"
},
{
"name": "markupsafe",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.0.3,<4.0.0"
},
{
"name": "mistune",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.1.3,<4.0.0"
},
{
"name": "mongoengine",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.29.1,<1.0.0"
},
{
"name": "netaddr",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.3.0,<2.0.0"
},
{
"name": "pillow",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=11.0.0,<13.0.0"
},
{
"name": "pydenticon",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.3.1,<1.0.0"
},
{
"name": "pymongo",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.11.3,<5.0.0"
},
{
"name": "python-dateutil",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.9.0.post0,<3.0.0"
},
{
"name": "rdflib",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=7.1.3,<8.0.0"
},
{
"name": "redis",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=5.0.0,<8.0.0"
},
{
"name": "requests",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.32.4,<3.0.0"
},
{
"name": "saxonche",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=12.8.0,<13.0.0"
},
{
"name": "sentry-sdk",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.23.1,<3.0.0"
},
{
"name": "speaklater",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.3,<2.0.0"
},
{
"name": "tlds",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2025022800"
},
{
"name": "typing-extensions",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.12.2,<5.0.0"
},
{
"name": "tzdata",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": null
},
{
"name": "urlextract",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.9.0,<2.0.0"
},
{
"name": "urllib3",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.0.0,<3.0.0"
},
{
"name": "voluptuous",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.15.2,<1.0.0"
},
{
"name": "werkzeug",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.0.0,<4.0.0"
},
{
"name": "wtforms",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.2.1,<4.0.0"
},
{
"name": "wtforms-json",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.3.5,<1.0.0"
},
{
"name": "qrcode",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=8.2,<9.0"
},
{
"name": "elasticsearch",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=7.17.0,<8.0.0"
},
{
"name": "elasticsearch-dsl",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=7.4.0,<8.0.0"
},
{
"name": "beautifulsoup4",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=4.14.3,<5.0.0"
},
{
"name": "markdown",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.10,<4.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "authlib",
"direct": true,
"version": "1.7.2",
"ecosystem": "pypi"
},
{
"name": "awesome-slugify",
"direct": true,
"version": "1.6.5",
"ecosystem": "pypi"
},
{
"name": "babel",
"direct": true,
"version": "2.18.0",
"ecosystem": "pypi"
},
{
"name": "bcrypt",
"direct": true,
"version": "4.3.0",
"ecosystem": "pypi"
},
{
"name": "beautifulsoup4",
"direct": true,
"version": "4.15.0",
"ecosystem": "pypi"
},
{
"name": "bleach",
"direct": true,
"version": "6.4.0",
"ecosystem": "pypi"
},
{
"name": "blinker",
"direct": true,
"version": "1.9.0",
"ecosystem": "pypi"
},
{
"name": "boto3",
"direct": true,
"version": "1.43.36",
"ecosystem": "pypi"
},
{
"name": "botocore",
"direct": true,
"version": "1.43.36",
"ecosystem": "pypi"
},
{
"name": "celery",
"direct": true,
"version": "5.6.3",
"ecosystem": "pypi"
},
{
"name": "celerybeat-mongo",
"direct": true,
"version": "0.2.0",
"ecosystem": "pypi"
},
{
"name": "click",
"direct": true,
"version": "8.4.2",
"ecosystem": "pypi"
},
{
"name": "elasticsearch",
"direct": true,
"version": "7.17.13",
"ecosystem": "pypi"
},
{
"name": "elasticsearch-dsl",
"direct": true,
"version": "7.4.1",
"ecosystem": "pypi"
},
{
"name": "email-validator",
"direct": true,
"version": "2.3.0",
"ecosystem": "pypi"
},
{
"name": "factory-boy",
"direct": true,
"version": "3.3.3",
"ecosystem": "pypi"
},
{
"name": "feedgenerator",
"direct": true,
"version": "2.2.1",
"ecosystem": "pypi"
},
{
"name": "flask",
"direct": true,
"version": "3.1.3",
"ecosystem": "pypi"
},
{
"name": "flask-babel",
"direct": true,
"version": "4.0.0",
"ecosystem": "pypi"
},
{
"name": "flask-caching",
"direct": true,
"version": "2.4.0",
"ecosystem": "pypi"
},
{
"name": "flask-cdn",
"direct": true,
"version": "1.5.3",
"ecosystem": "pypi"
},
{
"name": "flask-gravatar",
"direct": true,
"version": "0.5.0",
"ecosystem": "pypi"
},
{
"name": "flask-login",
"direct": true,
"version": "0.6.3",
"ecosystem": "pypi"
},
{
"name": "flask-mail",
"direct": true,
"version": "0.10.0",
"ecosystem": "pypi"
},
{
"name": "flask-principal",
"direct": true,
"version": "0.4.0",
"ecosystem": "pypi"
},
{
"name": "flask-restx",
"direct": true,
"version": "1.3.2",
"ecosystem": "pypi"
},
{
"name": "flask-security",
"direct": true,
"version": "5.8.1",
"ecosystem": "pypi"
},
{
"name": "flask-sitemap",
"direct": true,
"version": "0.4.0",
"ecosystem": "pypi"
},
{
"name": "flask-storage",
"direct": true,
"version": "1.4.5",
"ecosystem": "pypi"
},
{
"name": "flask-wtf",
"direct": true,
"version": "1.3.0",
"ecosystem": "pypi"
},
{
"name": "geojson",
"direct": true,
"version": "3.3.0",
"ecosystem": "pypi"
},
{
"name": "geomet",
"direct": true,
"version": "1.1.0",
"ecosystem": "pypi"
},
{
"name": "html2text",
"direct": true,
"version": "2025.4.15",
"ecosystem": "pypi"
},
{
"name": "humanfriendly",
"direct": true,
"version": "10.0",
"ecosystem": "pypi"
},
{
"name": "importlib-resources",
"direct": true,
"version": "7.1.0",
"ecosystem": "pypi"
},
{
"name": "itsdangerous",
"direct": true,
"version": "2.2.0",
"ecosystem": "pypi"
},
{
"name": "jinja2",
"direct": true,
"version": "3.1.6",
"ecosystem": "pypi"
},
{
"name": "jsonschema",
"direct": true,
"version": "4.26.0",
"ecosystem": "pypi"
},
{
"name": "kombu",
"direct": true,
"version": "5.6.2",
"ecosystem": "pypi"
},
{
"name": "langdetect",
"direct": true,
"version": "1.0.9",
"ecosystem": "pypi"
},
{
"name": "levenshtein",
"direct": true,
"version": "0.27.3",
"ecosystem": "pypi"
},
{
"name": "lxml",
"direct": true,
"version": "6.1.1",
"ecosystem": "pypi"
},
{
"name": "markdown",
"direct": true,
"version": "3.10.2",
"ecosystem": "pypi"
},
{
"name": "markupsafe",
"direct": true,
"version": "3.0.3",
"ecosystem": "pypi"
},
{
"name": "mistune",
"direct": true,
"version": "3.3.2",
"ecosystem": "pypi"
},
{
"name": "mongoengine",
"direct": true,
"version": "0.29.3",
"ecosystem": "pypi"
},
{
"name": "netaddr",
"direct": true,
"version": "1.3.0",
"ecosystem": "pypi"
},
{
"name": "pillow",
"direct": true,
"version": "12.2.0",
"ecosystem": "pypi"
},
{
"name": "pydenticon",
"direct": true,
"version": "0.3.1",
"ecosystem": "pypi"
},
{
"name": "pymongo",
"direct": true,
"version": "4.17.0",
"ecosystem": "pypi"
},
{
"name": "python-dateutil",
"direct": true,
"version": "2.9.0.post0",
"ecosystem": "pypi"
},
{
"name": "qrcode",
"direct": true,
"version": "8.2",
"ecosystem": "pypi"
},
{
"name": "rdflib",
"direct": true,
"version": "7.6.0",
"ecosystem": "pypi"
},
{
"name": "redis",
"direct": true,
"version": "6.4.0",
"ecosystem": "pypi"
},
{
"name": "requests",
"direct": true,
"version": "2.34.2",
"ecosystem": "pypi"
},
{
"name": "saxonche",
"direct": true,
"version": "12.9.0",
"ecosystem": "pypi"
},
{
"name": "sentry-sdk",
"direct": true,
"version": "2.63.0",
"ecosystem": "pypi"
},
{
"name": "speaklater",
"direct": true,
"version": "1.3",
"ecosystem": "pypi"
},
{
"name": "tlds",
"direct": true,
"version": "2026041800",
"ecosystem": "pypi"
},
{
"name": "typing-extensions",
"direct": true,
"version": "4.15.0",
"ecosystem": "pypi"
},
{
"name": "tzdata",
"direct": true,
"version": "2026.2",
"ecosystem": "pypi"
},
{
"name": "urlextract",
"direct": true,
"version": "1.9.0",
"ecosystem": "pypi"
},
{
"name": "urllib3",
"direct": true,
"version": "2.7.0",
"ecosystem": "pypi"
},
{
"name": "voluptuous",
"direct": true,
"version": "0.16.0",
"ecosystem": "pypi"
},
{
"name": "werkzeug",
"direct": true,
"version": "3.1.8",
"ecosystem": "pypi"
},
{
"name": "wtforms",
"direct": true,
"version": "3.2.2",
"ecosystem": "pypi"
},
{
"name": "wtforms-json",
"direct": true,
"version": "0.3.5",
"ecosystem": "pypi"
},
{
"name": "amqp",
"direct": false,
"version": "5.3.1",
"ecosystem": "pypi"
},
{
"name": "aniso8601",
"direct": false,
"version": "10.0.1",
"ecosystem": "pypi"
},
{
"name": "asttokens",
"direct": false,
"version": "3.0.1",
"ecosystem": "pypi"
},
{
"name": "async-timeout",
"direct": false,
"version": "5.0.1",
"ecosystem": "pypi"
},
{
"name": "attrs",
"direct": false,
"version": "26.1.0",
"ecosystem": "pypi"
},
{
"name": "billiard",
"direct": false,
"version": "4.2.4",
"ecosystem": "pypi"
},
{
"name": "build",
"direct": false,
"version": "1.5.0",
"ecosystem": "pypi"
},
{
"name": "cachelib",
"direct": false,
"version": "0.14.0",
"ecosystem": "pypi"
},
{
"name": "certifi",
"direct": false,
"version": "2026.6.17",
"ecosystem": "pypi"
},
{
"name": "cffi",
"direct": false,
"version": "2.0.0",
"ecosystem": "pypi"
},
{
"name": "cfgv",
"direct": false,
"version": "3.5.0",
"ecosystem": "pypi"
},
{
"name": "charset-normalizer",
"direct": false,
"version": "3.4.7",
"ecosystem": "pypi"
},
{
"name": "click-didyoumean",
"direct": false,
"version": "0.3.1",
"ecosystem": "pypi"
},
{
"name": "click-plugins",
"direct": false,
"version": "1.1.1.2",
"ecosystem": "pypi"
},
{
"name": "click-repl",
"direct": false,
"version": "0.3.0",
"ecosystem": "pypi"
},
{
"name": "colorama",
"direct": false,
"version": "0.4.6",
"ecosystem": "pypi"
},
{
"name": "coverage",
"direct": false,
"version": "7.14.3",
"ecosystem": "pypi"
},
{
"name": "cryptography",
"direct": false,
"version": "49.0.0",
"ecosystem": "pypi"
},
{
"name": "decorator",
"direct": false,
"version": "5.3.1",
"ecosystem": "pypi"
},
{
"name": "distlib",
"direct": false,
"version": "0.4.3",
"ecosystem": "pypi"
},
{
"name": "dnspython",
"direct": false,
"version": "2.8.0",
"ecosystem": "pypi"
},
{
"name": "execnet",
"direct": false,
"version": "2.1.2",
"ecosystem": "pypi"
},
{
"name": "executing",
"direct": false,
"version": "2.2.1",
"ecosystem": "pypi"
},
{
"name": "faker",
"direct": false,
"version": "40.21.0",
"ecosystem": "pypi"
},
{
"name": "feedparser",
"direct": false,
"version": "6.0.12",
"ecosystem": "pypi"
},
{
"name": "filelock",
"direct": false,
"version": "3.29.4",
"ecosystem": "pypi"
},
{
"name": "flake8",
"direct": false,
"version": "7.3.0",
"ecosystem": "pypi"
},
{
"name": "flask-shell-ipython",
"direct": false,
"version": "0.5.3",
"ecosystem": "pypi"
},
{
"name": "ghp-import",
"direct": false,
"version": "2.1.0",
"ecosystem": "pypi"
},
{
"name": "httpretty",
"direct": false,
"version": "1.1.4",
"ecosystem": "pypi"
},
{
"name": "identify",
"direct": false,
"version": "2.6.19",
"ecosystem": "pypi"
},
{
"name": "idna",
"direct": false,
"version": "3.18",
"ecosystem": "pypi"
},
{
"name": "iniconfig",
"direct": false,
"version": "2.3.0",
"ecosystem": "pypi"
},
{
"name": "invoke",
"direct": false,
"version": "3.0.3",
"ecosystem": "pypi"
},
{
"name": "ipython",
"direct": false,
"version": "9.15.0",
"ecosystem": "pypi"
},
{
"name": "ipython-pygments-lexers",
"direct": false,
"version": "1.1.1",
"ecosystem": "pypi"
},
{
"name": "jedi",
"direct": false,
"version": "0.20.0",
"ecosystem": "pypi"
},
{
"name": "jmespath",
"direct": false,
"version": "1.1.0",
"ecosystem": "pypi"
},
{
"name": "joserfc",
"direct": false,
"version": "1.7.1",
"ecosystem": "pypi"
},
{
"name": "jsonschema-specifications",
"direct": false,
"version": "2025.9.1",
"ecosystem": "pypi"
},
{
"name": "libpass",
"direct": false,
"version": "1.9.3",
"ecosystem": "pypi"
},
{
"name": "matplotlib-inline",
"direct": false,
"version": "0.2.2",
"ecosystem": "pypi"
},
{
"name": "mccabe",
"direct": false,
"version": "0.7.0",
"ecosystem": "pypi"
},
{
"name": "mergedeep",
"direct": false,
"version": "1.3.4",
"ecosystem": "pypi"
},
{
"name": "mkdocs",
"direct": false,
"version": "1.6.1",
"ecosystem": "pypi"
},
{
"name": "mkdocs-get-deps",
"direct": false,
"version": "0.2.2",
"ecosystem": "pypi"
},
{
"name": "mock",
"direct": false,
"version": "5.2.0",
"ecosystem": "pypi"
},
{
"name": "nodeenv",
"direct": false,
"version": "1.10.0",
"ecosystem": "pypi"
},
{
"name": "packaging",
"direct": false,
"version": "26.2",
"ecosystem": "pypi"
},
{
"name": "parso",
"direct": false,
"version": "0.8.7",
"ecosystem": "pypi"
},
{
"name": "pathspec",
"direct": false,
"version": "1.1.1",
"ecosystem": "pypi"
},
{
"name": "pexpect",
"direct": false,
"version": "4.9.0",
"ecosystem": "pypi"
},
{
"name": "pip",
"direct": false,
"version": "26.1.2",
"ecosystem": "pypi"
},
{
"name": "pip-tools",
"direct": false,
"version": "7.5.3",
"ecosystem": "pypi"
},
{
"name": "platformdirs",
"direct": false,
"version": "4.10.0",
"ecosystem": "pypi"
},
{
"name": "pluggy",
"direct": false,
"version": "1.6.0",
"ecosystem": "pypi"
},
{
"name": "pre-commit",
"direct": false,
"version": "4.6.0",
"ecosystem": "pypi"
},
{
"name": "prompt-toolkit",
"direct": false,
"version": "3.0.52",
"ecosystem": "pypi"
},
{
"name": "psutil",
"direct": false,
"version": "7.2.2",
"ecosystem": "pypi"
},
{
"name": "ptyprocess",
"direct": false,
"version": "0.7.0",
"ecosystem": "pypi"
},
{
"name": "pure-eval",
"direct": false,
"version": "0.2.3",
"ecosystem": "pypi"
},
{
"name": "pycodestyle",
"direct": false,
"version": "2.14.0",
"ecosystem": "pypi"
},
{
"name": "pycparser",
"direct": false,
"version": "3.0",
"ecosystem": "pypi"
},
{
"name": "pyflakes",
"direct": false,
"version": "3.4.0",
"ecosystem": "pypi"
},
{
"name": "pygments",
"direct": false,
"version": "2.20.0",
"ecosystem": "pypi"
},
{
"name": "pyparsing",
"direct": false,
"version": "3.3.2",
"ecosystem": "pypi"
},
{
"name": "pyproject-hooks",
"direct": false,
"version": "1.2.0",
"ecosystem": "pypi"
},
{
"name": "pyreadline3",
"direct": false,
"version": "3.5.6",
"ecosystem": "pypi"
},
{
"name": "pytest",
"direct": false,
"version": "9.1.1",
"ecosystem": "pypi"
},
{
"name": "pytest-cov",
"direct": false,
"version": "7.1.0",
"ecosystem": "pypi"
},
{
"name": "pytest-env",
"direct": false,
"version": "1.6.0",
"ecosystem": "pypi"
},
{
"name": "pytest-flask",
"direct": false,
"version": "1.3.0",
"ecosystem": "pypi"
},
{
"name": "pytest-mock",
"direct": false,
"version": "3.15.1",
"ecosystem": "pypi"
},
{
"name": "pytest-sugar",
"direct": false,
"version": "1.1.1",
"ecosystem": "pypi"
},
{
"name": "pytest-xdist",
"direct": false,
"version": "3.8.0",
"ecosystem": "pypi"
},
{
"name": "python-discovery",
"direct": false,
"version": "1.4.2",
"ecosystem": "pypi"
},
{
"name": "python-dotenv",
"direct": false,
"version": "1.2.2",
"ecosystem": "pypi"
},
{
"name": "pytz",
"direct": false,
"version": "2026.2",
"ecosystem": "pypi"
},
{
"name": "pyyaml",
"direct": false,
"version": "6.0.3",
"ecosystem": "pypi"
},
{
"name": "pyyaml-env-tag",
"direct": false,
"version": "1.1",
"ecosystem": "pypi"
},
{
"name": "rapidfuzz",
"direct": false,
"version": "3.14.5",
"ecosystem": "pypi"
},
{
"name": "referencing",
"direct": false,
"version": "0.37.0",
"ecosystem": "pypi"
},
{
"name": "regex",
"direct": false,
"version": "2026.6.28",
"ecosystem": "pypi"
},
{
"name": "requests-mock",
"direct": false,
"version": "1.12.1",
"ecosystem": "pypi"
},
{
"name": "rpds-py",
"direct": false,
"version": "2026.5.1",
"ecosystem": "pypi"
},
{
"name": "ruff",
"direct": false,
"version": "0.15.20",
"ecosystem": "pypi"
},
{
"name": "s3transfer",
"direct": false,
"version": "0.19.0",
"ecosystem": "pypi"
},
{
"name": "setuptools",
"direct": false,
"version": "82.0.1",
"ecosystem": "pypi"
},
{
"name": "sgmllib3k",
"direct": false,
"version": "1.0.0",
"ecosystem": "pypi"
},
{
"name": "six",
"direct": false,
"version": "1.17.0",
"ecosystem": "pypi"
},
{
"name": "soupsieve",
"direct": false,
"version": "2.8.4",
"ecosystem": "pypi"
},
{
"name": "stack-data",
"direct": false,
"version": "0.6.3",
"ecosystem": "pypi"
},
{
"name": "termcolor",
"direct": false,
"version": "3.3.0",
"ecosystem": "pypi"
},
{
"name": "tinycss2",
"direct": false,
"version": "1.5.1",
"ecosystem": "pypi"
},
{
"name": "tomli",
"direct": false,
"version": "2.4.1",
"ecosystem": "pypi"
},
{
"name": "traitlets",
"direct": false,
"version": "5.15.1",
"ecosystem": "pypi"
},
{
"name": "tzlocal",
"direct": false,
"version": "5.4.3",
"ecosystem": "pypi"
},
{
"name": "unidecode",
"direct": false,
"version": "0.4.21",
"ecosystem": "pypi"
},
{
"name": "uritools",
"direct": false,
"version": "6.1.2",
"ecosystem": "pypi"
},
{
"name": "vine",
"direct": false,
"version": "5.1.0",
"ecosystem": "pypi"
},
{
"name": "virtualenv",
"direct": false,
"version": "21.5.1",
"ecosystem": "pypi"
},
{
"name": "watchdog",
"direct": false,
"version": "6.0.0",
"ecosystem": "pypi"
},
{
"name": "wcwidth",
"direct": false,
"version": "0.8.1",
"ecosystem": "pypi"
},
{
"name": "webencodings",
"direct": false,
"version": "0.5.1",
"ecosystem": "pypi"
},
{
"name": "wheel",
"direct": false,
"version": "0.47.0",
"ecosystem": "pypi"
}
],
"collected": true,
"truncated": false,
"total_count": 172,
"direct_count": 67,
"indirect_count": 105
}
},
"maintainership": {
"issues": {
"open_prs": 43,
"merged_prs": 2635,
"open_issues": 99,
"closed_ratio": 0.845,
"closed_issues": 541,
"closed_unmerged_prs": 530
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "noirbizarre",
"commits": 3719,
"avatar_url": "https://avatars.githubusercontent.com/u/15725?v=4"
},
{
"type": "User",
"login": "davidbgk",
"commits": 579,
"avatar_url": "https://avatars.githubusercontent.com/u/3556?v=4"
},
{
"type": "User",
"login": "maudetes",
"commits": 474,
"avatar_url": "https://avatars.githubusercontent.com/u/28541902?v=4"
},
{
"type": "User",
"login": "abulte",
"commits": 390,
"avatar_url": "https://avatars.githubusercontent.com/u/119625?v=4"
},
{
"type": "User",
"login": "ThibaudDauce",
"commits": 378,
"avatar_url": "https://avatars.githubusercontent.com/u/1770543?v=4"
},
{
"type": "User",
"login": "crowdin-opendatateam",
"commits": 334,
"avatar_url": "https://avatars.githubusercontent.com/u/32453916?v=4"
},
{
"type": "User",
"login": "pyup-bot",
"commits": 326,
"avatar_url": "https://avatars.githubusercontent.com/u/16239342?v=4"
},
{
"type": "User",
"login": "quaxsze",
"commits": 134,
"avatar_url": "https://avatars.githubusercontent.com/u/57526019?v=4"
},
{
"type": "User",
"login": "bolinocroustibat",
"commits": 114,
"avatar_url": "https://avatars.githubusercontent.com/u/4353767?v=4"
},
{
"type": "User",
"login": "jphnoel",
"commits": 51,
"avatar_url": "https://avatars.githubusercontent.com/u/7070530?v=4"
}
],
"contributors_sampled": 49,
"top_contributor_share": 0.537
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"security_signals": {
"lockfiles": [
"uv.lock"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 8,
"reason": "21 out of 26 merged PRs checked by a CI test -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 8,
"reason": "Found 24/28 approved changesets -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 56 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "14 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "e86ab6a74129945125fbb90d91e079c1ae550960",
"ran_at": "2026-07-23T10:59:45Z",
"aggregate_score": 5.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-23T10:51:27Z",
"oldest_open_prs": [
{
"number": 2624,
"created_at": "2021-06-17T16:23:39Z",
"last_comment_at": "2021-06-22T13:31:51Z",
"last_comment_author": "maudetes"
},
{
"number": 3329,
"created_at": "2025-05-26T14:58:45Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3423,
"created_at": "2025-09-11T12:20:42Z",
"last_comment_at": "2026-06-08T07:26:09Z",
"last_comment_author": "abulte"
},
{
"number": 3562,
"created_at": "2025-12-07T18:43:30Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3708,
"created_at": "2026-03-30T14:03:11Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3712,
"created_at": "2026-03-31T19:16:09Z",
"last_comment_at": "2026-06-08T06:57:17Z",
"last_comment_author": "ThibaudDauce"
},
{
"number": 3725,
"created_at": "2026-04-15T12:48:51Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3727,
"created_at": "2026-04-16T14:50:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3735,
"created_at": "2026-04-21T13:50:03Z",
"last_comment_at": "2026-04-21T15:04:27Z",
"last_comment_author": "geoffreyaldebert"
},
{
"number": 3738,
"created_at": "2026-04-23T08:51:25Z",
"last_comment_at": "2026-04-28T13:01:10Z",
"last_comment_author": "abulte"
},
{
"number": 3753,
"created_at": "2026-05-04T09:38:36Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3775,
"created_at": "2026-05-19T09:00:51Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3777,
"created_at": "2026-05-19T10:02:23Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 3791,
"created_at": "2026-05-26T08:53:38Z",
"last_comment_at": "2026-06-23T15:16:21Z",
"last_comment_author": "ThibaudDauce"
},
{
"number": 3799,
"created_at": "2026-05-28T15:04:23Z",
"last_comment_at": "2026-06-09T09:35:10Z",
"last_comment_author": "maudetes"
},
{
"number": 3815,
"created_at": "2026-06-05T09:19:11Z",
"last_comment_at": "2026-06-09T09:34:35Z",
"last_comment_author": "maudetes"
},
{
"number": 3818,
"created_at": "2026-06-05T12:21:59Z",
"last_comment_at": "2026-06-05T12:53:17Z",
"last_comment_author": "maudetes"
},
{
"number": 3819,
"created_at": "2026-06-05T14:49:36Z",
"last_comment_at": "2026-07-22T06:30:55Z",
"last_comment_author": "Samuelfaure"
},
{
"number": 3824,
"created_at": "2026-06-09T09:56:05Z",
"last_comment_at": "2026-06-09T09:56:07Z",
"last_comment_author": "renovate"
},
{
"number": 3825,
"created_at": "2026-06-10T03:15:29Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-07-23T10:51:24Z",
"ci_last_conclusion": null,
"oldest_open_issues": [
{
"number": 2,
"created_at": "2015-02-02T09:26:19Z",
"last_comment_at": "2015-02-02T09:51:55Z",
"last_comment_author": "MattiSG"
},
{
"number": 497,
"created_at": "2016-06-23T08:47:46Z",
"last_comment_at": "2017-11-14T14:08:41Z",
"last_comment_author": "davidbgk"
},
{
"number": 498,
"created_at": "2016-06-23T08:56:00Z",
"last_comment_at": "2017-11-14T14:06:48Z",
"last_comment_author": "davidbgk"
},
{
"number": 526,
"created_at": "2016-07-20T13:21:16Z",
"last_comment_at": "2017-01-12T20:07:20Z",
"last_comment_author": "jdesboeufs"
},
{
"number": 552,
"created_at": "2016-10-05T14:18:20Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 669,
"created_at": "2017-01-06T08:44:23Z",
"last_comment_at": "2017-06-12T15:58:31Z",
"last_comment_author": "ColinMaudry"
},
{
"number": 723,
"created_at": "2017-01-18T19:31:21Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 1055,
"created_at": "2017-07-26T14:57:42Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 1306,
"created_at": "2017-12-12T17:20:01Z",
"last_comment_at": "2018-06-22T07:24:46Z",
"last_comment_author": "petzlux"
},
{
"number": 1310,
"created_at": "2017-12-13T14:31:22Z",
"last_comment_at": "2018-01-31T18:40:50Z",
"last_comment_author": "noirbizarre"
},
{
"number": 1312,
"created_at": "2017-12-13T15:19:03Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 1449,
"created_at": "2018-02-19T11:20:52Z",
"last_comment_at": "2018-05-24T14:25:40Z",
"last_comment_author": "taniki"
},
{
"number": 1686,
"created_at": "2018-05-24T14:23:26Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 1719,
"created_at": "2018-06-05T12:06:58Z",
"last_comment_at": "2019-11-22T10:10:53Z",
"last_comment_author": "abulte"
},
{
"number": 1876,
"created_at": "2018-09-06T13:14:40Z",
"last_comment_at": "2018-09-06T13:35:27Z",
"last_comment_author": "noirbizarre"
},
{
"number": 2071,
"created_at": "2019-03-20T11:11:36Z",
"last_comment_at": "2019-03-21T12:42:44Z",
"last_comment_author": "noirbizarre"
},
{
"number": 2086,
"created_at": "2019-03-26T16:04:36Z",
"last_comment_at": "2019-11-27T12:17:37Z",
"last_comment_author": "taniki"
},
{
"number": 2141,
"created_at": "2019-05-14T14:41:47Z",
"last_comment_at": "2019-07-18T16:49:15Z",
"last_comment_author": "taniki"
},
{
"number": 2183,
"created_at": "2019-06-05T12:01:02Z",
"last_comment_at": "2019-11-22T09:54:22Z",
"last_comment_author": "abulte"
},
{
"number": 2225,
"created_at": "2019-07-03T22:06:27Z",
"last_comment_at": "2019-07-09T12:25:58Z",
"last_comment_author": "taniki"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/opendatateam/udata",
"host": "github.com",
"name": "udata",
"owner": "opendatateam"
},
"metrics": {
"overall": {
"key": "overall",
"band": "good",
"name": "Overall health",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"security": 59,
"vitality": 99,
"community": 69,
"governance": 70,
"engineering": 76
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 99,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "excellent",
"name": "Development activity",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"commits_last_year": 435,
"human_commit_share": 0.84,
"days_since_last_push": 0,
"active_weeks_last_year": 51
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "51/52 weeks with commits",
"points": 35.3,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 51
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "435 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 435
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 100,
"latest_release_tag": "v17.0.5",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 8.5
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "100 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 100
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~8.5 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 8.5
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 69,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "moderate",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"forks": 93,
"stars": 266,
"watchers": 13,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "266 stars",
"points": 39.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 266
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "93 forks",
"points": 16.4,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 93
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "13 watchers",
"points": 6,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 13
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": true,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (AGPL-3.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "AGPL-3.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 7.2,
"status": "met",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "good",
"name": "Sustainability & Governance",
"value": 70,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 43,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 49,
"top_contributor_share": 0.537
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 54% of commits",
"points": 10.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 54
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "49 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 49
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 56 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"merged_prs": 2635,
"open_issues": 99,
"closed_issues": 541,
"issue_closed_ratio": 0.845,
"closed_unmerged_prs": 530
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "84% of issues closed",
"points": 39.5,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 84
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "2635/3165 decided PRs merged",
"points": 31.8,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 2635,
"decided": 3165
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 24/28 approved changesets -- score normalized to 8",
"points": 12,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"followers": 27,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "opendatateam",
"public_repos": 48,
"account_age_days": 3723
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "27 followers of opendatateam",
"points": 10.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 27,
"login": "opendatateam"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "48 public repos, account ~10 yr old",
"points": 24.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 48
}
},
{
"code": "account_age_years",
"params": {
"years": 10
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"udata"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "1317 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 1317
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 76,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": true
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 16,
"status": "met",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 9.6,
"status": "met",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "21 out of 26 merged PRs checked by a CI test -- score normalized to 8",
"points": 16,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"python",
"opendata",
"flask",
"vue",
"vuejs",
"flask-restplus",
"portal"
],
"has_wiki": false,
"homepage": "http://udata.readthedocs.org",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "http://udata.readthedocs.org",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "7 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 7
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 59,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 5.7
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "21 out of 26 merged PRs checked by a CI test -- score normalized to 8",
"points": 2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 24/28 approved changesets -- score normalized to 8",
"points": 6,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 56 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "14 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "moderate",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 172 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 172
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 66,
"inputs": {
"source": "osv",
"advisories": 24,
"affected_packages": 2,
"assessed_packages": 172,
"unassessed_packages": 0,
"affected_by_severity": "critical 1, moderate 1",
"direct_affected_packages": 1
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "1 affected: pillow 12.2.0 (critical 9.1)",
"points": 9.5,
"status": "partial",
"details": [
{
"code": "advisories_affected",
"params": {
"count": 1,
"packages": "pillow 12.2.0 (critical 9.1)"
}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory has been public longer than 90 days",
"points": 40,
"status": "met",
"details": [
{
"code": "advisories_none_stale",
"params": {
"days": 90
}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 172,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 18
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 66,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.869,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 7943
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "73 of 84 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 73,
"sampled": 84
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"uv.lock"
],
"has_dockerfile": true,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0.16
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 11,
"status": "met",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "16 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 16,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 54,
"inputs": {
"primary_language": "Python",
"largest_source_bytes": 128718,
"source_files_sampled": 562,
"oversized_source_files": 6
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Python without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Python"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "6/562 source files over 60KB",
"points": 54.4,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 562,
"oversized": 6
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"deps.dev does not index pypi:udata@17.0.5; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-23T11:00:12.239039Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/opendatateam/udata.svg",
"full_name": "opendatateam/udata",
"license_state": "standard",
"license_spdx": "AGPL-3.0"
}