Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 11:00 UTC

opendatateam / udata

Customizable and skinnable social platform dedicated to open data.

PythonAGPL-3.0★ 266 stars⑂ 93 forkssince Apr 2014View on GitHub ↗

opendatateam/udata holds a health index of 76 out of 100, placing it in the Good band. It scores highest on Vitality (99/100) and lowest on Security (59/100). It was last updated today. A single contributor accounts for most of its recent work.

76
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

76
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Open Data TeamOrganization
27 followers48 public repossince May 2016

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
PyPIudata17.0.5-1,3170 days agoudataopen-dataportaldata

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

99Excellent · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
35.3/36Commit cadence — 51/52 weeks with commits
18/18Commit volume — 435 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year435
human_commit_share0.84
days_since_last_push0
active_weeks_last_year51

Release discipline

100Excellent
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~8.5 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count100
latest_release_tagv17.0.5
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases8.5
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

69Moderate · 18% of overall
How it's scored
39.3/60Stars — 266 stars
16.4/25Forks — 93 forks
6/15Watchers — 13 watchers
Inputs used
forks93
stars266
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (AGPL-3.0)
18/18CONTRIBUTING guide
0/13.5Code of conduct
7.2/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateyes
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

70Good · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
10.4/22.5Commit distribution — top contributor authored 54% of commits
13.5/13.5Contributor breadth — 49 contributors
10/10OpenSSF Scorecard: Contributors — project has 56 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled49
top_contributor_share0.537
How it's scored
39.5/46.8Issue resolution — 84% of issues closed
31.8/38.3PR acceptance — 2,635/3,165 decided PRs merged
12/15OpenSSF Scorecard: Code-Review — Found 24/28 approved changesets -- score normalized to 8
Inputs used
merged_prs2,635
open_issues99
closed_issues541
issue_closed_ratio0.845
closed_unmerged_prs530
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
10.4/25Owner reach — 27 followers of opendatateam
24.3/25Track record — 48 public repos, account ~10 yr old
Inputs used
followers27
owner_typeOrganization
is_verified
owner_loginopendatateam
public_repos48
account_age_days3,723
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 0 days ago
20/20Version history — 1,317 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesudata
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

76Good · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
16/16Linter config
9.6/9.6Pre-commit hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 21 out of 26 merged PRs checked by a CI test -- score normalized to 8
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configyes

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — http://udata.readthedocs.org
10/10Repository description
10/10Topics — 7 topics
0/10Wiki
Inputs used
topicspython, opendata, flask, vue, vuejs, flask-restplus, portal
has_wikino
homepagehttp://udata.readthedocs.org
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

59Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2/2.5CI-Tests — 21 out of 26 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
6/7.5Code-Review — Found 24/28 approved changesets -- score normalized to 8
2.5/2.5Contributors — project has 56 contributing companies or organizations
0/10Dangerous-Workflow — no data
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
0/7.5Vulnerabilities — 14 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5.7
Excluded from scoring (no data or not applicable): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.
How it's scored
9.5/35Direct dependencies free of known advisories — 1 affected: pillow 12.2.0 (critical 9.1)
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
40/40No advisories left outstanding — no advisory has been public longer than 90 days
Inputs used
sourceosv
advisories24
affected_packages2
assessed_packages172
unassessed_packages0
affected_by_severitycritical 1, moderate 1
direct_affected_packages1
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.

AI Readiness

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.

66Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 73 of 84 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.869
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes7,943
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config
0/11Static type checking
10/10Reproducible environment — Dockerfile, lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
8/8Automated maintenance — 16 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfilesuv.lock
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0.16
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
0/45Type-checkable code — Python without a type-check config
54.4/55Manageable file sizes — 6/562 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes128,718
source_files_sampled562
oversized_source_files6

Key facts

266GitHub stars
49contributors
435commits, last 12 months
0days since last push
100releases
1bus factor
99open issues
PyPIpackage ecosystems

Data collection 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

More detail

Star and fork history 0 ★ / 93 ⇿
0Stars
93Forks
99Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0204060801009132014-052020-062026-07
Major 7Minor 33Patch 59

Each point covers 12 days.

