Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-31 23:38 UTC

flarum / flags

[READ ONLY] Subtree split of Flarum flags extension.

PHP · JavaScript · TypeScriptMIT★ 10 stars⑂ 12 forkssince Sep 2015View on GitHub ↗

flarum/flags holds a health index of 58 out of 100, placing it in the Moderate band. It scores highest on Vitality (79/100) and lowest on Engineering Quality (22/100). It was last updated today. 3 contributors account for most of its recent work.

58
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

FlarumOrganization
798 followers53 public repossince Sep 2013

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
Packagistflarum/flagsv2.0.0-rc.516,2004023 days agomoderation

Metrics by category

Vitality

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

79Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
13.8/36Commit cadence — 20/52 weeks with commits
13.1/18Commit volume — 28 commits in the last year
7/10OpenSSF Scorecard: Maintained — 9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7
Inputs used
commits_last_year28
human_commit_share0.98
days_since_last_push0
active_weeks_last_year20
How it's scored
27/27Ships releases — 37 releases published
36/36Release recency — latest release 23 days ago
19.8/27Release cadence — a release every ~48 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count37
latest_release_tagv2.0.0-rc.5
releases_from_tagsno
days_since_latest_release23
mean_days_between_releases48
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

46At risk · 18% of overall
How it's scored
15.5/60Stars — 10 stars
8.7/25Forks — 12 forks
4.3/15Watchers — 7 watchers
Inputs used
forks12
stars10
watchers7
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
0/22.5README
22.5/22.5License — recognized license (MIT)
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeno
has_licenseyes
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
56.1/80Monthly downloads — 16,200 downloads/month across packagist
10.2/20Registry dependents — 33 packages depend on it
Inputs used
packagesflarum/flags
dependents33
ecosystemspackagist
total_downloads523,331
monthly_downloads16,200

Sustainability & Governance

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

78Good · 24% of overall
How it's scored
36/54Bus factor — 3 contributor(s) cover half of all commits
17.4/22.5Commit distribution — top contributor authored 22% of commits
13.5/13.5Contributor breadth — 24 contributors
10/10OpenSSF Scorecard: Contributors — project has 24 contributing companies or organizations
Inputs used
bus_factor3
contributors_sampled24
top_contributor_share0.225
How it's scored
0/46.8Issue resolution — no issues or no data
33.8/38.3PR acceptance — 38/43 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs38
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs5
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
20.9/25Owner reach — 798 followers of flarum
24.6/25Track record — 53 public repos, account ~12 yr old
Inputs used
followers798
owner_typeOrganization
is_verified
owner_loginflarum
public_repos53
account_age_days4,691
How it's scored
25/25Published & resolvable — 1 package(s) on packagist
35/35Publish recency — latest publish 23 days ago
20/20Version history — 40 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesflarum/flags
ecosystemspackagist
any_deprecatedno
min_days_since_publish23

Engineering Quality

Are baseline engineering and documentation practices in place?

22Critical · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

10Critical
How it's scored
0/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
0/10Wiki
Inputs used
topics
has_wikino
homepage
has_readmeno
has_docs_dirno
has_descriptionyes

Security

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

56Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 24 contributing companies or organizations
0/10Dangerous-Workflow — no data
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
5.2/7.5Maintained — 9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate5.6
Excluded from scoring (no data or not applicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

53Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 95 of 98 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.969
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — js/tsconfig.json
0/10Reproducible environment
6/10Demonstrated agent practice — 3 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 2 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsjs/tsconfig.json
agent_commit_share0.03
toolchain_manifests
dependency_bot_commit_share0.02
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
27/45Type-checkable code — PHP with type-check config (js/tsconfig.json)
55/55Manageable file sizes — 0/63 source files over 60KB
Inputs used
primary_languagePHP
largest_source_bytes7,250
source_files_sampled63
oversized_source_files0

Key facts

10GitHub stars
24contributors
28commits, last 12 months
0days since last push
37releases
3bus factor
0open issues
npm, Packagistpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 12 ⇿
0Stars
12Forks
12Releases

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

0246810121212016-012018-102021-07
Major 1Minor 0Patch 0

Each point covers 6 days.

OpenSSF Scorecard 5.6 / 10
5.6aggregate

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 24 contributing companies or organizations
n/aDangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
7Maintained9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
Packagistflarum/core^2.0.0-rc.5composer.json
All dependencies 13

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

RegistryPackageVersionRelation
Packagistflarum/coredirect
npm@flarum/prettier-config^1.0.0indirect
npm@types/mithril^2.0.8indirect
npmflarum-tsconfig^2.0.0indirect
npmflarum-webpack-config^3.0.0indirect
npmprettier^2.5.1indirect
npmtypescript^4.5.4indirect
npmtypescript-coverage-report^0.6.1indirect
npmwebpack^5.104.1indirect
npmwebpack-cli^4.9.1indirect
Packagistflarum/auditindirect
Packagistflarum/tagsindirect
Packagistflarum/testingindirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 811,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "PHP": 48129,
        "Less": 1589,
        "JavaScript": 10660,
        "TypeScript": 9057
      },
      "pushed_at": "2026-07-31T23:37:03Z",
      "created_at": "2015-09-04T03:57:02Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-31T23:37:07Z",
      "description": "[READ ONLY] Subtree split of Flarum flags extension.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "2.x",
      "license_spdx_raw": "MIT",
      "primary_language": "PHP",
      "significant_languages": [
        "PHP",
        "JavaScript",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "http://flarum.org",
      "name": "Flarum",
      "type": "Organization",
      "login": "flarum",
      "company": null,
      "location": null,
      "followers": 798,
      "avatar_url": "https://avatars.githubusercontent.com/u/5549034?v=4",
      "created_at": "2013-09-26T11:15:45Z",
      "is_verified": null,
      "public_repos": 53,
      "account_age_days": 4691
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.0.0-rc.5",
          "kind": "prerelease",
          "published_at": "2026-07-08T15:54:43Z"
        },
        {
          "tag": "v2.0.0-rc.4",
          "kind": "prerelease",
          "published_at": "2026-06-18T11:59:33Z"
        },
        {
          "tag": "v2.0.0-rc.3",
          "kind": "prerelease",
          "published_at": "2026-06-09T18:53:48Z"
        },
        {
          "tag": "v2.0.0-rc.2",
          "kind": "prerelease",
          "published_at": "2026-06-01T18:17:42Z"
        },
        {
          "tag": "v2.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2026-04-20T10:19:44Z"
        },
        {
          "tag": "v2.0.0-beta.7",
          "kind": "prerelease",
          "published_at": "2026-02-22T17:16:06Z"
        },
        {
          "tag": "v2.0.0-beta.6",
          "kind": "prerelease",
          "published_at": "2026-01-30T09:20:14Z"
        },
        {
          "tag": "v2.0.0-beta.5",
          "kind": "prerelease",
          "published_at": "2025-12-20T22:39:05Z"
        },
        {
          "tag": "v2.0.0-beta.4",
          "kind": "prerelease",
          "published_at": "2025-11-25T17:58:27Z"
        },
        {
          "tag": "v2.0.0-beta.3",
          "kind": "prerelease",
          "published_at": "2025-05-02T08:17:19Z"
        },
        {
          "tag": "v2.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2025-01-17T09:07:21Z"
        },
        {
          "tag": "v2.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2024-12-11T16:59:17Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2024-11-20T20:03:24Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2024-10-08T07:04:29Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2023-05-20T17:19:16Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2023-03-10T13:16:13Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2022-11-16T11:11:15Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2022-11-15T11:33:50Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2022-09-13T09:13:58Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2022-07-13T12:18:03Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2022-05-12T10:18:11Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2022-01-20T11:14:18Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2021-10-13T00:45:40Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2021-05-27T08:06:05Z"
        },
        {
          "tag": "v0.1.0-beta.16",
          "kind": "prerelease",
          "published_at": "2021-03-15T15:54:43Z"
        },
        {
          "tag": "v0.1.0-beta.15",
          "kind": "prerelease",
          "published_at": "2020-12-18T14:50:04Z"
        },
        {
          "tag": "v0.1.0-beta.14",
          "kind": "prerelease",
          "published_at": "2020-10-15T14:42:13Z"
        },
        {
          "tag": "v0.1.0-beta.13",
          "kind": "prerelease",
          "published_at": "2020-05-01T11:16:45Z"
        },
        {
          "tag": "v0.1.0-beta.12",
          "kind": "prerelease",
          "published_at": "2020-03-03T12:54:55Z"
        },
        {
          "tag": "v0.1.0-beta.10",
          "kind": "prerelease",
          "published_at": "2019-11-26T15:22:40Z"
        },
        {
          "tag": "v0.1.0-beta.9",
          "kind": "prerelease",
          "published_at": "2019-07-05T11:01:41Z"
        },
        {
          "tag": "v0.1.0-beta.8",
          "kind": "prerelease",
          "published_at": "2018-11-29T07:01:07Z"
        },
        {
          "tag": "v0.1.0-beta.7",
          "kind": "prerelease",
          "published_at": "2017-07-22T03:23:21Z"
        },
        {
          "tag": "v0.1.0-beta.6",
          "kind": "prerelease",
          "published_at": "2016-10-19T10:48:00Z"
        },
        {
          "tag": "v0.1.0-beta.5",
          "kind": "prerelease",
          "published_at": "2016-03-29T08:25:06Z"
        },
        {
          "tag": "v0.1.0-beta.4",
          "kind": "prerelease",
          "published_at": "2015-11-05T06:13:43Z"
        },
        {
          "tag": "v0.1.0-beta.3",
          "kind": "prerelease",
          "published_at": "2015-11-02T23:37:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "bf3bf3c3ef18ea525639387e87c6527f3972d049",
          "body": "…first one it found) (#4871)\n\n* feat: fail integration tests that run N+1 queries\n\nEvery request sent through the integration TestCase is now inspected for\nN+1 query patterns, and the test fails when it finds one. Extension\nauthors get the feedback while writing the feature rather than when a\nforum \n[…]\ntest is a separate process and a static flag cannot track 'first'. A\nmarker file keyed to the project and the hour serves as the shared\nsignal.\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] feat: fail integration tests that run N+1 queries (and fix the …",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-07-31T21:00:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef993fd6e0929dee1abc5219f47e387d402fa670",
          "body": "* docs: add changelog for 2.0.0-rc.5\n\n* docs: add #4806 to rc.5 changelog\n\n* docs: add #4807 to rc.5 changelog\n\n* chore: bump version and dependency constraints to 2.0.0-rc.5",
          "is_bot": false,
          "headline": "[2.x] chore: prepare 2.0.0-rc.5 (#4805)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-07-08T15:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b456e7d7dff81328619aaa418d56862bf7f447cf",
          "body": "Both columns are `->nullable()` in the migration, and the API resource\npermits a flag with only `reasonDetail` set (reason null) or only `reason`\nset — so `reason` and `reason_detail` are genuinely nullable at runtime.\n\nThe model docblock typed them as plain `string`, which makes PHPStan level\n6+ ra\n[…]\nrtyType` error on legitimate code that\nassigns null (e.g. extensions that store their message in `reason_detail`\nand leave `reason` null). Annotate both as `string|null` to match reality.\n\nFixes #4759",
          "is_bot": false,
          "headline": "fix(flags): type Flag::$reason and $reason_detail as nullable (#4760)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-18T09:51:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0c4af763e1886d30870406d0488405540337ca9",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep 2.0.0-rc.4 (#4741)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-16T10:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2982149ad2264c2878cf1b5cc621019c3699b32",
          "body": "… coverage (#4711)\n\n* [1.x] Add first-party Audit extension (#4704)\n\n* [1.x] Add first-party Audit extension\n\nAdds flarum/audit, a first-party audit log extension, to the monorepo.\n\nIt records moderation and administration actions (user, discussion, post,\nsetting, permission, extension lifecycle and\n[…]\nons_first_post_id_foreign during the approve flow (MySQL/SQLite tolerated it). Point it at the seeded post.\n\n* chore: add composer link to docs\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] Audit extension 2.x migration, integration split, and GDPR/core…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-12T01:16:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08ab6870846c2de34a450f3e8ee834b8fd823ac3",
          "body": "* chore: prep rc.3\n\n* chore: bump composer reqs",
          "is_bot": false,
          "headline": "chore: prep `2.0.0-rc.3` (#4698)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-06-09T12:39:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "197991a80d0a339dc9a0bbf4b300a318f51223fb",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep rc2 (#4676)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-05-30T22:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "688ca09645ce325efda107f2bcf89e023c4d63ee",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 0c326d3ba53d87c5ed89c3a9f912187495e93339",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-05-13T11:44:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5467ee6880ec7e65df336c1a125ea95703a36ec",
          "body": "…and lazy-load FlagPostModal (#4659)\n\nTwo related changes to the Inappropriate flag-post path:\n\n1. When no Community Guidelines URL is configured, the reason text\n   rendered the literal token \"{undefined}\" — the translator\n   stringifies undefined values passed into a rich placeholder. Use\n   a sep\n[…]\nrn\n   (`app.modal.show(() => import('./components/FlagPostModal'), ...)`)\n   and declare the chunk directory via `Extend\\Frontend::jsDirectory`\n   so the chunked sub-bundle is published.\n\nCloses #4574",
          "is_bot": false,
          "headline": "[2.x] fix(flags): drop literal 'undefined' from Inappropriate reason …",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-05-13T11:39:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54f4f45e98751162d4a1d255f463c00e1e698c56",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep rc.1 (#4581)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-17T12:43:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5ebf0ad04b9c8082e30045a05729011e59c2d0e",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5c5e3ef24be8c691642846723752e48eeef78973",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-15T11:19:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "024464771cc1b9c18f179782304f78ed2ab162e4",
          "body": "* prep for beta.8\n\n* chore: update changelog for beta.8 (#4480, #4481)",
          "is_bot": false,
          "headline": "[2.x] prep for beta.8 (#4478)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-21T22:45:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e6d52154269c89b775c87bdf834c1984ca5aaa0",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit cd4316aac500c74eb8a7bab6d2bff68d42769002",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-21T00:01:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40e963784f57f961c726033a949f7a728f646de5",
          "body": "…fication toasts (#4473)\n\n* [2.x] feat: realtime extender API + per-extension integrations + notification toasts\n\nIntroduces a `Realtime` extender so each bundled extension wires its own\nrealtime behaviour without realtime having hardcoded knowledge of them.\n\n**flarum/realtime**\n- New `Realtime` PHP\n[…]\nnList/NewActivity,\n  Discussion/NewActivity, and Discussion/TypingIndicator\n\n* chore: remove premium/commercial references from realtime README\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] feat: realtime extender API + per-extension integrations + noti…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-20T23:58:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d5c01e785f4332bac86975b4602afa7c5d8aed23",
          "body": "… 3-section sidebar (#4446)\n\n* revert(admin): remove collapsible extension categories, restore 3-section sidebar\n\nThe collapsible category groups introduced in #4392 added too much\nfriction — everything collapsed by default, count badges read like\nnotification counts, and single-item categories (Inf\n[…]\nrestoring\n\"feature\" keeps the data consistent with the rendering logic.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] revert(admin): remove collapsible extension categories, restore…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-14T22:59:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "501f75f7c724f1faa65afd74b2345a8282e2d2ca",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit ac6cc20a85963e1ec90cf6d405d4263d62695286",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-12T00:31:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29498d383873d02b4944e4c147edda0c7b39607b",
          "body": "…re + bundled extensions (#4430)\n\n* feat(core): add haptic feedback utility and integrate across core + bundled extensions\n\nAdds `haptic()` — a mobile haptic feedback utility backed by the `web-haptics`\npackage, supporting Android (Web Vibration API) and iOS (Taptic Engine via hidden\ncheckbox trick)\n[…]\nClaude Sonnet 4.6 <noreply@anthropic.com>\n\n* style: run prettier format\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] feat(core): add haptic feedback utility and integrate across co…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-12T00:27:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc6dce6eb1637caf0e73935940d6caa83a406975",
          "body": "…abandoned package support (#4392)\n\n* feat(admin): collapsible extension categories, health widget, abandoned package support\n\n- AdminNav: replace static category headers with collapsible groups; each group\n  shows a count badge, category icon, and expand/collapse chevron. Categories\n  default to co\n[…]\ning directly to an\nextension URL (e.g. /admin#/extension/flarum-flags).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] feat(admin): collapsible extension categories, health widget & …",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-02T06:56:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4c0c106ca378a744d250424e60678daff2b458a",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.7 (#4377)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-02-21T13:40:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ed9239e09d52059c6a2722d5ec852cc4c3aa9fe",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 6402e639bb64b06ecdc92ea69e6dacb3655504f7",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-02-15T21:46:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71ae40040cef600c80bec96d5a8bcf86e2a16b6b",
          "body": "Bumps [webpack](https://github.com/webpack/webpack) from 5.95.0 to 5.104.1.\n- [Release notes](https://github.com/webpack/webpack/releases)\n- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/webpack/webpack/compare/v5.95.0...v5.104.1)\n\n---\nupdated-\n[…]\ndency-version: 5.104.1\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump webpack from 5.95.0 to 5.104.1 (#4354)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-02-15T21:42:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4559f794decb414e2cbac7ab50588b619a6b436",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.6 (#4343)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-24T08:00:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "247e8839ca5d7b18efa9082858c0de9674daf707",
          "body": "* bump laravel - let's see what the tests do...\n\n* chore: upgrade phpstan to 2.x, larastan to 3.x\n\n* Apply fixes from StyleCI\n\n* fix: phpstan 8.4 property hooks compat\n\n* chore: phpstan fixes after rebase\n\n* fix: test expectation\n\n* fix: flag query pgsql\n\n* fix: pgsql flag query\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] feat: upgrade to Laravel 12 (#4268)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-14T08:05:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd04a5ab8809ab92bb6b797fb3382feacd240104",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep for beta.5 (#4313)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-12-20T10:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b1fdcf0badb316d362c6864b9733284f57c83ff",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep beta.4 (#4291)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-11-25T08:50:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ce4afeb01887176f6f5f63361849004f58efd9f",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 10e769988d6e553ee0e2a1cdb1bd4645f42763b9",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-11-02T11:44:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7483971d9a21a2cc736f42435995b84423127c4d",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 43f7a68f2b88f8e5f0a82bab581296f84cd2f8ef",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-27T05:25:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "faddc703d90f1b2f10cef4bc875aef97da03a830",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 005706bdb4f7fd02ca100131ccc27d4053d099ee",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-18T21:13:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6fc93ecdbb869da056cd70c4f5432ca549608a5",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 83318e51cfeed66f92b938c7aca481ac0fb14126",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-17T17:14:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18621ebcc8ba6f58cb2274b4c1428498e0cac92d",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare 2.0.0-beta.3",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-04-25T09:19:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2decd07a482fe63cb405899102874dc23f3a7ad",
          "body": null,
          "is_bot": false,
          "headline": "fix: prevent users from seeing their own flags (#4167)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-31T08:12:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d0d9ec92e2f6b4e13bbc9d5ba55ed819764cabc",
          "body": null,
          "is_bot": false,
          "headline": "chore: v2.0.0-beta.2",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2025-01-17T08:44:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7d27372c69dc12faa4de93a5933529ff95b7516",
          "body": null,
          "is_bot": false,
          "headline": "chore: prepare `2.0.0-beta.1`",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-12-07T08:50:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d802eddfc6137ae29864fb48c142fc8f9afeffab",
          "body": "* test: php 8.4\r\n\r\n* fix: php 8.4 deprecations\r\n\r\n* fix: make argument required\r\n\r\n* chore: review changes",
          "is_bot": false,
          "headline": "test: php 8.4 (#4103)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-11-08T16:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f97e7db24fd241b265e8ae9a9aefcef05a19c02",
          "body": null,
          "is_bot": false,
          "headline": "chore: update tsconfig version",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-25T08:39:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a74f598af602f28e39096fcb79b54d6c64bbc7c5",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 3b66925a666ad1f5e3e0ba2c1513bd501d6470e2",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-24T17:49:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad8afcc42bcd6a61598c3380a2ac483eb39b7d27",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a3333320d71863b2596e0886a6eb6a81a9db61ad",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-19T19:34:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a6ed6b835e31317342bc01051d907206363979e",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a47bd2d45730f004e739d91c290f22330ab93dc4",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-10-19T17:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66d084acecb917ecfc821cb93904df774d5ce52d",
          "body": null,
          "is_bot": false,
          "headline": "test: fix",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-17T18:37:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ac509fdf176d06e587893cf7d37a1cb251f6c15",
          "body": "…067)",
          "is_bot": false,
          "headline": "refactor: remove listing of posts in the show discussion endpoint (#4…",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-10-16T17:02:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05d5390bc7e762ad559c914f58f760222f614fd0",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 257be2b9db6f5365faa017bd9cc4a0e870efb449",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T14:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba586cff9113f56d1f87bdec1f989b22fdebf610",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b74ecbfacf684eb0dc70e708c4763d36ebd93405",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T10:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ef3f0c8f0bffd84e8768700793433971e5af0d9",
          "body": "* feat: private messages",
          "is_bot": false,
          "headline": "feat: messages extension (#4028)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T10:12:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35f5c2b8bcd645fea07d3f65280cdc0a2dbe5e3e",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5cea3d3b9bc4c5c6ae751bc4920a37bf032931af",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-28T08:38:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "630e0e892cff5886a34fe00690e514ead37dbd00",
          "body": null,
          "is_bot": false,
          "headline": "feat: admin search UI (#4022)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-09-28T08:35:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e11b733754cfe340c94a78d24c4a07d8ac44302",
          "body": "* chore: phpunit 10\r\n\r\n* chore: config\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* chore: phpunit 11 (php 8.2 minimum requirement)\r\n\r\n* feat: laravel 11\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* feat: carbon v3\r\n\r\n* fixes",
          "is_bot": false,
          "headline": "chore: update dependencies (#4012)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-08-06T15:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f85391f0e68abbc63c703ee6be95513922b484d3",
          "body": null,
          "is_bot": false,
          "headline": "fix: 2.0 bugs (#4011)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-08-02T11:49:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7df00bfd88f7a28e97f7e5adda427a06ae5e7362",
          "body": "* feat: vanilla CSS color scheme changes\r\n* chore: scheme mixin\r\n* chore: remove darkmode & colored header less variables\r\n* feat: high contrast schemes",
          "is_bot": false,
          "headline": "feat: vanilla CSS color scheme changes (#3996)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-06-22T07:05:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b46de151cc354c6a354dc9051d67b16a888b3ccf",
          "body": "* feat: add support for `PgSQL`\r\n* chore: generate dump\r\n* feat: query exception errors db driver hint\r\n* feat: allow defining supported databases\r\n* chore: review comments\r\n* feat: setting for pgsql preferred search config",
          "is_bot": false,
          "headline": "feat: add support for PgSQL (#3985)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-06-22T07:03:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af297d67dc6e2f13c6970a47bf989dab24d6e059",
          "body": "* refactor: json:api refactor iteration 1\r\n* chore: delete dead code\r\n* fix: regressions\r\n* chore: move additions/changes to package\r\n* feat: AccessTokenResource\r\n* feat: allow dependency injection in resources\r\n* feat: `ApiResource` extender\r\n* feat: improve\r\n* feat: refactor tags extension\r\n* feat\n[…]\nt\r\n* feat: eager loading\r\n* test: adapt\r\n* test: phpstan\r\n* test: adapt\r\n* fix: typing\r\n* fix: approving content\r\n* tet: adapt frontend tests\r\n* chore: typings\r\n* chore: review\r\n* fix: breaking change",
          "is_bot": false,
          "headline": "refactor: JSON:API (#3971)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-06-21T08:36:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e0c8b44aab3c8738ce28f521f9ce54408eef8445",
          "body": "* feat: add support for sqlite\r\n\r\n* chore: add warning on install\r\n\r\n* fix: ignore constraints before transaction begins\r\n\r\n* chore: update workflow\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* chore: generate sqlite dump and manually add foreign keys\r\n\r\n* chore: fix actions\r\n\r\n* chore: fix actions\r\n\r\n* chore\n[…]\nhore: fix actions\r\n\r\n* chore: fix actions\r\n\r\n* chore: fix actions\r\n\r\n* test: fix\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* fix: sqlite with db prefix\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* fix: statistics sqlite",
          "is_bot": false,
          "headline": "feat: add support for `SQLite` (#3984)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-06-21T06:25:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dac32694957d819547616f0bb46fea33fcb03091",
          "body": null,
          "is_bot": false,
          "headline": "feat: eloquent factories (primarily for tests) (#3982)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2024-05-03T08:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad3c2a901f199231f5e6cf073bbb494afc2a37ec",
          "body": null,
          "is_bot": false,
          "headline": "Apply fixes from StyleCI",
          "author_name": "StyleCI Bot",
          "author_login": "StyleCIBot",
          "committed_at": "2024-01-09T15:06:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99a26234bd81fb1af3740ef2ed4d38f3d024a40f",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 46357ee9a9b7ad2a76c91e03ed116bbb7777721e",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-11-23T17:14:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c828d779ba560a7a129866bb6e4184683f36aab",
          "body": null,
          "is_bot": false,
          "headline": "perf(flags): add pagination to flags list (#3931)",
          "author_name": "Tristian Kelly",
          "author_login": "OrdinaryJellyfish",
          "committed_at": "2023-11-23T17:11:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f421979879d0863409f7eb25abf610f53f799395",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 294878291c94719747cc1ebaf0e2e392529538c0",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-11-10T22:16:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b64a614bc53629dae16293439ff9e561f771d837",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit eaabeab8c922fe468209bd68a46ee5e72edd4b54",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-11-10T22:04:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d3adaf2924e3dd804adf719674fcd41674bd1d9",
          "body": null,
          "is_bot": false,
          "headline": "chore: extract `FormModal` from `Modal` (#3922)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-11-10T21:59:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3e50c1bbab40089a68c89b0061a40916aff2899",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit e2281a21230b23a635f742766ac3487b1d441f0a",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-11-10T21:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0b1508f991513d7364c9759ba92aa6505077374",
          "body": "* chore: drop deprecated `post_number_index` column\r\n\r\n* chore: remove deprecated `FlagsWillBeDeleted` event\r\n\r\n* chore: `Migration::addSettings` can still be needed\r\n\r\n* chore: `settings->get` default can still be needed\r\n\r\n* chore: deprecated `$default` in `Settings::serializeToForum` extender\r\n\r\n\n[…]\nal` deprecations\r\n\r\n* chore\r\n\r\n* chore: deprecated `less` mixins\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* fix\r\n\r\n* fix: phpstan\r\n\r\n* fix\r\n\r\n* fix\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: handle deprecations from 1.x (#3909)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-11-10T21:20:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1158e3e65b203f67dad84bfb18eac8f101b7e485",
          "body": "…ction (#3910)",
          "is_bot": false,
          "headline": "Use `::class` syntax to fetch class name instead of `get_class()` fun…",
          "author_name": "Ngô Quốc Đạt",
          "author_login": "datlechin",
          "committed_at": "2023-10-29T13:43:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a46a635c787fa9d3a5192d71b9619355bfd72d7a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5ab5257ff521bede446613c1dcd61effdac99090",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-10-10T20:41:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24afe21e395364b5042b2f07149c777183acd077",
          "body": "* feat: make page structure customizable across different pages (#3867)\r\n\r\n* feat: create `PageStructure` component\r\n* feat: apply to `DiscussionPage`\r\n* feat: apply to `UserPage`\r\n* feat: apply to `TagsPage`\r\n* fix: adapt subscriptions ext\r\n* chore: cleanup\r\n\r\n* chore: use grid & flexbox for the di\n[…]\nnvert `UploadImageButton` to tsx\r\n* feat: reusable `UploadImageButton` component\r\n* feat: add `image-upload` setting type\r\n\r\n* feat: extensible default footer component (#3883)\r\n\r\n* chore: yarn format",
          "is_bot": false,
          "headline": "feat: theming and extensibility improvements (#3876)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-10-10T20:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06dd57b756cbd4b5873c15b734337873ff3a6adf",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 229a7affa5cb0652da0cc4fd8b420900992c6f96",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-08-02T17:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8d92737809d0df53bee06c79f85195801c5ff19",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 016503d8c37eab107b36830b6fbcb5468bcb1226",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-06-29T18:24:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "beab145954bf84bbe90a731bff4dcd406e10086b",
          "body": "* feat: registry first iteration\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n* feat: improve webpack auto export loader\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n* chore: remove `compat` API\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n* chore: cleanup\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n---------\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "feat: export registry (#3842)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-06-29T17:57:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "042217e55e45c512582d3b6527a83d1a8484bf97",
          "body": "Allows running tests without constantly running `composer install` on each extension.",
          "is_bot": false,
          "headline": "chore: improve test suite (#3814)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-06-15T12:26:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a42dbc32540f49d1e684cf0be5e8c3ccc21471f",
          "body": "* wip: laraval and symfony upgrades\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* bump var dumper to 6.3\r\n\r\n* require guzzle 7.7\r\n\r\n* remove docbloc\r\n\r\n* lock symfony/translation-contracts to 2.5\r\n\r\n* fix: require mailgun package\r\n\r\n* remove docblock\r\n\r\n* fix: flysystem tests\r\n\r\n*\n[…]\n fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>\r\nCo-authored-by: Daniël Klabbers <luceos@users.noreply.github.com>\r\nCo-authored-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "chore: Upgrade dependencies (#3830)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-06-14T13:46:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1549b37470d7a38c36df9bec5adddf0e44cd844c",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit f67ca5782a0b22d194526b6b11a2086443863921",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-06-07T10:45:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0df30594278dd57bfdc0fcf65d9c73bcc65a644d",
          "body": "Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "fix(regression): require `flarum/testing:2.0`",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-31T08:53:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e68d0ae0956fda92aa7728124bef963272aebbd5",
          "body": "Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "fix(regression): caught errors",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-31T08:50:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a10a83d0b0221284e635949225076e9dcab6183",
          "body": "This reverts commit c94c1404843033a407c306895ed0a64333f55bf9.",
          "is_bot": false,
          "headline": "Revert \"fix(regression): caught errors\"",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-31T08:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a59c0208abe59e6c8bc6bf394ac0a224f45367a2",
          "body": "Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "fix(regression): caught errors",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-31T08:45:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a5d5ca5216affb128abfc2326252e21a6a25fe8",
          "body": "* chore: set minimum php version to 8.1\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n* chore: update codebase to php8.1\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* chore: update workflow php version\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@g\n[…]\nail.com>\r\n\r\n* fix: one last error\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\n\r\n---------\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: update codebase to php8.1 (#3827)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-30T10:36:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "941cc37719b6437eca09f03715a27793abe1fb48",
          "body": "Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "chore: v1.8 preparations",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-05-20T15:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b803e6ed77b065dccba96ad89b7e8f7e4797df5",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit e63e161be6d62d7a29998bf0cacbf5641e7a8a4f",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-05-07T16:49:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be8f7be1f93219d90c896a12f891bd42a5237e03",
          "body": null,
          "is_bot": false,
          "headline": "chore: major frontend JS cleanup (#3609)",
          "author_name": "David Wheatley",
          "author_login": "davwheat",
          "committed_at": "2023-05-07T16:40:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dde65623dc23c61f987ad58738a97101142b377a",
          "body": "Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.0.\r\n- [Release notes](https://github.com/webpack/webpack/releases)\r\n- [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: webpack\r\n  dependency-type: direct:production\r\n...\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump webpack from 5.75.0 to 5.76.0 (#3761)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2023-04-19T06:45:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdecb902759f7afb36bbd2d299d3e9ef56a77c11",
          "body": "Signed-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "chore(release): preparations",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-03-09T18:00:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c9a37bd89040b21a45115a5ade15fa64d904aa4",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit e7fc29a59f7538b211fc8b5ac65896dc2668f8fb",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-02-08T21:09:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9e9e1bec1db4a7c0e915e35e4557290e29ad5d1",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 47b670aa2918b4fe026e3de8b5e78bbc7d99ce18",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-02-08T20:19:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "258f8bbb54171fa74baea9587b88c74f31bc704f",
          "body": "* feat: reintroduce frontend extenders\r\n* chore: used `Routes` extender in bundled extensions\r\n* chore: used `PostTypes` extender in bundled extensions\r\n* chore: `yarn format`\r\n* feat: `Model` frontend extender\r\n* chore: naming\r\n* chore(review): attributes can be nullable or undefined\r\n* chore(revie\n[…]\nheck\r\n* chore(review): stay consistent\r\n* chore: merge conflicts\r\n* chore: unused import\r\n* chore: multiline extenders\r\n* feat: add Store extender\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "feat: frontend `Model` extender (#3646)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-02-08T20:13:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "987f64c8ff530875c27532dede1a0d8d0eba706c",
          "body": "* feat(phpstan): pick up extended model relations typings\r\n* feat(phpstan): pick up extended model date attributes\r\n* feat(core): introduce `castAttribute` extender\r\nStops using `dates` as it's deprecated in laravel 8\r\n* feat(phpstan): pick up extended model attributes through casts\r\n* fix: extender\n[…]\n\r\n* chore: enable phpstan in bundled extensions\r\n* chore: rebasing conflicts\r\n* chore: rebasing conflicts\r\n* chore: typings for latest 1.7 changes\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "chore(phpstan): enable phpstan in bundled extensions (#3667)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-01-19T20:49:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98247da3edf2434fe3634dab35e26284e3a6703c",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 4bb3b2235d7409eee3591148adb09ca1e4e904ab",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-01-17T20:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34306427cbbeae2c232d3b1d10b3b3917f12eeac",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit d7f4975330eb5cbd5c09bc812db957689e245ce5",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-01-17T18:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "225eff499b59ba32a8341d77bf9db198352c11f7",
          "body": "* feat: reintroduce frontend extenders\r\n* chore: used `Routes` extender in bundled extensions\r\n* chore: used `PostTypes` extender in bundled extensions\r\n* chore: `yarn format`\r\n* chore: naming\r\n* chore(review): unnecessary check\r\n* chore(review): stay consistent\r\n* chore: unused import\r\n\r\nSigned-off-by: Sami Mazouz <sychocouldy@gmail.com>",
          "is_bot": false,
          "headline": "feat: introduce frontend extenders (#3645)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2023-01-17T18:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac7fca7868123e6f90869526e82652f156d69975",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 07f8b6161af3f7424e8cf4243ab113098466a544",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-12-12T10:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce9cefc463a80c7c17f886cb3e93783dbb66a9e6",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 64fa35f2f350f98d213b87da6fcd72d465823b18",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-11-25T17:25:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea817bcc6dd854fa69bf34a59917aa8e87ef4ba1",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 18bdd48835a6783a3cea8f400932e87d7582fc7d",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-11-16T10:30:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e36e83f70b812086b6aa83095cfaddc371758739",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 259db92b9a8da063116e38c4034fe6c1bef42cbf",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-11-10T23:30:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60eea29ddc295c186ea923a59868177f8e173e70",
          "body": null,
          "is_bot": false,
          "headline": "chore: dependency on core updated for extensions",
          "author_name": "Daniël Klabbers",
          "author_login": "luceos",
          "committed_at": "2022-11-10T12:48:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8e1b0d0eca0e6b32ab3cd154acf4d4cc5ff5793",
          "body": null,
          "is_bot": false,
          "headline": "chore: v1.5.0 preparations",
          "author_name": "Daniël Klabbers",
          "author_login": "luceos",
          "committed_at": "2022-09-13T08:55:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "107e3b6293906c91840f6ae60a7661bf0a07c83a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 631b4c194c40bc37b7f747031ca0e555a512ff66",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-08-08T13:53:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1d90ec9103869b1d1eb6effc09e47a6016e4cbd",
          "body": "…3573)\n\n* chore: unify JS actions into one (rewritten `flarum/action-build)`\r\n* chore: maintain backwards compatibility\r\n* fix: wrong default format check script\r\n\r\nSigned-off-by: Sami Mazouz <ilyasmazouz@gmail.com>",
          "is_bot": false,
          "headline": "chore: unify JS actions into one (rewritten `flarum/action-build`) (#…",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2022-08-08T13:48:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22e3ee06443c0153e11676f5a2205b18f25c2ba6",
          "body": "…er (#3549)\n\n* docs: remove baseUrl recommendation\r\n\r\nFixes https://github.com/flarum/flarum-tsconfig/issues/4\r\n\r\n* chore: implement change within framework monorepo",
          "is_bot": false,
          "headline": "fix: intellisense imports defaulting to absolute path from `src` fold…",
          "author_name": "David Wheatley",
          "author_login": "davwheat",
          "committed_at": "2022-08-05T19:23:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ed43d05378ea465d07a13ccaeaf9e5246d7c1fa",
          "body": "* chore: delete unwanted dist typings\r\n* chore: revert 4e52f0e420501d2ca43af11d6eb9dc0c3ac8de14\r\n\r\nSigned-off-by: Sami Mazouz <ilyasmazouz@gmail.com>",
          "is_bot": false,
          "headline": "chore: revert tsconfig changes for local development (#3545)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2022-07-19T09:30:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ef3c7ac3809f293296cc354193da27a3e7159c2",
          "body": "* chore: centralize editorconfig\r\n* chore: tweak tsconfigs for local development\r\n* revert src path change\r\n* fix: akismet type checking requires flag ext `@types`\r\n* fix: make tags route optional to avoid typescript typing error",
          "is_bot": false,
          "headline": "chore: monorepo local development improvements (#3523)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2022-07-18T14:19:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6069368f6ba32d70f454970f44f773a10458c0b6",
          "body": null,
          "is_bot": false,
          "headline": "chore: update v1.4 constraints and update issues url",
          "author_name": "Daniël Klabbers",
          "author_login": "luceos",
          "committed_at": "2022-07-12T21:30:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2320f1ffb2cb98540ef4a6dd78762a93920c7ce",
          "body": "…513)\n\nSigned-off-by: Sami Mazouz <ilyasmazouz@gmail.com>",
          "is_bot": false,
          "headline": "chore: add `.gitattributes` to extensions to export-ignore files. (#3…",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2022-07-08T19:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3f71045cf16d76a70707d70ba4316e51e028854",
          "body": "* chore: yarn workspaces means we only need a single `yarn.lock`\r\n* fix: add a `cache_dependency_path` workflow input\r\n* fix: re-introduce `env.cache_dependency_path`",
          "is_bot": false,
          "headline": "chore: with yarn workspaces we only need a single `yarn.lock` (#3464)",
          "author_name": "Sami Mazouz",
          "author_login": "SychO9",
          "committed_at": "2022-06-19T18:01:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 37,
      "commits_last_year": 28,
      "latest_release_at": "2026-07-08T15:54:43Z",
      "latest_release_tag": "v2.0.0-rc.5",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 23,
      "mean_days_between_releases": 48
    },
    "community": {
      "has_readme": false,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "flarum/flags",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "moderation"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/flarum/flags",
          "is_deprecated": false,
          "latest_version": "v2.0.0-rc.5",
          "repository_url": "https://github.com/flarum/flags",
          "versions_count": 40,
          "total_downloads": 523331,
          "dependents_count": 33,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 16200,
          "first_published_at": null,
          "latest_published_at": "2026-07-08T15:08:06Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 23
        }
      ]
    },
    "popularity": {
      "forks": 12,
      "stars": 10,
      "watchers": 7,
      "fork_history": {
        "days": [
          {
            "date": "2016-01-11",
            "count": 1
          },
          {
            "date": "2016-05-16",
            "count": 1
          },
          {
            "date": "2016-11-02",
            "count": 1
          },
          {
            "date": "2017-02-12",
            "count": 1
          },
          {
            "date": "2017-02-20",
            "count": 1
          },
          {
            "date": "2018-12-25",
            "count": 1
          },
          {
            "date": "2019-11-18",
            "count": 1
          },
          {
            "date": "2020-04-22",
            "count": 1
          },
          {
            "date": "2020-10-02",
            "count": 1
          },
          {
            "date": "2020-11-07",
            "count": 1
          },
          {
            "date": "2021-05-21",
            "count": 1
          },
          {
            "date": "2021-08-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 12,
        "total_forks": 12
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "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": [
        "js/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 7250,
      "source_files_sampled": 63,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json",
        "js/package.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": 13,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "packagist"
      ],
      "dependencies": [
        {
          "name": "flarum/core",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.0.0-rc.5"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "flarum/core",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "@flarum/prettier-config",
            "direct": false,
            "version": "^1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mithril",
            "direct": false,
            "version": "^2.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "flarum-tsconfig",
            "direct": false,
            "version": "^2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flarum-webpack-config",
            "direct": false,
            "version": "^3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "^2.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "^4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-coverage-report",
            "direct": false,
            "version": "^0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack",
            "direct": false,
            "version": "^5.104.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-cli",
            "direct": false,
            "version": "^4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "flarum/audit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/tags",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/testing",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 13,
        "direct_count": 1,
        "indirect_count": 12
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 38,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 3,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "tobyzerner",
          "commits": 64,
          "avatar_url": "https://avatars.githubusercontent.com/u/128862?v=4"
        },
        {
          "type": "User",
          "login": "flarum-bot",
          "commits": 55,
          "avatar_url": "https://avatars.githubusercontent.com/u/39334649?v=4"
        },
        {
          "type": "User",
          "login": "SychO9",
          "commits": 39,
          "avatar_url": "https://avatars.githubusercontent.com/u/20267363?v=4"
        },
        {
          "type": "User",
          "login": "franzliedke",
          "commits": 28,
          "avatar_url": "https://avatars.githubusercontent.com/u/249125?v=4"
        },
        {
          "type": "User",
          "login": "imorland",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/16573496?v=4"
        },
        {
          "type": "User",
          "login": "askvortsov1",
          "commits": 24,
          "avatar_url": "https://avatars.githubusercontent.com/u/38059171?v=4"
        },
        {
          "type": "User",
          "login": "luceos",
          "commits": 22,
          "avatar_url": "https://avatars.githubusercontent.com/u/504687?v=4"
        },
        {
          "type": "User",
          "login": "davwheat",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/7406822?v=4"
        },
        {
          "type": "User",
          "login": "dcsjapan",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/13129997?v=4"
        },
        {
          "type": "User",
          "login": "tankerkiller125",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/3457368?v=4"
        }
      ],
      "contributors_sampled": 24,
      "top_contributor_share": 0.225
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 24 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 7,
            "reason": "9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7",
            "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": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file 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": "bf3bf3c3ef18ea525639387e87c6527f3972d049",
        "ran_at": "2026-07-31T23:38:02Z",
        "aggregate_score": 5.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-31T23:37:04Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2022-02-22T19:07:05Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/flarum/flags",
    "host": "github.com",
    "name": "flags",
    "owner": "flarum"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 56,
        "vitality": 79,
        "community": 46,
        "governance": 78,
        "engineering": 22
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 28,
              "human_commit_share": 0.98,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "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": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "28 commits in the last year",
                "points": 13.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 28
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7",
                "points": 7,
                "status": "partial",
                "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": 92,
            "inputs": {
              "releases_count": 37,
              "latest_release_tag": "v2.0.0-rc.5",
              "releases_from_tags": false,
              "days_since_latest_release": 23,
              "mean_days_between_releases": 48
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "37 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 23 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 23
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~48 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 48
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 46,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 28,
            "inputs": {
              "forks": 12,
              "stars": 10,
              "watchers": 7,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "10 stars",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "12 forks",
                "points": 8.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "7 watchers",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "has_readme": false,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "packages": [
                "flarum/flags"
              ],
              "dependents": 33,
              "ecosystems": "packagist",
              "total_downloads": 523331,
              "monthly_downloads": 16200
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "16,200 downloads/month across packagist",
                "points": 56.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 16200,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "33 packages depend on it",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 33
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 78,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 24,
              "top_contributor_share": 0.225
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 22% of commits",
                "points": 17.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 22
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "24 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 24 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "merged_prs": 38,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "38/43 decided PRs merged",
                "points": 33.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 38,
                      "decided": 43
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "followers": 798,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "flarum",
              "public_repos": 53,
              "account_age_days": 4691
            },
            "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": "798 followers of flarum",
                "points": 20.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 798,
                      "login": "flarum"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "53 public repos, account ~12 yr old",
                "points": 24.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 53
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "flarum/flags"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 23
            },
            "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 23 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 23
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "40 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 40
                    }
                  }
                ],
                "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": "critical",
        "name": "Engineering Quality",
        "value": 22,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "critical",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": false,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 5.6
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 24 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "9 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 7",
                "points": 5.2,
                "status": "partial",
                "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": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "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": 21
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 53,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.969,
              "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": "95 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "js/tsconfig.json"
              ],
              "agent_commit_share": 0.03,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.02
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "js/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "js/tsconfig.json"
                    }
                  }
                ],
                "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": "3 of the last 100 commits agent-authored or agent-credited",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 3,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "PHP",
              "largest_source_bytes": 7250,
              "source_files_sampled": 63,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "PHP with type-check config (js/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "js/tsconfig.json",
                      "language": "PHP"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/63 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 63,
                      "oversized": 0
                    }
                  }
                ],
                "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-31T23:38:16.493487Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/f/flarum/flags.svg",
  "full_name": "flarum/flags",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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