Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 11:00 UTC

opendatateam / udata

Customizable and skinnable social platform dedicated to open data.

PythonAGPL-3.0★ 266 estrellas⑂ 93 forksdesde abr 2014Ver en GitHub ↗

opendatateam/udata tiene un índice de salud de 76 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Vitality (99/100) y la más baja, Security (59/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

76
global / 100
Bueno

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

76
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Open Data TeamOrganización
27 seguidores48 repositorios públicosdesde may 2016

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIudata17.0.5-1317hace 0 díasudataopen-dataportaldata

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

99Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
35.3/36Cadencia de commits — 51/52 semanas con commits
18/18Volumen de commits — 435 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year435
human_commit_share0,84
days_since_last_push0
active_weeks_last_year51
Cómo se puntúa
27/27Publica versiones — 100 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~8,5 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count100
latest_release_tagv17.0.5
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases8,5
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

69Moderado · 18% del índice global
Cómo se puntúa
39.3/60Estrellas — 266 estrellas
16.4/25Forks — 93 forks
6/15Observadores — 13 observadores
Datos de entrada utilizados
forks93
stars266
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (AGPL-3.0)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
7.2/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

70Bueno · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
10.4/22.5Distribución de commits — el principal contribuyente firma el 54% de los commits
13.5/13.5Amplitud de contribuyentes — 49 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 56 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled49
top_contributor_share0,537
Cómo se puntúa
39.5/46.8Resolución de issues — 84% de issues cerradas
31.8/38.3Aceptación de PR — 2635/3165 PR decididos fusionados
12/15OpenSSF Scorecard: Code-Review — Found 24/28 approved changesets -- score normalized to 8
Datos de entrada utilizados
merged_prs2635
open_issues99
closed_issues541
issue_closed_ratio0,845
closed_unmerged_prs530
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
10.4/25Alcance del propietario — 27 seguidores de opendatateam
24.3/25Trayectoria — 48 repos públicos, cuenta de ~10 años
Datos de entrada utilizados
followers27
owner_typeOrganization
is_verified
owner_loginopendatateam
public_repos48
account_age_days3723
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 1317 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesudata
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

76Bueno · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
16/16Configuración de linter
9.6/9.6Hooks de pre-commit
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 21 out of 26 merged PRs checked by a CI test -- score normalized to 8
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_config
has_precommit_config

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://udata.readthedocs.org
10/10Descripción del repositorio
10/10Topics — 7 topics
0/10Wiki
Datos de entrada utilizados
topicspython, opendata, flask, vue, vuejs, flask-restplus, portal
has_wikino
homepagehttp://udata.readthedocs.org
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

59Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
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 — sin datos
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — 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 — sin datos
0/5Pinned-Dependencies — sin datos
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 — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 14 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5,7
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.
Cómo se puntúa
9.5/35Dependencias directas libres de avisos conocidos — 1 afectados: pillow 12.2.0 (critical 9.1)
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories24
affected_packages2
assessed_packages172
unassessed_packages0
affected_by_severitycritical 1, moderate 1
direct_affected_packages1
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos. Los pesos restantes se han renormalizado. Se cotejaron 172 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

66Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 73 de 84 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,869
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes7943
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — Dockerfile, lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
8/8Mantenimiento automatizado — 16 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesuv.lock
has_dockerfile
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,16
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
54.4/55Tamaños de archivo manejables — 6/562 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes128.718
source_files_sampled562
oversized_source_files6

Datos clave

266estrellas de GitHub
49contribuidores
435commits en los últimos 12 meses
0días desde el último push
100versiones publicadas
1factor bus
99issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Historial de estrellas y forks 0 ★ / 93 ⇿
0Estrellas
93Forks
99Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

0204060801009132014-052020-062026-07
Mayor 7Menor 33Parche 59

Cada punto abarca 12 días.

OpenSSF Scorecard 5.7 / 10
5.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 10:59 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests21 out of 26 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
8Code-ReviewFound 24/28 approved changesets -- score normalized to 8
10Contributorsproject has 56 contributing companies or organizations
n/dDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities14 existing vulnerabilities detected
Dependencias directas 67
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias 172

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 67 paquetes directos y 105 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

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

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 172 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 2 tienen avisos conocidos, de los cuales 1 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
pillow12.2.0directacrítica2212.3.0
setuptools82.0.1indirectamoderada283.0.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI.