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

in2code-de / powermail

This is the official repository of the TYPO3 extension powermail! Powermail is a well-known, editor-friendly, powerful and easy mailform extension for TYPO3

PHPЛіцензію не виявлено★ 100 зірок⑂ 191 форкз вер. 2016 р.Переглянути на GitHub ↗

in2code-de/powermail має індекс здоров’я 68 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (85/100), найнижчий — AI Readiness (36/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

68
загалом / 100
Помірний

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

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

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

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

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

Власність

In2code GmbHОрганізація
28 підписників98 публічних репозиторіївз лют. 2015 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
Packagistin2code/powermail13.1.038 829152130 днів томуformtypo3mailformspamprevention

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

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

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

85Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
19.4/36Ритм комітів — 28/52 тижнів із комітами
16.7/18Обсяг комітів — 71 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 3 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year71
human_commit_share1
days_since_last_push0
active_weeks_last_year28
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 20 релізів
27/36Свіжість релізів — останній реліз 130 дн. тому
27/27Ритм релізів — реліз кожні ~27,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count20
latest_release_tag13.1.0
releases_from_tagsні
days_since_latest_release130
mean_days_between_releases27,3
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

50Помірний · 18% загального індексу
Як обчислюється оцінка
32.4/60Зірки — 100 зірок
19/25Форки — 191 форків
6/15Спостерігачі — 13 спостерігачів
Використані вхідні дані
forks191
stars100
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
0/22.5Ліцензія — файлу ліцензії не виявлено
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseні
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
61.2/80Щомісячні завантаження — 38 829 завантажень/місяць у packagist
10.9/20Залежні пакети в реєстрі — залежних пакетів: 42
Використані вхідні дані
packagesin2code/powermail
dependents42
ecosystemspackagist
total_downloads2 630 121
monthly_downloads38 829

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

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

65Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
7.1/22.5Розподіл комітів — головний контриб’ютор — автор 68% комітів
13.5/13.5Широта контриб’юторів — 100 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled100
top_contributor_share0,683
Як обчислюється оцінка
41.7/46.8Вирішення issue — закрито 89% issue
22.4/38.3Прийняття PR — злито 265/452 вирішених PR
3/15OpenSSF Scorecard: Code-Review — Found 6/23 approved changesets -- score normalized to 2
Використані вхідні дані
merged_prs265
open_issues101
closed_issues829
issue_closed_ratio0,891
closed_unmerged_prs187
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
10.5/25Охоплення власника — 28 підписників у in2code-de
25/25Послужний список — 98 публічних репозиторіїв, вік облікового запису ~11 р.
Використані вхідні дані
followers28
owner_typeOrganization
is_verified
owner_loginin2code-de
public_repos98
account_age_days4 170

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у packagist
35/35Свіжість публікацій — остання публікація 130 дн. тому
20/20Історія версій — 152 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesin2code/powermail
ecosystemspackagist
any_deprecatedні
min_days_since_publish130

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

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

85Відмінний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .php-cs-fixer.php, phpstan.neon
0/9.6Pre-commit-хуки
6.4/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 4 out of 6 merged PRs checked by a CI test -- score normalized to 6
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigтак
has_linter_configтак
has_precommit_configні

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

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://in2code.de
10/10Опис репозиторію
10/10Теми — 5 тем
0/10Wiki
Використані вхідні дані
topicspowermail, typo3, typo3-cms-extension, form, mailform-extension
has_wikiні
homepagehttps://in2code.de
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

45У зоні ризику · 16% загального індексу

Стан безпеки

45У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — немає даних
1.5/2.5CI-Tests — 4 out of 6 merged PRs checked by a CI test -- score normalized to 6
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 6/23 approved changesets -- score normalized to 2
2.5/2.5Contributors — project has 30 contributing companies or organizations
0/10Dangerous-Workflow — немає даних
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Ліцензія — license file not detected
7.5/7.5Maintained — 3 commit(s) and 13 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 — немає даних
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate4,5
Виключено з оцінювання (немає даних або не застосовно): branch_protection, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Залишкові ваги перенормовано.

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

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

36У зоні ризику · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
24.5/40Читабельна історія комітів — намір зазначено у 46 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,46
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .php-cs-fixer.php, phpstan.neon
0/11Статична перевірка типів
0/10Відтворюване середовище
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
0/45Типізований код — PHP без конфігурації перевірки типів
54.7/55Керовані розміри файлів — 2/328 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePHP
largest_source_bytes141 697
source_files_sampled328
oversized_source_files2

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

100зірок GitHub
100контриб'юторів
71комітів за останні 12 місяців
0днів від останнього пушу
20релізів
1бас-фактор
101відкритих issue
Packagistпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Докладніше

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

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

0408012016020018832016-092021-072026-05
Мажорні 2Мінорні 4Патчі 14

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

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

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-23 11:33 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
6CI-Tests4 out of 6 merged PRs checked by a CI test -- score normalized to 6
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 6/23 approved changesets -- score normalized to 2
10Contributorsproject has 30 contributing companies or organizations
н/дDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained3 commit(s) and 13 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
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 2
РеєстрПакетОбмеження версіїМаніфест
Packagisttypo3/cms-core^13.4composer.json
Packagistsymfony/rate-limiter^7.2composer.json
Усі залежності 55

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

РеєстрПакетВерсіяЗв'язок
Packagistsymfony/rate-limiterпряма
Packagisttypo3/cms-coreпряма
npm@babel/core^7.16.0непряма
npm@babel/preset-env^7.16.4непряма
npm@rollup/plugin-babel^5.3.0непряма
npm@rollup/plugin-commonjs^21.0.1непряма
npm@rollup/plugin-node-resolve^13.0.6непряма
npmgulp^4.0.2непряма
npmgulp-plumber^1.2.1непряма
npmgulp-rename^2.0.0непряма
npmgulp-sass^5.0.0непряма
npmgulp-uglify^3.0.2непряма
npmmoment^2.29.2непряма
npmrollup^2.61.1непряма
npmrollup-plugin-terser^7.0.2непряма
npmsass^1.80.5непряма
Packagistbehat/behatнепряма
Packagistbehat/mink-selenium2-driverнепряма
Packagistdrevops/behat-screenshotнепряма
Packagistext-curlнепряма
Packagistext-fileinfoнепряма
Packagistext-gdнепряма
Packagistext-jsonнепряма
Packagistfriends-of-behat/mink-browserkit-driverнепряма
Packagistfriends-of-behat/mink-extensionнепряма
Packagistfriendsofphp/php-cs-fixerнепряма
Packagisthelmich/typo3-typoscript-lintнепряма
Packagistmikey179/vfsstreamнепряма
Packagistphpнепряма
Packagistphpmd/phpmdнепряма
Packagistphpoffice/phpspreadsheetнепряма
Packagistphpstan/phpstanнепряма
Packagistse/selenium-server-standaloneнепряма
Packagistsquizlabs/php_codesnifferнепряма
Packagistsymfony/configнепряма
Packagisttypo3/cms-adminpanelнепряма
Packagisttypo3/cms-belogнепряма
Packagisttypo3/cms-beuserнепряма
Packagisttypo3/cms-dashboardнепряма
Packagisttypo3/cms-extbaseнепряма
Packagisttypo3/cms-extensionmanagerнепряма
Packagisttypo3/cms-feloginнепряма
Packagisttypo3/cms-filelistнепряма
Packagisttypo3/cms-fluid-styled-contentнепряма
Packagisttypo3/cms-frontendнепряма
Packagisttypo3/cms-infoнепряма
Packagisttypo3/cms-installнепряма
Packagisttypo3/cms-lowlevelнепряма
Packagisttypo3/cms-recordlistнепряма
Packagisttypo3/cms-rte-ckeditorнепряма
Packagisttypo3/cms-schedulerнепряма
Packagisttypo3/cms-setupнепряма
Packagisttypo3/cms-t3editorнепряма
Packagisttypo3/cms-tstemplateнепряма
Packagisttypo3/testing-frameworkнепряма
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies carried a version and a supported ecosystem

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "powermail",
        "typo3",
        "typo3-cms-extension",
        "form",
        "mailform-extension"
      ],
      "is_fork": false,
      "size_kb": 33928,
      "has_wiki": false,
      "homepage": "https://in2code.de",
      "languages": {
        "PHP": 1092654,
        "HTML": 133405,
        "SCSS": 22253,
        "Shell": 1630,
        "Gherkin": 113719,
        "JavaScript": 51800
      },
      "pushed_at": "2026-07-23T11:31:24Z",
      "created_at": "2016-09-20T11:56:04Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T06:43:33Z",
      "description": "This is the official repository of the TYPO3 extension powermail! Powermail is a well-known, editor-friendly, powerful and easy mailform extension for TYPO3",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "typo3-v13",
      "license_spdx_raw": null,
      "primary_language": "PHP",
      "significant_languages": [
        "PHP"
      ]
    },
    "owner": {
      "blog": "https://www.in2code.de",
      "name": "In2code GmbH",
      "type": "Organization",
      "login": "in2code-de",
      "company": null,
      "location": "Rosenheim",
      "followers": 28,
      "avatar_url": "https://avatars.githubusercontent.com/u/11091167?v=4",
      "created_at": "2015-02-20T13:40:54Z",
      "is_verified": null,
      "public_repos": 98,
      "account_age_days": 4170
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "13.1.0",
          "kind": "minor",
          "published_at": "2026-03-14T13:43:00Z"
        },
        {
          "tag": "12.6.0",
          "kind": "minor",
          "published_at": "2026-03-14T13:42:29Z"
        },
        {
          "tag": "12.5.4",
          "kind": "patch",
          "published_at": "2025-10-15T09:05:30Z"
        },
        {
          "tag": "13.0.4",
          "kind": "patch",
          "published_at": "2025-10-15T09:03:39Z"
        },
        {
          "tag": "13.0.3",
          "kind": "patch",
          "published_at": "2025-09-16T12:08:24Z"
        },
        {
          "tag": "13.0.2",
          "kind": "patch",
          "published_at": "2025-08-01T05:51:43Z"
        },
        {
          "tag": "13.0.1",
          "kind": "patch",
          "published_at": "2025-07-22T07:53:26Z"
        },
        {
          "tag": "12.5.3",
          "kind": "patch",
          "published_at": "2025-07-22T07:52:48Z"
        },
        {
          "tag": "12.5.2",
          "kind": "patch",
          "published_at": "2025-07-11T10:07:14Z"
        },
        {
          "tag": "13.0.0",
          "kind": "major",
          "published_at": "2025-07-11T10:48:48Z"
        },
        {
          "tag": "12.5.1",
          "kind": "patch",
          "published_at": "2025-07-11T10:09:30Z"
        },
        {
          "tag": "12.5.0",
          "kind": "minor",
          "published_at": "2025-07-11T10:07:48Z"
        },
        {
          "tag": "12.4.4",
          "kind": "patch",
          "published_at": "2024-11-09T10:31:17Z"
        },
        {
          "tag": "12.4.3",
          "kind": "patch",
          "published_at": "2024-11-09T10:30:50Z"
        },
        {
          "tag": "12.4.2",
          "kind": "patch",
          "published_at": "2024-10-02T15:52:55Z"
        },
        {
          "tag": "12.4.1",
          "kind": "patch",
          "published_at": "2024-10-02T15:54:31Z"
        },
        {
          "tag": "12.4.0",
          "kind": "minor",
          "published_at": "2024-10-02T15:55:11Z"
        },
        {
          "tag": "12.3.5",
          "kind": "patch",
          "published_at": "2024-06-07T14:58:07Z"
        },
        {
          "tag": "10.0.0",
          "kind": "major",
          "published_at": "2022-04-13T15:30:36Z"
        },
        {
          "tag": "9.0.2",
          "kind": "patch",
          "published_at": "2022-04-12T07:32:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7c7005f83914193ca2d5dcdaca55c11bc0d06bab",
          "body": "The handling of possible null values in text fields changed with mysql 8.0.13\nand mariadb 10.2.1. `NOT NULL` without a defined default value was not allowed\nanymore. Setting a default value prevents exceptions in the backend and\n(possible) other places.\n\nRelated: in2code-pro/powermail#163\nRelated: in2code-de/powermail#1364\nRelated: in2code-de/powermail#1342\n(cherry picked from commit 6e14fed3593a7f83f6288c6cfde021bdbd604719)",
          "is_bot": false,
          "headline": "[BUGFIX] Make powermail work with supported db versions",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-06-22T10:50:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e44929f647fe1150453e288792c5e2da1653b6e",
          "body": "This reverts commit 16797e1c18972938bea6adbf603cb9dc920d6ed5.",
          "is_bot": false,
          "headline": "Revert \"[BUGFIX] Remove \"NOT NULL\" annotation from text fields\"",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-06-19T14:17:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fbec7f37b90276b98192adbb3f2199e384fb25b",
          "body": "The database definition changed, in a powermail version 13 release.\nThis upgrade wizard helps to update all changed TEXT fields with a\ndefault value. If set to \"undone\", it can be executed as many times\nas necessary.\n\nRelated: in2code-de/powermail#1364",
          "is_bot": false,
          "headline": "[FEATURE] Provide an update wizard for TEXT fields",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-05-14T11:09:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "668da24c441bfc86655e04168411dc270106bbb4",
          "body": null,
          "is_bot": false,
          "headline": "[RELEASE] Release 13.1.0",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-03-14T13:18:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5384c6dac76d8086aa65d1b6c2ee97ddd2e18252",
          "body": "Related: in2code-de/powermail#1238\nRelated: in2code-de/powermail#1229",
          "is_bot": false,
          "headline": "[BUGFIX] Aria-required not necessary when native required present",
          "author_name": "Mohsin Khan",
          "author_login": "MohsinQK",
          "committed_at": "2026-03-13T11:54:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e12af2a604893d40cee841ea7b9e857820c6654",
          "body": "…ge to improve clarity\n\nRelated: in2code-de/powermail#1296",
          "is_bot": false,
          "headline": "[TASK] Rename the button that submits the form on the confirmation pa…",
          "author_name": "deoostfrees",
          "author_login": "deoostfrees",
          "committed_at": "2026-03-13T11:18:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1eefa542b470a3338c7bb7c5adb0a7bfe394b84",
          "body": "Related: in2code-de/powermail#1308",
          "is_bot": false,
          "headline": "[FEATURE] Make sender name in export service configurable",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-03-13T10:59:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5743ad69adcf9d085b54e8bccbf2c5a1f44b1075",
          "body": "Related: in2code-de/powermail#1321",
          "is_bot": false,
          "headline": "[BUGFIX] Set senderheader for receiver properly",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-03-13T10:36:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16797e1c18972938bea6adbf603cb9dc920d6ed5",
          "body": "Seems that TYPO3 also does not use it for \"text\"\nfields\n\nRelated: in2code-de/powermail#1342",
          "is_bot": false,
          "headline": "[BUGFIX] Remove \"NOT NULL\" annotation from text fields",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-03-13T10:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4f2bf077dc03004ba80a9eeb8d80f3c0b6f5d4d",
          "body": "…storage page is configured in plugin settings, call initFlexform to load the Flexform configuration.",
          "is_bot": false,
          "headline": "[BUGFIX] UniqueValidator resolve correct storage PID when a specific …",
          "author_name": "Stanislav Nazar",
          "author_login": "Runik51ua",
          "committed_at": "2026-03-10T16:53:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "915a8b23255b1714c9240f507291c22393986e5d",
          "body": "`FrontendUtility::getCurrentPageIdentifier()` and\n`FrontendUtility::getSysLanguageUid()` received a guard clause a while ago\nto prevent calling `getAttribute()` on a null request.\n\nWhile this solves issues with a nullable request, there are still\npotential issues with calling a method on a null return value of\n`getAttribute()`\n\nThe use of null-safe operators resolve this issue and make the guard\nclauses superfluous.\n\nFixes: #1358",
          "is_bot": false,
          "headline": "[BUGFIX] Avoid method calls on null with use of null safe operators",
          "author_name": "Alexander Schnitzler",
          "author_login": "alexanderschnitzler",
          "committed_at": "2026-03-10T16:48:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af4c06dd307ac1ac94528f9a0cd20a847389cb0e",
          "body": "…ble column restrictions\n\nForms with starttime/endtime set were invisible in both the plugin FlexForm\nselector and the Powermail backend module because TYPO3's default query\nrestrictions and Extbase enable-field handling applied frontend visibility\nrules to backend queries.\n\nFormSelectorUserFunc::ge\n[…]\ncause in both cases is that starttime, endtime and hidden are\nfrontend visibility controls registered in TCA enablecolumns. They must not\nprevent backend users from accessing or managing form records.",
          "is_bot": false,
          "headline": "[BUGFIX] Backend form selector and module must not apply frontend ena…",
          "author_name": "axel.seemann@netresearch.de",
          "author_login": null,
          "committed_at": "2026-03-05T16:33:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a25123c18437bace8482d434a2a94cef441edd3b",
          "body": null,
          "is_bot": false,
          "headline": "Change content type of Pi5 plugin",
          "author_name": "Sebastian Fischer",
          "author_login": "garbast",
          "committed_at": "2026-03-05T16:16:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6661b42b4cb19681c4ab5b540201679ee523cf67",
          "body": "The folder can be set via TypoScript on any page. A central\ncheck does not make sense, as the whole pagetree must be checked.\n\nIt's up to the integrator to provide a proper uploads folder config.\n\nRelated: in2code-de/powermail#1069",
          "is_bot": false,
          "headline": "[CLEANUP] Remove backend check for uploads folder",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-27T18:48:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc21cd666a264ce097b46e586c170e542f11adf9",
          "body": null,
          "is_bot": false,
          "headline": "[TASK] Upgrade phpstan to ^2.1 and regenerate baseline",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-27T14:15:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "396f82f4129c9312ff42a406b3ce3159f5e620aa",
          "body": "Related: in2code-de/powermail#1204",
          "is_bot": false,
          "headline": "[BUGFIX] Make ExplodeViewHelper type-safe",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-27T13:56:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aee18c9c13fb7f44ef0eef57eacdb7142ba9d948",
          "body": "Related: in2code-de/powermail#1204",
          "is_bot": false,
          "headline": "[FEATURE] Marketing: Add message if ip-api.com fails",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-27T13:55:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e6e3c15ed03c579e180d1bdb753cb6b9dc546c7",
          "body": "Fixes: in2code-de/powermail#1291",
          "is_bot": false,
          "headline": "[BUGFIX] Always show page field in powermail fields",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-25T14:34:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23105000d08fa776fd3c3b2927e214730d415f41",
          "body": "Fixes: in2code-de/powermail#1252",
          "is_bot": false,
          "headline": "[BUGFIX] Provide request object to StandaloneView",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-25T12:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9a6469b0fe622ad6711a87259c8fb0def1e520b",
          "body": "Related: in2code-de/powermail#1339",
          "is_bot": false,
          "headline": "[TASK] Update Form.min.js",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-02-25T12:37:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "112a1f1c962d5ed399fa88bd87f3063df0060394",
          "body": null,
          "is_bot": false,
          "headline": "Add morestep fieldset configuration",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a84b53b05d7da098728f1a1ece4c9e8ac9d32c6",
          "body": null,
          "is_bot": false,
          "headline": "Allow \"1\" as valid morestep validation value",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "074c782ce98413ff93c445e2262bc5063530cd94",
          "body": null,
          "is_bot": false,
          "headline": "Do not interrupt smooth scrolling on focus",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57e420692227f5b171bf8554324b2aa28df7aef5",
          "body": "* picked https://github.com/in2code-de/powermail/pull/1090/commits/342a5628882a8e0e11ef45d8a71bdbdebb5b313c",
          "is_bot": false,
          "headline": "Reset previous errors before validate visible fields",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad54ca02dee54aa0561db0754c5f62c66dbe9522",
          "body": "* part of https://github.com/in2code-de/powermail/pull/1090/commits/162c61fc97905efa9bac31508b8401af5e6ffefd",
          "is_bot": false,
          "headline": "Improve scrollIntoView behavior",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3475c6852b8388cacd5e35f2a8e35318cb100c2f",
          "body": "* without it's problamtic if the fieldsets differ in height\n* if true, the user has to scroll manually to input the new fieldset",
          "is_bot": false,
          "headline": "Scroll into view if the next fieldset is shown",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "722a73968549f7b266c7f0701dc32711b59e45b3",
          "body": "* if the data-powermail-morestep-validate attribute is set to \"true\" on morestep button (new option)\n* we validate the visible fields and scroll to the first error in error case",
          "is_bot": false,
          "headline": "Validate visible fields before proceed on morestep button click",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c6deb56ee463ee47be207c98722206968762f04",
          "body": "* to validate those fields in multistepform for example",
          "is_bot": false,
          "headline": "Add a public formValidation validateVisibleFields() method",
          "author_name": "Denis Lorch",
          "author_login": "denislorch",
          "committed_at": "2026-02-25T12:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "720f2835c5b6bb5699fcee7e367da722cc4b6cfd",
          "body": "Problem:\n- Finishers are sorted by numeric keys, which can cause custom finishers to be skipped.\n- RedirectFinisher throws a PropagateResponseException, halting execution of any finishers with higher keys.\n\nSolution:\n- Introduce a \"finally\" key in the finisher configuration.\n- If a finisher is defin\n[…]\nher\\RedirectFinisher\n    1000.class = Vendor\\Ext\\Finisher\\CustomFinisher\n}\n\nThis guarantees predictable execution order and maintains backward compatibility with manual configurations.\n\nresolves #1346",
          "is_bot": false,
          "headline": "Move RedirectFinisher to always execute last using \"finally\" key",
          "author_name": "Thomas Rawiel",
          "author_login": "thomasrawiel",
          "committed_at": "2026-02-25T10:31:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2ead512410b209d50f86d6528c1d1e23b48dd26",
          "body": null,
          "is_bot": false,
          "headline": "[DOC] Fix typo in \"receiver\" in example TypoScript",
          "author_name": "Julian Hofmann",
          "author_login": "julianhofmann",
          "committed_at": "2026-02-25T10:20:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b699baaa5bc4fe66cd32fb1a0716da13e1d8be8",
          "body": "A new spam prevention method that marks form submissions as spam\nwhen a user submits forms too often in a given time frame,\ne.g. 10x in 5 minutes.\nThis helps reducing spam flood attacks, because only the first\nsubmissions will be allowed.\n\nThe RateLimitMethod utilizes the Symfony rate limiter\nthat i\n[…]\nhe. This allows admins to share the limit across\nmultiple machines by configuring it to use a database or redis backend.\n\nHeavily inspired by Chris Müller's brotkrueml/typo3-form-rate-limit\nextension.",
          "is_bot": false,
          "headline": "[FEATURE] Add RateLimit spam check method",
          "author_name": "Christian Weiske",
          "author_login": "cweiske",
          "committed_at": "2026-01-23T18:18:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4c23da8838191d5530ed9a6b3ad078032e2028c",
          "body": "Browsers ingnore it anyway.\n\nRelated: in2code-de/powermail#789\nRelated: in2code-de/powermail#1233",
          "is_bot": false,
          "headline": "[TASK] Do not display autocomplete section for password field",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-01-23T17:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bace92cbac4ee54d9ee1ed5c1dd98d660c4ebaaf",
          "body": "Related: in2code-de/powermail#789\nRelated: in2code-de/powermail#1233",
          "is_bot": false,
          "headline": "[BUGFIX] Fix displayCond for autocomplete tokens",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-01-23T17:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fc483fa45f03eb19e2aa5647aee65e137f26d04",
          "body": "Forward port from v12 to v13\n\nThanks to Thomas Rawiel for all the work\n\nRelated: in2code-de/powermail#789\nRelated: in2code-de/powermail#1233",
          "is_bot": false,
          "headline": "[FEATURE] Provide autocomplete functionality",
          "author_name": "Thomas Rawiel",
          "author_login": "thomasrawiel",
          "committed_at": "2026-01-23T17:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cbab9b4d2cca394e7a9538f423c79842b2cc40c",
          "body": "…ails\n\nRelated: in2code-de/powermail#1321",
          "is_bot": false,
          "headline": "[BUGFIX] Use sender header configuration for optin and disclaimer e-m…",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-01-23T17:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "387434cb7c6330bc01a137535ef4147785023875",
          "body": "Related: in2code-de/powermail#1333",
          "is_bot": false,
          "headline": "[CHORE] Make phpstan happy",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-01-23T16:08:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac8b6fc31dd1ba225fb17a0b969f68213ac0cc3",
          "body": null,
          "is_bot": false,
          "headline": "[BUGFIX] Render label & description for the 'auto_marker' field",
          "author_name": "Dan Ilea",
          "author_login": "raphael-dan-ilea",
          "committed_at": "2026-01-23T15:56:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6765043960b6116f5c745a68308cb270445d9302",
          "body": "Flexform just needs the foreign_table configuration\n\nRelated: in2code-de/powermail#1331",
          "is_bot": false,
          "headline": "[TASK] Fill refindex with content - form relation",
          "author_name": "Marc Bastian Heinrichs",
          "author_login": "Mabahe",
          "committed_at": "2026-01-23T15:15:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd74546c101229f0fc3822ac214f7f6a283f01de",
          "body": null,
          "is_bot": false,
          "headline": "[TASK] Normalize indentation in FlexForm",
          "author_name": "Eric Harrer",
          "author_login": "ErHaWeb",
          "committed_at": "2026-01-23T14:46:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "190f9b4f06e54a56a75e4a7f1bc99b8f3dfd57b1",
          "body": "FlexForm definitions were updated to prevent on-the-fly migrations performed by FlexFormTools. TYPO3 v12+ introduced new TCA requirements which deprecate certain configurations.\n\n- Field `settings.flexform.receiver.type` was corrected by fixing inconsistent items ordering and removing an invalid att\n[…]\nChangelog/12.3/Deprecation-99739-IndexedArrayKeysForTCAItems.html), [Feature: #97159](https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Feature-97159-NewTCATypeLink.html#feature-97159)",
          "is_bot": false,
          "headline": "[TASK] FlexForm deprecation fixes",
          "author_name": "Eric Harrer",
          "author_login": "ErHaWeb",
          "committed_at": "2026-01-23T14:46:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71aa8117e4d71167780333c54e38d1ae0fc783f6",
          "body": null,
          "is_bot": false,
          "headline": "Add filter and sorting to pagination links",
          "author_name": "Benjamin",
          "author_login": "brannow",
          "committed_at": "2026-01-14T17:40:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe99659ec5f78014c74b4b75986d526f14933910",
          "body": null,
          "is_bot": false,
          "headline": "Add piVars to Pagination partial rendering",
          "author_name": "Benjamin",
          "author_login": "brannow",
          "committed_at": "2026-01-14T17:40:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d888bbf93de4242030f802611261051309bbcf8a",
          "body": "Related: in2code-de/powermail#1328",
          "is_bot": false,
          "headline": "[CHORE] Make php-cs-fixer happy",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2026-01-08T12:53:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e569955e4310f483952dfc759575ca55a6d217e",
          "body": null,
          "is_bot": false,
          "headline": "Update SelectFieldViewHelper.php",
          "author_name": "Klaus",
          "author_login": "kftw",
          "committed_at": "2026-01-08T12:47:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c43dd39baa288699607878acbb27b86d1c933d94",
          "body": "Releases: main, 13, 12",
          "is_bot": false,
          "headline": "Fix link formatting in Upgrade.md",
          "author_name": "Simon Schaufelberger",
          "author_login": "simonschaufi",
          "committed_at": "2026-01-08T11:35:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66edb52866c3fa9413b3a00539dbdb39f6ac91ea",
          "body": "Releases: master, 13, 12",
          "is_bot": false,
          "headline": "[DOCS] Revise AddNewFieldProperties documentation",
          "author_name": "Simon Schaufelberger",
          "author_login": "simonschaufi",
          "committed_at": "2026-01-08T11:33:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1e79d6f30b75ecda3e3d15f287d164cd9c7963f",
          "body": "Extracting the labels for the settings provides a clearer overview of\nthe setting properties itself – and avoids the issue of quoting,\nwhich has not been consistent up to now.\n\nRelated: in2code-de/powermail#1320",
          "is_bot": false,
          "headline": "[FEATURE] Extract language labels of settings",
          "author_name": "Julian Hofmann",
          "author_login": "julianhofmann",
          "committed_at": "2026-01-07T17:07:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3585d8b16e77c14f8945eae99312b65162e15295",
          "body": "To prefill a form with the current user it is needed to check if the user is logged in. This condition was broken.\n\nResolves #1323",
          "is_bot": false,
          "headline": "[BUGFIX] Fix prefilling form with current logged in user",
          "author_name": "Bastien Lutz",
          "author_login": "BastiLu",
          "committed_at": "2025-12-17T16:50:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf1534466aee0223e0e5256eb524b202a32421ab",
          "body": "Seems that the used action for ts linting is not available\nanymore. So we switch to composer based linting.",
          "is_bot": false,
          "headline": "[TASK] Switch to composer based ts linting",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-11-14T16:32:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04579efe2041a334326f20dd9dca0e730add0ec3",
          "body": "The option `'internal_type' => 'db'` in TCA for `tx_powermail_domain_model_form.pages` has been removed.\nIt is no longer needed since TYPO3 v11.5 and deprecated with v12.0.\n\nSee [Deprecation #96983](https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Deprecation-96983-TCAInternal_type.html)",
          "is_bot": false,
          "headline": "[TASK] Remove deprecated TCA `internal_type`",
          "author_name": "Eric Harrer",
          "author_login": "ErHaWeb",
          "committed_at": "2025-10-28T16:11:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e871e7f76ef05026b300df13e3bf921de031dc1",
          "body": "It is common practice to write ViewHelpers in Fluid templates in\nlowerCamelCase.\nAdherence to this standard also supports code completion in IDEs,\nfor example.",
          "is_bot": false,
          "headline": "[TASK] Standardise the spelling of ViewHelpers to lowerCamelCase",
          "author_name": "Julian Hofmann",
          "author_login": "julianhofmann",
          "committed_at": "2025-10-28T15:58:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec93125f0daad9418aba5cf40023f8bef022fe6c",
          "body": null,
          "is_bot": false,
          "headline": "Update PreventDuplicates.md",
          "author_name": "eyeworkers-gmbh",
          "author_login": "eyeworkers-gmbh",
          "committed_at": "2025-10-28T15:33:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d44745206903726b89fd8829223511f493a8c079",
          "body": "Some small bugfixes and enhancements.\n\nSee release page on github for details:\nhttps://github.com/in2code-de/powermail/releases/",
          "is_bot": false,
          "headline": "[RELEASE] 13.0.4 -- Bugfix release",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-15T08:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9f02367029d66fde6a27c000a31ed79a2d1aa24",
          "body": null,
          "is_bot": false,
          "headline": "[CLEANUP] Remove duplicate version output of php-cs-fixer",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-15T08:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb44bad8058bf989de9a3ff5cdcc7b35bd7ff9ec",
          "body": "Related: in2code-de/powermail#1302",
          "is_bot": false,
          "headline": "[TASK] Improve packaging for release to TER and GH",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-15T08:20:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "120915291293bf032abd7af3ac8ddb01ea761038",
          "body": "Related: in2code-de/powermail#1293",
          "is_bot": false,
          "headline": "[CHORE] Make php-cs-fixer happy",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-15T07:11:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "192d8a5699e1db25c3f42fd7ea843c206eaa10f3",
          "body": "…s (#1294)\n\n* [BUGFIX] Prevent infinite loop when trustedProperties validation fails\n\nIf the __trustedProperties hidden property of a form is manipulated\nor submit as empty, the HMAC validation fails, throwing an exception.\n\nThe normal exception handling then tries to forward the request to\nthe form\n[…]\ntion from the HMAC validation.\nIn such a case, a redirect to the (then empty) formAction is\nperformed and the error is logged.\n\nResolves: #1293\n\n* fix: Add BadRequestException import to FormController",
          "is_bot": false,
          "headline": "[BUGFIX] Prevent infinite loop when trustedProperties validation fail…",
          "author_name": "lorenzulrich",
          "author_login": "lorenzulrich",
          "committed_at": "2025-10-15T07:07:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da155202400ad56eec98ce458119fb1ee3c6ac0f",
          "body": "Resolves: in2code-de/powermail#1284",
          "is_bot": false,
          "headline": "[CLEANUP] Remove outdated TCA option \"canNotCollapse\"",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-10T15:36:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1f020f0073891c59e0e4320403315f498ed7049",
          "body": "Related: in2code-de/powermail#1295",
          "is_bot": false,
          "headline": "[BUGFIX] Add missing setting to site set",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-10T13:55:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "503a9bff91c01b85f4945f89b5820b5bcdf61d65",
          "body": "When there is no request object in FrontendUtility, an\nexception is logged to TYPO3s log file. These changes\nmitigates them.\n\nRelated: in2code-de/powermail#1286",
          "is_bot": false,
          "headline": "[BUGFIX] Prevent undefined global variable",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-10T12:45:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9b94190f9d74b716267061292fae728158f296a",
          "body": "…dSendEvent\n\nIt is possible to change the email and message in\nSendMailServicePrepareAndSendEvent. The results were not passed back\nto the SendMailService. This works now.\n\nRelated: in2code-de/powermail#1236",
          "is_bot": false,
          "headline": "[BUGFIX] Provide fields that are changed via SendMailServicePrepareAn…",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-10T12:05:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fba7cb1472e4d61d92bf8d13c09c1d281991fd65",
          "body": "Related: in2code-de/powermail#1206",
          "is_bot": false,
          "headline": "[BUGFIX] Prevent exception in optinConfirm with session check enabled",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-10-10T12:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d510b1d2f59977ed42016388254bc66f04a74c5",
          "body": "…k enabled\"\n\nThis reverts commit 60083b698714ff5c91994a5c19b2ef17112ef794.",
          "is_bot": false,
          "headline": "Revert \"[TASK] Require __hp field in arguments when honeypot spamchec…",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-18T15:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "456c901cb05be40b76b952d05b8d4026d9067d0a",
          "body": "…t feature\n\nRelated: #1260",
          "is_bot": false,
          "headline": "[FEATURE] Provide the current value in overwrite value from TypoScrip…",
          "author_name": "Marc Bastian Heinrichs",
          "author_login": "Mabahe",
          "committed_at": "2025-09-18T06:36:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60083b698714ff5c91994a5c19b2ef17112ef794",
          "body": "When the honeypot spamcheck is enabled, the `__hp` field\nis automatically rendered as invisible field in the\nfrontend. The spamcheck currently only checks, if the\ncontent of the field is not empty. The field can however\nbe completely omitted in the POST request, so spambots\nmay more easily find out,\n[…]\nd should\nnot be sent in the POST request.\n\nThis change hardens the honeypot spamcheck by requiring\nthe `__hp` field to be present in the POST request. If\nthe field is omitted, the spamcheck will fail.",
          "is_bot": false,
          "headline": "[TASK] Require __hp field in arguments when honeypot spamcheck enabled",
          "author_name": "Torben Hansen",
          "author_login": "derhansen",
          "committed_at": "2025-09-18T06:24:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d00ada24a1e0b7ae7460a01e2a9c6b014b093a3",
          "body": "Related in2code-de/powermail#1055",
          "is_bot": false,
          "headline": "[CLEANUP] Autocreate management db fields",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-18T06:16:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6b53b410646c7f01da592fabcf7f4bf8fc7144b",
          "body": "Related: in2code-de/powermail#468",
          "is_bot": false,
          "headline": "[FEATURE] Provide placeholder for password fields",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-18T06:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebb7c684a5f3fd7f511d3ccc1a3380037eaed587",
          "body": null,
          "is_bot": false,
          "headline": "Add lazy annotation for fields in page model",
          "author_name": "Sebastian Pfeifer",
          "author_login": "spfeifer",
          "committed_at": "2025-09-17T17:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c33463001b5e1391c265d1a755f53b65f4aa7368",
          "body": null,
          "is_bot": false,
          "headline": "Add lazy annotation for pages in form model",
          "author_name": "Sebastian Pfeifer",
          "author_login": "spfeifer",
          "committed_at": "2025-09-17T17:12:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dab073dabb5ece41678f99b20104a72276686107",
          "body": "Related: in2code-de/powermail#1186",
          "is_bot": false,
          "headline": "[CLEANUP] Remove too chatty logging",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-17T14:32:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e1209b3a98a8761f44a380d4b0010dcb6211d78",
          "body": "The database field was 255 characters long, the flexform field\nhad \"no\" limitation. The length of both fields was adjusted.\n\nRelated: https://github.com/in2code-de/powermail/issues/1230",
          "is_bot": false,
          "headline": "[TASK] Align length of receiver mail database field and flexform",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-17T14:01:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4641182c72f28dd93bbce2047fa836e7a6bb631",
          "body": "Some small bugfixes and enhancements.\n\nAlso the dependency to phpspeadsheet was updated.",
          "is_bot": false,
          "headline": "[RELEASE] 13.0.3 -- Bugfix release",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-16T11:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e562bcff61d65cab557705b844e7f8bc1f47a002",
          "body": "Since crowdin translations are solely based on the master branch,\nthese translations and labels are also used for TYPO3 v12 compatible\nreleases. In order to provide translations for old versions, we need\nto re-add that stuff.\n\nRelated: in2code-de/powermail#1272",
          "is_bot": false,
          "headline": "[BUGFIX] Re-add labels for powermail frontend",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-05T09:58:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "935bba01a00edc5583fcc82f7206b15405c45fe2",
          "body": "Previously, this attribute was only applied to the input field, not to the label itself. Due to the styles of the container, the label is visually hidden but remains accessible to screen readers, while the corresponding input field is no longer accessible.",
          "is_bot": false,
          "headline": "[TASK] Hide label of honeypot field from screenreaders, too",
          "author_name": "vanferr",
          "author_login": "vanferr",
          "committed_at": "2025-09-05T09:25:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64b395ac2d1da7e2bbb9877a0bade9bf96438bdd",
          "body": "(and update phpstan baseline with reduced errors)\n\nRelated: in2code-de/powermail#1263",
          "is_bot": false,
          "headline": "[BUGFIX] Fix possible undefined array warning for file extension",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-09-05T08:50:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71969972237595873d1339309e70df37cf24b980",
          "body": "In case a file without extension is uploaded (e.g. a filename without a dot, like \"pdf\") an exception occurs, in all other cases a graceful false generates clear error messages. This simple fix should prevent the exception.",
          "is_bot": false,
          "headline": "[BUGFIX] strtolower argument 1 must be of type string, null given",
          "author_name": "J. Peter M. Schuler",
          "author_login": "jpmschuler",
          "committed_at": "2025-09-05T08:33:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6f3a3fb35d5de11f75de75161dc792bf67791ad",
          "body": null,
          "is_bot": false,
          "headline": "Update phpoffice/phpspreadsheet to v5 (#1269)",
          "author_name": "Andreas Nedbal",
          "author_login": "pixeldesu",
          "committed_at": "2025-08-28T10:23:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c2b7846c4ace6f991192ef5126dcf1a327a680d",
          "body": "Add more methods to the event FormControllerFormActionEvent.\nIt is now possible to also retrieve the view and request from\nthis event. This makes it possible to - for example - add\nvariables to the view.\n\nRelated: in2code-de/powermail#1169",
          "is_bot": false,
          "headline": "[TASK] Add getView and getRequest to event",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-08-05T08:57:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0089f96d31d9597e0b978e237f550286215334a3",
          "body": "Powermail Frontend is only available as a premium extension.\n\nRelated: in2code-de/powermail#1253",
          "is_bot": false,
          "headline": "[CLEANUP] Remove powermail-frontend sets",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-08-04T15:07:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe8d54a4a5461541e450ff5885e23c6128189163",
          "body": "Related: in2code-de/powermail#1255",
          "is_bot": false,
          "headline": "[BUGFIX] Move styling configuration to the correct place",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-08-04T15:05:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e98a9c75bed688228c5325fee5faf7281498bda5",
          "body": null,
          "is_bot": false,
          "headline": "[BUGFIX] fix include paths in SiteSet TypoScript setup files",
          "author_name": "Gert Hammes",
          "author_login": "bahammes",
          "committed_at": "2025-08-04T15:00:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60f9b48ec163b3cc5cfa4401f3f3750abc6e0195",
          "body": null,
          "is_bot": false,
          "headline": "[BUGFIX] fix site set settings definitions for view settings",
          "author_name": "Gert Hammes",
          "author_login": "bahammes",
          "committed_at": "2025-08-04T14:51:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8db4fd5c6ad78fe96db5b4c5240d3d73833b99cc",
          "body": "This release fixes an issue, when double optin and and captcha where used at the same time.",
          "is_bot": false,
          "headline": "[RELEASE] 13.0.2 -- Bugfix release",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-29T16:01:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b1f7999567c380bf8c7b7be1eb3f779bc83d8e7",
          "body": null,
          "is_bot": false,
          "headline": "[BUGFIX] Prevent exception when using captcha and double optin",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-29T15:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b23a7520cea15e03c75b7c1b9631aa2cf347f58",
          "body": "Related: in2code-de/powermail#1192",
          "is_bot": false,
          "headline": "[CHORE] Make phpstan happy",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-22T09:11:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc625bd54d20a388044af2b87eb2f126396ed1e9",
          "body": "In order to count as a link to a `www` destination, it must be prefixed with a protocol.\n\nRelated: in2code-de/powermail#1192",
          "is_bot": false,
          "headline": "[TASK] Only count \"real\" links as links",
          "author_name": "Ayke Halder",
          "author_login": "rr-it",
          "committed_at": "2025-07-22T08:35:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "784973100c8b50f39cdbaeb90dac44284087532b",
          "body": "This release fixes an issue in the backend, where it was\npossible to download files from the server, to which an editor\ndid not have propper access permissions.",
          "is_bot": false,
          "headline": "[RELEASE] 13.0.1 -- Security release",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-22T07:28:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b39e129c5e2a797f0ccf271fea220c7933ca77bc",
          "body": "It was possible to download an arbitrary file from a TYPO3\ninstallation using the download link in the powermail module.\nThis commits adds a hmac to the link and validates it before\nstarting the download.",
          "is_bot": false,
          "headline": "[SECURITY] Add hmac validation to file downloads in be module",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-22T07:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99b2364cc6acd1ea82fc88a05ee5bc4bcbaf293c",
          "body": null,
          "is_bot": false,
          "headline": "[TASK] Adjust stability information in ext_emconf.php",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-11T10:46:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16ad58b2e9f7f18242bf9c0a907a65a7c43d6609",
          "body": null,
          "is_bot": false,
          "headline": "[DOC] Explain spam check methods",
          "author_name": "Christian Weiske",
          "author_login": "cweiske",
          "committed_at": "2025-07-11T10:33:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2433bc40702e84e7401b073f3581e0a3e0a0145",
          "body": "- support of site sets\n- support of TYPO3 country API\n- improve accessibility of fe forms\n- enable conditions for multistep forms together with EXT:powermail_cond\n\nRelated: in2code-de/powermail#943",
          "is_bot": false,
          "headline": "[RELEASE] 13.0.0 -- TYPO3 v13 compatibility, features & bugfixes",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-11T09:52:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa3c279989aeeb11f6bf3e34b4469aff64b6abc3",
          "body": "Related: in2code-de/powermail#943",
          "is_bot": false,
          "headline": "[TASK] Update changelog document",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-11T09:39:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc85d13edfee07fecc3c329aa35602e7dcab88de",
          "body": "Related: in2code-de/powermail#943",
          "is_bot": false,
          "headline": "[TASK] Update upgrade instructions",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-11T09:39:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e712d9703139d27839e83e9344f08208c5f2b095",
          "body": "Related: in2code-de/powermail#943",
          "is_bot": false,
          "headline": "[TASK] Update Readme.md",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-11T09:39:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f6cf735baf497b13097032bcdf0dcaf533f3998",
          "body": "xls is the old ms format, which is sometimes not allowed any\nmore. Replacing the export with xlsx solves the issue.\n\nRelated: in2code-pro/powermail#142",
          "is_bot": false,
          "headline": "[FEATURE] Replace xls export with xlsx format",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-09T14:39:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b4ac41953586abc5ba338a9c93465cb0e489818",
          "body": "Related: in2code-pro/powermail#156",
          "is_bot": false,
          "headline": "[BUGFIX] Prevent `Undefined global variable $TYPO3_REQUEST`",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-08T16:10:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "992d4b8d0cf63bd672a15ce6af481d04d1f592c1",
          "body": "These are not fully gone, they are be moved to the new extension\n`powermail_frontend`\n\nRelated: in2code-pro/powermail#113",
          "is_bot": false,
          "headline": "[!!!][TASK] Remove Powermail Frontend plugins (Pi2/3/4)",
          "author_name": "Andreas Nedbal",
          "author_login": "pixeldesu",
          "committed_at": "2025-07-04T14:56:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fce1e1bbba931098b9c33d317415f533aa2faff",
          "body": "This was a left over from the initial migration to TYPO3 v13\ncompatible version. The method now returns the proper\nTYPO3_REQUEST object.\n\nRelated: in2code-pro/powermail#143",
          "is_bot": false,
          "headline": "[BUGFIX] Provide TYPO3_REQUEST in order to get correct pid",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-04T14:56:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f57adfd8f109a211f2a6d94b375b3727b2622512",
          "body": "According to TYPO3 docs this function is called automatically, when\ndatabase rows are fetched. This function initializes the needed\nobject storages. If not present, this can lead to exceptions.\n\n- replace own function initStorageObjects with initializeObject\n- added initializeObject where necessary\n\nRelated: in2code-pro/powermail#128",
          "is_bot": false,
          "headline": "[BUGFIX] Use initializeObject",
          "author_name": "Marcus Schwemer",
          "author_login": "mschwemer",
          "committed_at": "2025-07-04T14:56:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adcf4f11fbd5d1a6e79afdfb1bf57d0203b397bb",
          "body": "- one as dropIn\n- one as future-proof variant\n\nRelated: in2code-pro/powermail#104",
          "is_bot": false,
          "headline": "[FEATURE] Provide two sets of site sets",
          "author_name": "Andreas Nedbal",
          "author_login": "pixeldesu",
          "committed_at": "2025-07-04T14:55:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 20,
      "commits_last_year": 71,
      "latest_release_at": "2026-03-14T13:43:00Z",
      "latest_release_tag": "13.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 28,
      "days_since_latest_release": 130,
      "mean_days_between_releases": 27.3
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "in2code/powermail",
          "exists": true,
          "license": "GPL-2.0-or-later",
          "keywords": [
            "form",
            "typo3",
            "mailform",
            "spamprevention"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/in2code/powermail",
          "is_deprecated": false,
          "latest_version": "13.1.0",
          "repository_url": "https://github.com/in2code-de/powermail",
          "versions_count": 152,
          "total_downloads": 2630121,
          "dependents_count": 42,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 38829,
          "first_published_at": null,
          "latest_published_at": "2026-03-14T13:18:04Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 130
        }
      ]
    },
    "popularity": {
      "forks": 191,
      "stars": 100,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2016-09-27",
            "count": 1
          },
          {
            "date": "2016-09-28",
            "count": 1
          },
          {
            "date": "2016-10-24",
            "count": 1
          },
          {
            "date": "2016-10-30",
            "count": 1
          },
          {
            "date": "2016-11-06",
            "count": 1
          },
          {
            "date": "2016-11-15",
            "count": 1
          },
          {
            "date": "2016-12-22",
            "count": 1
          },
          {
            "date": "2017-01-23",
            "count": 1
          },
          {
            "date": "2017-01-26",
            "count": 1
          },
          {
            "date": "2017-01-30",
            "count": 1
          },
          {
            "date": "2017-02-03",
            "count": 1
          },
          {
            "date": "2017-03-15",
            "count": 1
          },
          {
            "date": "2017-04-03",
            "count": 1
          },
          {
            "date": "2017-04-24",
            "count": 1
          },
          {
            "date": "2017-05-02",
            "count": 1
          },
          {
            "date": "2017-06-12",
            "count": 1
          },
          {
            "date": "2017-06-19",
            "count": 1
          },
          {
            "date": "2017-06-26",
            "count": 1
          },
          {
            "date": "2017-07-19",
            "count": 1
          },
          {
            "date": "2017-08-04",
            "count": 1
          },
          {
            "date": "2017-08-17",
            "count": 1
          },
          {
            "date": "2017-08-21",
            "count": 1
          },
          {
            "date": "2017-09-20",
            "count": 1
          },
          {
            "date": "2017-09-26",
            "count": 1
          },
          {
            "date": "2017-10-17",
            "count": 1
          },
          {
            "date": "2017-10-31",
            "count": 1
          },
          {
            "date": "2017-12-13",
            "count": 1
          },
          {
            "date": "2018-02-13",
            "count": 1
          },
          {
            "date": "2018-02-22",
            "count": 1
          },
          {
            "date": "2018-03-13",
            "count": 1
          },
          {
            "date": "2018-05-16",
            "count": 1
          },
          {
            "date": "2018-06-24",
            "count": 1
          },
          {
            "date": "2018-06-29",
            "count": 1
          },
          {
            "date": "2018-08-01",
            "count": 1
          },
          {
            "date": "2018-08-03",
            "count": 1
          },
          {
            "date": "2018-08-16",
            "count": 1
          },
          {
            "date": "2018-08-27",
            "count": 1
          },
          {
            "date": "2018-09-07",
            "count": 1
          },
          {
            "date": "2018-09-13",
            "count": 1
          },
          {
            "date": "2018-09-24",
            "count": 1
          },
          {
            "date": "2018-10-26",
            "count": 2
          },
          {
            "date": "2018-11-21",
            "count": 1
          },
          {
            "date": "2019-02-07",
            "count": 1
          },
          {
            "date": "2019-02-23",
            "count": 1
          },
          {
            "date": "2019-03-01",
            "count": 1
          },
          {
            "date": "2019-03-21",
            "count": 1
          },
          {
            "date": "2019-04-03",
            "count": 1
          },
          {
            "date": "2019-04-05",
            "count": 1
          },
          {
            "date": "2019-04-29",
            "count": 1
          },
          {
            "date": "2019-05-07",
            "count": 1
          },
          {
            "date": "2019-05-14",
            "count": 1
          },
          {
            "date": "2019-05-16",
            "count": 1
          },
          {
            "date": "2019-07-23",
            "count": 1
          },
          {
            "date": "2019-08-07",
            "count": 1
          },
          {
            "date": "2019-08-19",
            "count": 1
          },
          {
            "date": "2019-08-20",
            "count": 1
          },
          {
            "date": "2019-09-25",
            "count": 1
          },
          {
            "date": "2019-10-27",
            "count": 1
          },
          {
            "date": "2019-11-07",
            "count": 1
          },
          {
            "date": "2020-01-10",
            "count": 1
          },
          {
            "date": "2020-01-20",
            "count": 1
          },
          {
            "date": "2020-01-27",
            "count": 1
          },
          {
            "date": "2020-02-13",
            "count": 1
          },
          {
            "date": "2020-02-18",
            "count": 1
          },
          {
            "date": "2020-02-19",
            "count": 1
          },
          {
            "date": "2020-05-06",
            "count": 1
          },
          {
            "date": "2020-05-10",
            "count": 1
          },
          {
            "date": "2020-05-29",
            "count": 1
          },
          {
            "date": "2020-06-02",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-06-16",
            "count": 1
          },
          {
            "date": "2020-06-23",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-09-02",
            "count": 1
          },
          {
            "date": "2020-10-01",
            "count": 1
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-22",
            "count": 1
          },
          {
            "date": "2020-10-27",
            "count": 1
          },
          {
            "date": "2020-11-25",
            "count": 1
          },
          {
            "date": "2021-01-14",
            "count": 1
          },
          {
            "date": "2021-03-04",
            "count": 1
          },
          {
            "date": "2021-04-21",
            "count": 1
          },
          {
            "date": "2021-05-31",
            "count": 1
          },
          {
            "date": "2021-06-21",
            "count": 1
          },
          {
            "date": "2021-06-26",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-17",
            "count": 1
          },
          {
            "date": "2021-09-12",
            "count": 1
          },
          {
            "date": "2021-09-16",
            "count": 1
          },
          {
            "date": "2021-10-19",
            "count": 1
          },
          {
            "date": "2021-12-06",
            "count": 1
          },
          {
            "date": "2022-01-18",
            "count": 1
          },
          {
            "date": "2022-02-08",
            "count": 1
          },
          {
            "date": "2022-02-21",
            "count": 1
          },
          {
            "date": "2022-03-24",
            "count": 2
          },
          {
            "date": "2022-03-25",
            "count": 1
          },
          {
            "date": "2022-04-07",
            "count": 1
          },
          {
            "date": "2022-04-12",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-05-02",
            "count": 1
          },
          {
            "date": "2022-05-16",
            "count": 1
          },
          {
            "date": "2022-07-12",
            "count": 1
          },
          {
            "date": "2022-07-28",
            "count": 1
          },
          {
            "date": "2022-08-12",
            "count": 1
          },
          {
            "date": "2022-08-16",
            "count": 1
          },
          {
            "date": "2022-08-19",
            "count": 1
          },
          {
            "date": "2022-09-14",
            "count": 1
          },
          {
            "date": "2022-10-23",
            "count": 1
          },
          {
            "date": "2022-11-09",
            "count": 1
          },
          {
            "date": "2022-11-13",
            "count": 1
          },
          {
            "date": "2022-12-01",
            "count": 1
          },
          {
            "date": "2022-12-06",
            "count": 1
          },
          {
            "date": "2023-01-10",
            "count": 1
          },
          {
            "date": "2023-01-23",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-01-30",
            "count": 1
          },
          {
            "date": "2023-02-07",
            "count": 1
          },
          {
            "date": "2023-03-18",
            "count": 1
          },
          {
            "date": "2023-04-03",
            "count": 1
          },
          {
            "date": "2023-04-05",
            "count": 2
          },
          {
            "date": "2023-04-11",
            "count": 1
          },
          {
            "date": "2023-05-25",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-08-03",
            "count": 1
          },
          {
            "date": "2023-08-14",
            "count": 1
          },
          {
            "date": "2023-09-25",
            "count": 1
          },
          {
            "date": "2023-10-11",
            "count": 1
          },
          {
            "date": "2023-11-30",
            "count": 1
          },
          {
            "date": "2023-12-28",
            "count": 1
          },
          {
            "date": "2024-01-18",
            "count": 1
          },
          {
            "date": "2024-01-25",
            "count": 1
          },
          {
            "date": "2024-02-09",
            "count": 1
          },
          {
            "date": "2024-02-20",
            "count": 1
          },
          {
            "date": "2024-03-06",
            "count": 1
          },
          {
            "date": "2024-03-15",
            "count": 1
          },
          {
            "date": "2024-03-20",
            "count": 2
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-04-10",
            "count": 1
          },
          {
            "date": "2024-05-13",
            "count": 1
          },
          {
            "date": "2024-05-21",
            "count": 1
          },
          {
            "date": "2024-05-27",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-06-01",
            "count": 1
          },
          {
            "date": "2024-06-12",
            "count": 1
          },
          {
            "date": "2024-07-05",
            "count": 1
          },
          {
            "date": "2024-07-19",
            "count": 2
          },
          {
            "date": "2024-07-23",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-08-07",
            "count": 1
          },
          {
            "date": "2024-08-14",
            "count": 1
          },
          {
            "date": "2024-08-28",
            "count": 1
          },
          {
            "date": "2024-09-30",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-02-17",
            "count": 1
          },
          {
            "date": "2025-02-28",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-03-20",
            "count": 1
          },
          {
            "date": "2025-04-29",
            "count": 1
          },
          {
            "date": "2025-05-10",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-23",
            "count": 1
          },
          {
            "date": "2025-06-02",
            "count": 1
          },
          {
            "date": "2025-06-11",
            "count": 1
          },
          {
            "date": "2025-06-30",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 2
          },
          {
            "date": "2025-10-08",
            "count": 1
          },
          {
            "date": "2025-10-20",
            "count": 1
          },
          {
            "date": "2025-10-24",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 1
          },
          {
            "date": "2025-11-21",
            "count": 1
          },
          {
            "date": "2025-11-28",
            "count": 1
          },
          {
            "date": "2025-12-18",
            "count": 1
          },
          {
            "date": "2025-12-20",
            "count": 1
          },
          {
            "date": "2026-01-15",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 188,
        "total_forks": 191
      },
      "star_history": null,
      "open_issues_and_prs": 107
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 141697,
      "source_files_sampled": 328,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 55,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "packagist"
      ],
      "dependencies": [
        {
          "name": "typo3/cms-core",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^13.4"
        },
        {
          "name": "symfony/rate-limiter",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^7.2"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "symfony/rate-limiter",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-core",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "^7.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-env",
            "direct": false,
            "version": "^7.16.4",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-babel",
            "direct": false,
            "version": "^5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-commonjs",
            "direct": false,
            "version": "^21.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-node-resolve",
            "direct": false,
            "version": "^13.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "gulp",
            "direct": false,
            "version": "^4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-plumber",
            "direct": false,
            "version": "^1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-rename",
            "direct": false,
            "version": "^2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-sass",
            "direct": false,
            "version": "^5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-uglify",
            "direct": false,
            "version": "^3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "moment",
            "direct": false,
            "version": "^2.29.2",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "^2.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-terser",
            "direct": false,
            "version": "^7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "sass",
            "direct": false,
            "version": "^1.80.5",
            "ecosystem": "npm"
          },
          {
            "name": "behat/behat",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "behat/mink-selenium2-driver",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "drevops/behat-screenshot",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "ext-curl",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "ext-fileinfo",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "ext-gd",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "ext-json",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "friends-of-behat/mink-browserkit-driver",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "friends-of-behat/mink-extension",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "friendsofphp/php-cs-fixer",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "helmich/typo3-typoscript-lint",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "mikey179/vfsstream",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "php",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpmd/phpmd",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpoffice/phpspreadsheet",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpstan/phpstan",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "se/selenium-server-standalone",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "squizlabs/php_codesniffer",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "symfony/config",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-adminpanel",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-belog",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-beuser",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-dashboard",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-extbase",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-extensionmanager",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-felogin",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-filelist",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-fluid-styled-content",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-frontend",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-info",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-install",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-lowlevel",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-recordlist",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-rte-ckeditor",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-scheduler",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-setup",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-t3editor",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/cms-tstemplate",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "typo3/testing-framework",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 55,
        "direct_count": 2,
        "indirect_count": 53
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 6,
        "merged_prs": 265,
        "open_issues": 101,
        "closed_ratio": 0.891,
        "closed_issues": 829,
        "closed_unmerged_prs": 187
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "einpraegsam",
          "commits": 2041,
          "avatar_url": "https://avatars.githubusercontent.com/u/89055?v=4"
        },
        {
          "type": "User",
          "login": "mschwemer",
          "commits": 511,
          "avatar_url": "https://avatars.githubusercontent.com/u/103594?v=4"
        },
        {
          "type": "User",
          "login": "sbusemann",
          "commits": 70,
          "avatar_url": "https://avatars.githubusercontent.com/u/3660954?v=4"
        },
        {
          "type": "User",
          "login": "pixeldesu",
          "commits": 52,
          "avatar_url": "https://avatars.githubusercontent.com/u/1774242?v=4"
        },
        {
          "type": "User",
          "login": "georgringer",
          "commits": 28,
          "avatar_url": "https://avatars.githubusercontent.com/u/1905663?v=4"
        },
        {
          "type": "User",
          "login": "cweiske",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/59036?v=4"
        },
        {
          "type": "User",
          "login": "denislorch",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/12167231?v=4"
        },
        {
          "type": "User",
          "login": "deoostfrees",
          "commits": 12,
          "avatar_url": "https://avatars.githubusercontent.com/u/68224180?v=4"
        },
        {
          "type": "User",
          "login": "macjohnny",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/5589029?v=4"
        },
        {
          "type": "User",
          "login": "franzholz",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/4855265?v=4"
        }
      ],
      "contributors_sampled": 100,
      "top_contributor_share": 0.683
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ter-release.yml",
        "testing.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".php-cs-fixer.php",
        "phpstan.neon"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": 6,
            "reason": "4 out of 6 merged PRs checked by a CI test -- score normalized to 6",
            "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": 2,
            "reason": "Found 6/23 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 30 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": 0,
            "reason": "no 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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "3 commit(s) and 13 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": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7c7005f83914193ca2d5dcdaca55c11bc0d06bab",
        "ran_at": "2026-07-23T11:33:57Z",
        "aggregate_score": 4.5,
        "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-06-22T10:55:13Z",
      "oldest_open_prs": [
        {
          "number": 1341,
          "created_at": "2026-02-09T11:28:31Z",
          "last_comment_at": "2026-02-09T11:28:51Z",
          "last_comment_author": "rr-it"
        },
        {
          "number": 1378,
          "created_at": "2026-05-25T18:19:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1380,
          "created_at": "2026-06-03T07:13:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1384,
          "created_at": "2026-06-28T22:20:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1387,
          "created_at": "2026-07-01T13:30:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1389,
          "created_at": "2026-07-23T11:33:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-03-13T11:45:14Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 556,
          "created_at": "2020-06-23T10:18:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 599,
          "created_at": "2020-10-02T14:07:08Z",
          "last_comment_at": "2025-03-01T18:51:29Z",
          "last_comment_author": "siwa-sgjatoja"
        },
        {
          "number": 622,
          "created_at": "2020-10-29T12:41:08Z",
          "last_comment_at": "2020-11-30T16:47:15Z",
          "last_comment_author": null
        },
        {
          "number": 651,
          "created_at": "2021-03-07T15:19:38Z",
          "last_comment_at": "2024-08-09T14:28:07Z",
          "last_comment_author": "mschwemer"
        },
        {
          "number": 652,
          "created_at": "2021-03-08T13:48:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 659,
          "created_at": "2021-03-17T13:38:12Z",
          "last_comment_at": "2025-02-24T09:20:51Z",
          "last_comment_author": "terminal8-dg"
        },
        {
          "number": 752,
          "created_at": "2022-04-08T06:45:19Z",
          "last_comment_at": "2024-05-22T05:30:26Z",
          "last_comment_author": "achimfritz"
        },
        {
          "number": 827,
          "created_at": "2022-11-10T10:31:42Z",
          "last_comment_at": "2022-11-29T10:53:12Z",
          "last_comment_author": "einpraegsam"
        },
        {
          "number": 856,
          "created_at": "2023-01-30T09:17:13Z",
          "last_comment_at": "2025-10-06T15:42:28Z",
          "last_comment_author": "cweiske"
        },
        {
          "number": 871,
          "created_at": "2023-04-06T13:36:18Z",
          "last_comment_at": "2026-02-09T13:33:33Z",
          "last_comment_author": "Patta"
        },
        {
          "number": 888,
          "created_at": "2023-06-23T13:02:47Z",
          "last_comment_at": "2025-07-04T09:35:56Z",
          "last_comment_author": "kitzberger"
        },
        {
          "number": 890,
          "created_at": "2023-06-29T15:44:28Z",
          "last_comment_at": "2023-06-29T17:47:12Z",
          "last_comment_author": "jensengelmann"
        },
        {
          "number": 892,
          "created_at": "2023-07-12T14:50:26Z",
          "last_comment_at": "2026-03-26T08:02:53Z",
          "last_comment_author": "github1maxserv"
        },
        {
          "number": 905,
          "created_at": "2023-08-18T07:20:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 906,
          "created_at": "2023-08-27T13:04:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 916,
          "created_at": "2023-09-27T10:08:51Z",
          "last_comment_at": "2026-07-21T10:36:57Z",
          "last_comment_author": "gf-ntiedt"
        },
        {
          "number": 917,
          "created_at": "2023-09-27T10:13:00Z",
          "last_comment_at": "2026-04-08T15:50:15Z",
          "last_comment_author": "zkrechowiec"
        },
        {
          "number": 918,
          "created_at": "2023-10-02T07:56:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 921,
          "created_at": "2023-10-24T15:33:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 925,
          "created_at": "2023-11-06T09:32:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/in2code-de/powermail",
    "host": "github.com",
    "name": "powermail",
    "owner": "in2code-de"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 68,
      "inputs": {
        "security": 45,
        "vitality": 85,
        "community": 50,
        "governance": 65,
        "engineering": 85
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 71,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 28
            },
            "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": "28/52 weeks with commits",
                "points": 19.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 28
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "71 commits in the last year",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 71
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "3 commit(s) and 13 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": 90,
            "inputs": {
              "releases_count": 20,
              "latest_release_tag": "13.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 130,
              "mean_days_between_releases": 27.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 130 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 130
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~27.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 27.3
                    }
                  }
                ],
                "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": 31,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 31 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 31
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 50,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "forks": 191,
              "stars": 100,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "100 stars",
                "points": 32.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "191 forks",
                "points": 19,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 191
                    }
                  }
                ],
                "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": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "packages": [
                "in2code/powermail"
              ],
              "dependents": 42,
              "ecosystems": "packagist",
              "total_downloads": 2630121,
              "monthly_downloads": 38829
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "38,829 downloads/month across packagist",
                "points": 61.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 38829,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "42 packages depend on it",
                "points": 10.9,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 65,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 100,
              "top_contributor_share": 0.683
            },
            "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 68% of commits",
                "points": 7.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 68
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "100 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "merged_prs": 265,
              "open_issues": 101,
              "closed_issues": 829,
              "issue_closed_ratio": 0.891,
              "closed_unmerged_prs": 187
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "89% of issues closed",
                "points": 41.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "265/452 decided PRs merged",
                "points": 22.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 265,
                      "decided": 452
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 6/23 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "followers": 28,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "in2code-de",
              "public_repos": 98,
              "account_age_days": 4170
            },
            "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": "28 followers of in2code-de",
                "points": 10.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 28,
                      "login": "in2code-de"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "98 public repos, account ~11 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 98
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "in2code/powermail"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 130
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on packagist",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 130 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 130
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "152 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 152
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 85,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": ".php-cs-fixer.php, phpstan.neon",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".php-cs-fixer.php, phpstan.neon"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "4 out of 6 merged PRs checked by a CI test -- score normalized to 6",
                "points": 12,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "powermail",
                "typo3",
                "typo3-cms-extension",
                "form",
                "mailform-extension"
              ],
              "has_wiki": false,
              "homepage": "https://in2code.de",
              "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": "https://in2code.de",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "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": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 4.5
            },
            "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": "4 out of 6 merged PRs checked by a CI test -- score normalized to 6",
                "points": 1.5,
                "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 6/23 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 30 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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "3 commit(s) and 13 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": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 20
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 36,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "critical",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.46,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "46 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 24.5,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 46,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "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": 37,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "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
            },
            "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": ".php-cs-fixer.php, phpstan.neon",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".php-cs-fixer.php, phpstan.neon"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "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": 55,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 141697,
              "source_files_sampled": 328,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/328 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 328,
                      "oversized": 2
                    }
                  }
                ],
                "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",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T11:34:20.353883Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/i/in2code-de/powermail.svg",
  "full_name": "in2code-de/powermail",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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