Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-23 11:00 UTC

opendatateam / udata

Customizable and skinnable social platform dedicated to open data.

PythonAGPL-3.0★ 266 Sterne⑂ 93 Forksseit Apr. 2014Auf GitHub ansehen ↗

opendatateam/udata erreicht einen Gesundheitsindex von 76 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Vitality (99/100) ab, am schwächsten bei Security (59/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

76
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

76
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Open Data TeamOrganisation
27 Follower48 öffentliche Reposseit Mai 2016

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
PyPIudata17.0.5-1.317vor 0 Tagenudataopen-dataportaldata

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

99Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
35.3/36Commit-Rhythmus — 51/52 Wochen mit Commits
18/18Commit-Volumen — 435 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year435
human_commit_share0,84
days_since_last_push0
active_weeks_last_year51

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 100 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 8,5 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count100
latest_release_tagv17.0.5
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases8,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

69Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
39.3/60Stars — 266 Stars
16.4/25Forks — 93 Forks
6/15Watcher — 13 Watcher
Verwendete Eingangsdaten
forks93
stars266
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (AGPL-3.0)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
7.2/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templateja
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

70Gut · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
10.4/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 54 % der Commits
13.5/13.5Breite der Beitragenden — 49 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 56 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled49
top_contributor_share0,537
Wie die Bewertung erfolgt
39.5/46.8Issue-Lösungsquote — 84 % der Issues geschlossen
31.8/38.3PR-Annahme — 2.635/3.165 entschiedene PRs gemergt
12/15OpenSSF Scorecard: Code-Review — Found 24/28 approved changesets -- score normalized to 8
Verwendete Eingangsdaten
merged_prs2.635
open_issues99
closed_issues541
issue_closed_ratio0,845
closed_unmerged_prs530
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
10.4/25Reichweite des Inhabers — 27 Follower von opendatateam
24.3/25Kontohistorie — 48 öffentliche Repos, Kontoalter ca. 10 Jahre
Verwendete Eingangsdaten
followers27
owner_typeOrganization
is_verified
owner_loginopendatateam
public_repos48
account_age_days3.723

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 1.317 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesudata
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

76Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
0/24CI-Workflows
24/24Tests vorhanden
16/16Linter-Konfiguration
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
Verwendete Eingangsdaten
has_cinein
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_configja

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — http://udata.readthedocs.org
10/10Repository-Beschreibung
10/10Topics — 7 Topics
0/10Wiki
Verwendete Eingangsdaten
topicspython, opendata, flask, vue, vuejs, flask-restplus, portal
has_wikinein
homepagehttp://udata.readthedocs.org
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

59Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
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 — keine Daten
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — 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 — keine Daten
0/5Pinned-Dependencies — keine Daten
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 — keine Daten
0/7.5Token-Permissions — keine Daten
0/7.5Vulnerabilities — 14 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
9.5/35Direkte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: pillow 12.2.0 (critical 9.1)
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
40/40Keine offenen Advisories — kein Advisory ist länger als 90 Tage öffentlich
Verwendete Eingangsdaten
sourceosv
advisories24
affected_packages2
assessed_packages172
unassessed_packages0
affected_by_severitycritical 1, moderate 1
direct_affected_packages1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories. Die verbleibenden Gewichte wurden renormalisiert. 172 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

66Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 73 von 84 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,869
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes7.943
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
8/8Automatisierte Wartung — 16 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesuv.lock
has_dockerfileja
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,16
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Python ohne Typprüfungs-Konfiguration
54.4/55Handhabbare Dateigrößen — 6/562 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes128.718
source_files_sampled562
oversized_source_files6

Eckdaten

266GitHub-Sterne
49Mitwirkende
435Commits, letzte 12 Monate
0Tage seit letztem Push
100Releases
1Bus-Faktor
99offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 93 ⇿
0Sterne
93Forks
99Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

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

Jeder Punkt umfasst 12 Tage.

OpenSSF Scorecard 5.7 / 10
5.7Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-23 10:59 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-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
k. A.Dangerous-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
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
0Vulnerabilities14 existing vulnerabilities detected
Direkte Abhängigkeiten 67
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten 172

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 67 direkte und 105 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

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

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 172 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 2 tragen bekannte Advisories, davon 1 direkte.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
pillow12.2.0direktkritisch2212.3.0
setuptools82.0.1indirektmittel283.0.0

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.