OpenSSF Scorecard 5.7 / 10
5.7aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 10:59 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal 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
8CI-Tests21 out of 26 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
8Code-ReviewFound 24/28 approved changesets -- score normalized to 8
10Contributorsproject has 56 contributing companies or organizations
n/aDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
0Vulnerabilities14 existing vulnerabilities detected
Direct dependencies 67
RegistryPackageVersion constraintManifest
PyPIauthlib>=1.5.1,<2.0.0pyproject.toml
PyPIawesome-slugify>=1.6.5,<2.0.0pyproject.toml
PyPIbabel>=2.17.0,<3.0.0pyproject.toml
PyPIbcrypt>=4.0.0,<5.0.0pyproject.toml
PyPIbleach>=6.2.0,<7.0.0pyproject.toml
PyPIblinker>=1.5,<2.0pyproject.toml
PyPIboto3>=1.26.102,<2.0.0pyproject.toml
PyPIbotocore>=1.29.165,<2.0.0pyproject.toml
PyPIcelery>=5.4.0,<6.0.0pyproject.toml
PyPIcelerybeat-mongo>=0.2.0,<1.0.0pyproject.toml
PyPIclick>=8.1.8,<9.0.0pyproject.toml
PyPIemail-validator>=2.2.0,<3.0.0pyproject.toml
PyPIfactory-boy>=3.3.3,<4.0.0pyproject.toml
PyPIfeedgenerator>=2.1.0,<3.0.0pyproject.toml
PyPIflask>=3.0.0,<4.0.0pyproject.toml
PyPIflask-babel>=4.0.0,<5.0.0pyproject.toml
PyPIflask-caching>=2.3.1,<3.0.0pyproject.toml
PyPIflask-cdn>=1.5.3,<2.0.0pyproject.toml
PyPIflask-gravatar>=0.5.0,<1.0.0pyproject.toml
PyPIflask-login>=0.6.3,<1.0.0pyproject.toml
PyPIflask-mail>=0.10.0,<1.0.0pyproject.toml
PyPIflask-principal>=0.4.0,<1.0.0pyproject.toml
PyPIflask-restx>=1.3.0,<2.0.0pyproject.toml
PyPIflask-security>=5.1.2,<6.0.0pyproject.toml
PyPIflask-sitemap>=0.4.0,<1.0.0pyproject.toml
PyPIflask-storage>=1.4.0,<2.0.0pyproject.toml
PyPIflask-wtf>=1.2.2,<2.0.0pyproject.toml
PyPIgeojson>=3.2.0,<4.0.0pyproject.toml
PyPIgeomet>=1.1.0,<2.0.0pyproject.toml
PyPIhtml2text==2025.4.15pyproject.toml
PyPIhumanfriendly>=10.0,<11.0.0pyproject.toml
PyPIimportlib-resources>=7.1.0,<7.2.0pyproject.toml
PyPIitsdangerous>=2.2.0,<3.0.0pyproject.toml
PyPIjinja2>=3.1.6,<4.0.0pyproject.toml
PyPIjsonschema>=4.23.0,<5.0.0pyproject.toml
PyPIkombu>=5.5.0,<6.0.0pyproject.toml
PyPIlangdetect>=1.0.9,<2.0.0pyproject.toml
PyPIlevenshtein>=0.27.1,<1.0.0pyproject.toml
PyPIlxml>=6.0.0,<7.0.0pyproject.toml
PyPImarkupsafe>=3.0.3,<4.0.0pyproject.toml
PyPImistune>=3.1.3,<4.0.0pyproject.toml
PyPImongoengine>=0.29.1,<1.0.0pyproject.toml
PyPInetaddr>=1.3.0,<2.0.0pyproject.toml
PyPIpillow>=11.0.0,<13.0.0pyproject.toml
PyPIpydenticon>=0.3.1,<1.0.0pyproject.toml
PyPIpymongo>=4.11.3,<5.0.0pyproject.toml
PyPIpython-dateutil>=2.9.0.post0,<3.0.0pyproject.toml
PyPIrdflib>=7.1.3,<8.0.0pyproject.toml
PyPIredis>=5.0.0,<8.0.0pyproject.toml
PyPIrequests>=2.32.4,<3.0.0pyproject.toml
PyPIsaxonche>=12.8.0,<13.0.0pyproject.toml
PyPIsentry-sdk>=2.23.1,<3.0.0pyproject.toml
PyPIspeaklater>=1.3,<2.0.0pyproject.toml
PyPItlds>=2025022800pyproject.toml
PyPItyping-extensions>=4.12.2,<5.0.0pyproject.toml
PyPItzdatapyproject.toml
PyPIurlextract>=1.9.0,<2.0.0pyproject.toml
PyPIurllib3>=2.0.0,<3.0.0pyproject.toml
PyPIvoluptuous>=0.15.2,<1.0.0pyproject.toml
PyPIwerkzeug>=3.0.0,<4.0.0pyproject.toml
PyPIwtforms>=3.2.1,<4.0.0pyproject.toml
PyPIwtforms-json>=0.3.5,<1.0.0pyproject.toml
PyPIqrcode>=8.2,<9.0pyproject.toml
PyPIelasticsearch>=7.17.0,<8.0.0pyproject.toml
PyPIelasticsearch-dsl>=7.4.0,<8.0.0pyproject.toml
PyPIbeautifulsoup4>=4.14.3,<5.0.0pyproject.toml
PyPImarkdown>=3.10,<4.0pyproject.toml
All dependencies 172

Full resolved dependency set from the GitHub dependency graph: 67 direct and 105 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
PyPIauthlib1.7.2direct
PyPIawesome-slugify1.6.5direct
PyPIbabel2.18.0direct
PyPIbcrypt4.3.0direct
PyPIbeautifulsoup44.15.0direct
PyPIbleach6.4.0direct
PyPIblinker1.9.0direct
PyPIboto31.43.36direct
PyPIbotocore1.43.36direct
PyPIcelery5.6.3direct
PyPIcelerybeat-mongo0.2.0direct
PyPIclick8.4.2direct
PyPIelasticsearch7.17.13direct
PyPIelasticsearch-dsl7.4.1direct
PyPIemail-validator2.3.0direct
PyPIfactory-boy3.3.3direct
PyPIfeedgenerator2.2.1direct
PyPIflask3.1.3direct
PyPIflask-babel4.0.0direct
PyPIflask-caching2.4.0direct
PyPIflask-cdn1.5.3direct
PyPIflask-gravatar0.5.0direct
PyPIflask-login0.6.3direct
PyPIflask-mail0.10.0direct
PyPIflask-principal0.4.0direct
PyPIflask-restx1.3.2direct
PyPIflask-security5.8.1direct
PyPIflask-sitemap0.4.0direct
PyPIflask-storage1.4.5direct
PyPIflask-wtf1.3.0direct
PyPIgeojson3.3.0direct
PyPIgeomet1.1.0direct
PyPIhtml2text2025.4.15direct
PyPIhumanfriendly10.0direct
PyPIimportlib-resources7.1.0direct
PyPIitsdangerous2.2.0direct
PyPIjinja23.1.6direct
PyPIjsonschema4.26.0direct
PyPIkombu5.6.2direct
PyPIlangdetect1.0.9direct
PyPIlevenshtein0.27.3direct
PyPIlxml6.1.1direct
PyPImarkdown3.10.2direct
PyPImarkupsafe3.0.3direct
PyPImistune3.3.2direct
PyPImongoengine0.29.3direct
PyPInetaddr1.3.0direct
PyPIpillow12.2.0direct
PyPIpydenticon0.3.1direct
PyPIpymongo4.17.0direct
PyPIpython-dateutil2.9.0.post0direct
PyPIqrcode8.2direct
PyPIrdflib7.6.0direct
PyPIredis6.4.0direct
PyPIrequests2.34.2direct
PyPIsaxonche12.9.0direct
PyPIsentry-sdk2.63.0direct
PyPIspeaklater1.3direct
PyPItlds2026041800direct
PyPItyping-extensions4.15.0direct
PyPItzdata2026.2direct
PyPIurlextract1.9.0direct
PyPIurllib32.7.0direct
PyPIvoluptuous0.16.0direct
PyPIwerkzeug3.1.8direct
PyPIwtforms3.2.2direct
PyPIwtforms-json0.3.5direct
PyPIamqp5.3.1indirect
PyPIaniso860110.0.1indirect
PyPIasttokens3.0.1indirect
PyPIasync-timeout5.0.1indirect
PyPIattrs26.1.0indirect
PyPIbilliard4.2.4indirect
PyPIbuild1.5.0indirect
PyPIcachelib0.14.0indirect
PyPIcertifi2026.6.17indirect
PyPIcffi2.0.0indirect
PyPIcfgv3.5.0indirect
PyPIcharset-normalizer3.4.7indirect
PyPIclick-didyoumean0.3.1indirect
PyPIclick-plugins1.1.1.2indirect
PyPIclick-repl0.3.0indirect
PyPIcolorama0.4.6indirect
PyPIcoverage7.14.3indirect
PyPIcryptography49.0.0indirect
PyPIdecorator5.3.1indirect
PyPIdistlib0.4.3indirect
PyPIdnspython2.8.0indirect
PyPIexecnet2.1.2indirect
PyPIexecuting2.2.1indirect
PyPIfaker40.21.0indirect
PyPIfeedparser6.0.12indirect
PyPIfilelock3.29.4indirect
PyPIflake87.3.0indirect
PyPIflask-shell-ipython0.5.3indirect
PyPIghp-import2.1.0indirect
PyPIhttpretty1.1.4indirect
PyPIidentify2.6.19indirect
PyPIidna3.18indirect
PyPIiniconfig2.3.0indirect
PyPIinvoke3.0.3indirect
PyPIipython9.15.0indirect
PyPIipython-pygments-lexers1.1.1indirect
PyPIjedi0.20.0indirect
PyPIjmespath1.1.0indirect
PyPIjoserfc1.7.1indirect
PyPIjsonschema-specifications2025.9.1indirect
PyPIlibpass1.9.3indirect
PyPImatplotlib-inline0.2.2indirect
PyPImccabe0.7.0indirect
PyPImergedeep1.3.4indirect
PyPImkdocs1.6.1indirect
PyPImkdocs-get-deps0.2.2indirect
PyPImock5.2.0indirect
PyPInodeenv1.10.0indirect
PyPIpackaging26.2indirect
PyPIparso0.8.7indirect
PyPIpathspec1.1.1indirect
PyPIpexpect4.9.0indirect
PyPIpip26.1.2indirect
PyPIpip-tools7.5.3indirect
PyPIplatformdirs4.10.0indirect
PyPIpluggy1.6.0indirect
PyPIpre-commit4.6.0indirect
PyPIprompt-toolkit3.0.52indirect
PyPIpsutil7.2.2indirect
PyPIptyprocess0.7.0indirect
PyPIpure-eval0.2.3indirect
PyPIpycodestyle2.14.0indirect
PyPIpycparser3.0indirect
PyPIpyflakes3.4.0indirect
PyPIpygments2.20.0indirect
PyPIpyparsing3.3.2indirect
PyPIpyproject-hooks1.2.0indirect
PyPIpyreadline33.5.6indirect
PyPIpytest9.1.1indirect
PyPIpytest-cov7.1.0indirect
PyPIpytest-env1.6.0indirect
PyPIpytest-flask1.3.0indirect
PyPIpytest-mock3.15.1indirect
PyPIpytest-sugar1.1.1indirect
PyPIpytest-xdist3.8.0indirect
PyPIpython-discovery1.4.2indirect
PyPIpython-dotenv1.2.2indirect
PyPIpytz2026.2indirect
PyPIpyyaml6.0.3indirect
PyPIpyyaml-env-tag1.1indirect
PyPIrapidfuzz3.14.5indirect
PyPIreferencing0.37.0indirect
PyPIregex2026.6.28indirect
PyPIrequests-mock1.12.1indirect
PyPIrpds-py2026.5.1indirect
PyPIruff0.15.20indirect
PyPIs3transfer0.19.0indirect
PyPIsetuptools82.0.1indirect
PyPIsgmllib3k1.0.0indirect
PyPIsix1.17.0indirect
PyPIsoupsieve2.8.4indirect
PyPIstack-data0.6.3indirect
PyPItermcolor3.3.0indirect
PyPItinycss21.5.1indirect
PyPItomli2.4.1indirect
PyPItraitlets5.15.1indirect
PyPItzlocal5.4.3indirect
PyPIunidecode0.4.21indirect
PyPIuritools6.1.2indirect
PyPIvine5.1.0indirect
PyPIvirtualenv21.5.1indirect
PyPIwatchdog6.0.0indirect
PyPIwcwidth0.8.1indirect
PyPIwebencodings0.5.1indirect
PyPIwheel0.47.0indirect
Dependency advisories 2

This repository publishes no package the index resolves, so its own dependency graph was assessed — 172 packages, which also include development and test pins that never ship: 2 carry known advisories, of which 1 are direct.

PackageVersionRelationSeverityAdvisoriesFixed in
pillow12.2.0directcritical2212.3.0
setuptools82.0.1indirectmoderate283.0.0

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.