Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-23 11:00 UTC

opendatateam / udata

Customizable and skinnable social platform dedicated to open data.

PythonAGPL-3.0★ 266 зірок⑂ 93 форкиз квіт. 2014 р.Переглянути на GitHub ↗

opendatateam/udata має індекс здоров’я 76 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (99/100), найнижчий — Security (59/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

76
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

76
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Open Data TeamОрганізація
27 підписників48 публічних репозиторіївз трав. 2016 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
PyPIudata17.0.5-1 3170 днів томуudataopen-dataportaldata

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

99Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
35.3/36Ритм комітів — 51/52 тижнів із комітами
18/18Обсяг комітів — 435 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year435
human_commit_share0,84
days_since_last_push0
active_weeks_last_year51
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 100 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~8,5 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count100
latest_release_tagv17.0.5
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases8,5
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

69Помірний · 18% загального індексу
Як обчислюється оцінка
39.3/60Зірки — 266 зірок
16.4/25Форки — 93 форків
6/15Спостерігачі — 13 спостерігачів
Використані вхідні дані
forks93
stars266
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (AGPL-3.0)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
7.2/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateтак
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

70Добрий · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
10.4/22.5Розподіл комітів — головний контриб’ютор — автор 54% комітів
13.5/13.5Широта контриб’юторів — 49 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 56 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled49
top_contributor_share0,537
Як обчислюється оцінка
39.5/46.8Вирішення issue — закрито 84% issue
31.8/38.3Прийняття PR — злито 2 635/3 165 вирішених PR
12/15OpenSSF Scorecard: Code-Review — Found 24/28 approved changesets -- score normalized to 8
Використані вхідні дані
merged_prs2 635
open_issues99
closed_issues541
issue_closed_ratio0,845
closed_unmerged_prs530
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
10.4/25Охоплення власника — 27 підписників у opendatateam
24.3/25Послужний список — 48 публічних репозиторіїв, вік облікового запису ~10 р.
Використані вхідні дані
followers27
owner_typeOrganization
is_verified
owner_loginopendatateam
public_repos48
account_age_days3 723

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у pypi
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 1 317 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesudata
ecosystemspypi
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

76Добрий · 20% загального індексу
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
16/16Конфігурація лінтера
9.6/9.6Pre-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
Використані вхідні дані
has_ciні
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configтак

Документація

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — http://udata.readthedocs.org
10/10Опис репозиторію
10/10Теми — 7 тем
0/10Wiki
Використані вхідні дані
topicspython, opendata, flask, vue, vuejs, flask-restplus, portal
has_wikiні
homepagehttp://udata.readthedocs.org
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

59Помірний · 16% загального індексу

Стан безпеки

57Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
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 — немає даних
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — 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 — немає даних
0/5Pinned-Dependencies — немає даних
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 — немає даних
0/7.5Token-Permissions — немає даних
0/7.5Vulnerabilities — 14 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5,7
Виключено з оцінювання (немає даних або не застосовно): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Залишкові ваги перенормовано.
Як обчислюється оцінка
9.5/35Прямі залежності без відомих сповіщень — уражено 1: pillow 12.2.0 (critical 9.1)
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
40/40Немає задавнених сповіщень — жодне сповіщення не є публічним довше за 90 дн.
Використані вхідні дані
sourceosv
advisories24
affected_packages2
assessed_packages172
unassessed_packages0
affected_by_severitycritical 1, moderate 1
direct_affected_packages1
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень. Залишкові ваги перенормовано. Звірено 172 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

66Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 73 з 84 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,869
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes7 943
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
10/10Відтворюване середовище — Dockerfile, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
8/8Автоматизоване супроводження — 16 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilesuv.lock
has_dockerfileтак
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,16
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
0/45Типізований код — Python без конфігурації перевірки типів
54.4/55Керовані розміри файлів — 6/562 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes128 718
source_files_sampled562
oversized_source_files6

Ключові факти

266зірок GitHub
49контриб'юторів
435комітів за останні 12 місяців
0днів від останнього пушу
100релізів
1бас-фактор
99відкритих issue
PyPIпакетних екосистем

Попередження щодо збору даних

  • 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

Докладніше

Історія зірок і форків 0 ★ / 93 ⇿
0Зірки
93Форки
99Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

0204060801009132014-052020-062026-07
Мажорні 7Мінорні 33Патчі 59

Кожна точка охоплює 12 днів.

OpenSSF Scorecard 5.7 / 10
5.7сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-23 10:59 UTC

10Binary-Artifactsno binaries found in the repo
н/дBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests21 out of 26 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
8Code-ReviewFound 24/28 approved changesets -- score normalized to 8
10Contributorsproject has 56 contributing companies or organizations
н/дDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
н/дPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
н/дToken-PermissionsNo tokens found
0Vulnerabilities14 existing vulnerabilities detected
Прямі залежності 67
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 172

Повний розв'язаний набір залежностей із графа залежностей GitHub: 67 прямих і 105 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

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

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 172 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 2 мають відомі сповіщення, з них 1 прямі.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
pillow12.2.0прямакритична2212.3.0
setuptools82.0.1непрямапомірна283.0.0

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

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

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаPyPI.