Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 22:46 UTC

FriendsOfFlarum / drafts

Enables creation of discussion drafts

TypeScript · PHPMIT★ 17 stars⑂ 11 forkssince Aug 2019View on GitHub ↗

FriendsOfFlarum/drafts holds a health index of 63 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (74/100) and lowest on Community & Adoption (45/100). It was last updated 30 days ago. 2 contributors account for most of its recent work.

63
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.

63
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

Friends of FlarumOrganization
101 followers105 public repossince Sep 2018

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

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
Packagistfof/drafts2.0.0-beta.72,31748106 days agoflarumfriends-of-flarum

Metrics by category

Vitality

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

62Moderate · 22% of overall
How it's scored
28.8/36Push recency — last push 30 days ago
6.2/36Commit cadence — 9/52 weeks with commits
13.3/18Commit volume — 29 commits in the last year
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Inputs used
commits_last_year29
human_commit_share0.85
days_since_last_push30
active_weeks_last_year9
How it's scored
27/27Ships releases — 47 releases published
27/36Release recency — latest release 106 days ago
19.8/27Release cadence — a release every ~57.9 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count47
latest_release_tag2.0.0-beta.7
releases_from_tagsno
days_since_latest_release106
mean_days_between_releases57.9
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?

45At risk · 18% of overall
How it's scored
19.5/60Stars — 17 stars
8.3/25Forks — 11 forks
3.3/15Watchers — 5 watchers
Inputs used
forks11
stars17
watchers5
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
44.9/80Monthly downloads — 2,317 downloads/month across packagist
5.2/20Registry dependents — 5 packages depend on it
Inputs used
packagesfof/drafts
dependents5
ecosystemspackagist
total_downloads80,245
monthly_downloads2,317

Sustainability & Governance

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

73Good · 24% of overall
How it's scored
25.2/54Bus factor — 2 contributor(s) cover half of all commits
15.8/22.5Commit distribution — top contributor authored 30% of commits
13.5/13.5Contributor breadth — 16 contributors
10/10OpenSSF Scorecard: Contributors — project has 11 contributing companies or organizations
Inputs used
bus_factor2
contributors_sampled16
top_contributor_share0.296
How it's scored
38.4/46.8Issue resolution — 82% of issues closed
29.6/38.3PR acceptance — 65/84 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 2/23 approved changesets -- score normalized to 0
Inputs used
merged_prs65
open_issues8
closed_issues37
issue_closed_ratio0.822
closed_unmerged_prs19
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
14.4/25Owner reach — 101 followers of FriendsOfFlarum
25/25Track record — 105 public repos, account ~7 yr old
Inputs used
followers101
owner_typeOrganization
is_verified
owner_loginFriendsOfFlarum
public_repos105
account_age_days2,866
How it's scored
25/25Published & resolvable — 1 package(s) on packagist
35/35Publish recency — latest publish 106 days ago
20/20Version history — 48 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesfof/drafts
ecosystemspackagist
any_deprecatedno
min_days_since_publish106

Engineering Quality

Are baseline engineering and documentation practices in place?

74Good · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — phpstan.neon
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 17 out of 17 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

60Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 3 topics
10/10Wiki
Inputs used
topicsfriendsofflarum, flarum, hacktoberfest
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

53Moderate · 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
2.5/2.5CI-Tests — 17 out of 17 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 2/23 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 11 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 15 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.1
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories19
affected_packages10
assessed_packages440
unassessed_packages8
affected_by_severityhigh 7, moderate 2, low 1
direct_affected_packages0
Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 440 resolved dependencies against OSV. 8 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.

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.

62Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
38.9/40Legible commit history — 62 of 85 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.729
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — phpstan.neon
11/11Static type checking — js/tsconfig.json
10/10Reproducible environment — lockfile
2/10Demonstrated agent practice — 1 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 15 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesyarn.lock
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsjs/tsconfig.json
agent_commit_share0.01
toolchain_manifests
dependency_bot_commit_share0.15
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/61 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes10,942
source_files_sampled61
oversized_source_files0

Key facts

17GitHub stars
16contributors
29commits, last 12 months
30days since last push
47releases
2bus factor
8open issues
npm, Packagistpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

More detail

Star and fork history 0 ★ / 11 ⇿
0Stars
11Forks
42Releases

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.

0246810121122019-102023-012026-04
Major 1Minor 5Patch 30

Each point covers 6 days.

OpenSSF Scorecard 4.1 / 10
4.1aggregate

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-23 22:45 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests17 out of 17 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 2/23 approved changesets -- score normalized to 0
10Contributorsproject has 11 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities15 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
Packagistflarum/core^2.0.0composer.json
All dependencies 448

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

RegistryPackageVersionRelation
Packagistflarum/coredirect
npm@babel/code-frame7.24.7indirect
npm@babel/code-frame7.27.1indirect
npm@babel/compat-data7.28.5indirect
npm@babel/core7.28.5indirect
npm@babel/generator7.25.6indirect
npm@babel/generator7.28.5indirect
npm@babel/helper-annotate-as-pure7.24.7indirect
npm@babel/helper-annotate-as-pure7.27.3indirect
npm@babel/helper-compilation-targets7.27.2indirect
npm@babel/helper-create-class-features-plugin7.25.4indirect
npm@babel/helper-create-class-features-plugin7.28.5indirect
npm@babel/helper-create-regexp-features-plugin7.25.2indirect
npm@babel/helper-create-regexp-features-plugin7.28.5indirect
npm@babel/helper-define-polyfill-provider0.6.5indirect
npm@babel/helper-globals7.28.0indirect
npm@babel/helper-member-expression-to-functions7.24.8indirect
npm@babel/helper-member-expression-to-functions7.28.5indirect
npm@babel/helper-module-imports7.27.1indirect
npm@babel/helper-module-transforms7.28.3indirect
npm@babel/helper-optimise-call-expression7.24.7indirect
npm@babel/helper-optimise-call-expression7.27.1indirect
npm@babel/helper-plugin-utils7.24.8indirect
npm@babel/helper-plugin-utils7.27.1indirect
npm@babel/helper-remap-async-to-generator7.27.1indirect
npm@babel/helper-replace-supers7.25.0indirect
npm@babel/helper-replace-supers7.27.1indirect
npm@babel/helper-skip-transparent-expression-wrappers7.24.7indirect
npm@babel/helper-skip-transparent-expression-wrappers7.27.1indirect
npm@babel/helper-string-parser7.24.8indirect
npm@babel/helper-string-parser7.27.1indirect
npm@babel/helper-validator-identifier7.24.7indirect
npm@babel/helper-validator-identifier7.27.1indirect
npm@babel/helper-validator-identifier7.28.5indirect
npm@babel/helper-validator-option7.27.1indirect
npm@babel/helper-wrap-function7.28.3indirect
npm@babel/helpers7.28.4indirect
npm@babel/highlight7.24.7indirect
npm@babel/parser7.25.6indirect
npm@babel/parser7.28.3indirect
npm@babel/parser7.28.5indirect
npm@babel/plugin-bugfix-firefox-class-in-computed-class-key7.28.5indirect
npm@babel/plugin-bugfix-safari-class-field-initializer-scope7.27.1indirect
npm@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression7.27.1indirect
npm@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining7.27.1indirect
npm@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly7.28.3indirect
npm@babel/plugin-proposal-class-properties7.18.6indirect
npm@babel/plugin-proposal-private-methods7.18.6indirect
npm@babel/plugin-proposal-private-property-in-object7.21.0-placeholder-for-preset-env.2indirect
npm@babel/plugin-syntax-import-assertions7.27.1indirect
npm@babel/plugin-syntax-import-attributes7.27.1indirect
npm@babel/plugin-syntax-jsx7.27.1indirect
npm@babel/plugin-syntax-typescript7.27.1indirect
npm@babel/plugin-syntax-unicode-sets-regex7.18.6indirect
npm@babel/plugin-transform-arrow-functions7.27.1indirect
npm@babel/plugin-transform-async-generator-functions7.28.0indirect
npm@babel/plugin-transform-async-to-generator7.27.1indirect
npm@babel/plugin-transform-block-scoped-functions7.27.1indirect
npm@babel/plugin-transform-block-scoping7.28.5indirect
npm@babel/plugin-transform-class-properties7.27.1indirect
npm@babel/plugin-transform-class-static-block7.28.3indirect
npm@babel/plugin-transform-classes7.28.4indirect
npm@babel/plugin-transform-computed-properties7.27.1indirect
npm@babel/plugin-transform-destructuring7.28.5indirect
npm@babel/plugin-transform-dotall-regex7.27.1indirect
npm@babel/plugin-transform-duplicate-keys7.27.1indirect
npm@babel/plugin-transform-duplicate-named-capturing-groups-regex7.27.1indirect
npm@babel/plugin-transform-dynamic-import7.27.1indirect
npm@babel/plugin-transform-explicit-resource-management7.28.0indirect
npm@babel/plugin-transform-exponentiation-operator7.28.5indirect
npm@babel/plugin-transform-export-namespace-from7.27.1indirect
npm@babel/plugin-transform-for-of7.27.1indirect
npm@babel/plugin-transform-function-name7.27.1indirect
npm@babel/plugin-transform-json-strings7.27.1indirect
npm@babel/plugin-transform-literals7.27.1indirect
npm@babel/plugin-transform-logical-assignment-operators7.28.5indirect
npm@babel/plugin-transform-member-expression-literals7.27.1indirect
npm@babel/plugin-transform-modules-amd7.27.1indirect
npm@babel/plugin-transform-modules-commonjs7.27.1indirect
npm@babel/plugin-transform-modules-systemjs7.28.5indirect
npm@babel/plugin-transform-modules-umd7.27.1indirect
npm@babel/plugin-transform-named-capturing-groups-regex7.27.1indirect
npm@babel/plugin-transform-new-target7.27.1indirect
npm@babel/plugin-transform-nullish-coalescing-operator7.27.1indirect
npm@babel/plugin-transform-numeric-separator7.27.1indirect
npm@babel/plugin-transform-object-assign7.27.1indirect
npm@babel/plugin-transform-object-rest-spread7.28.4indirect
npm@babel/plugin-transform-object-super7.27.1indirect
npm@babel/plugin-transform-optional-catch-binding7.27.1indirect
npm@babel/plugin-transform-optional-chaining7.28.5indirect
npm@babel/plugin-transform-parameters7.27.7indirect
npm@babel/plugin-transform-private-methods7.27.1indirect
npm@babel/plugin-transform-private-property-in-object7.27.1indirect
npm@babel/plugin-transform-property-literals7.27.1indirect
npm@babel/plugin-transform-react-display-name7.28.0indirect
npm@babel/plugin-transform-react-jsx7.27.1indirect
npm@babel/plugin-transform-react-jsx-development7.27.1indirect
npm@babel/plugin-transform-react-pure-annotations7.27.1indirect
npm@babel/plugin-transform-regenerator7.28.4indirect
npm@babel/plugin-transform-regexp-modifiers7.27.1indirect
npm@babel/plugin-transform-reserved-words7.27.1indirect
npm@babel/plugin-transform-runtime7.28.5indirect
npm@babel/plugin-transform-shorthand-properties7.27.1indirect
npm@babel/plugin-transform-spread7.27.1indirect
npm@babel/plugin-transform-sticky-regex7.27.1indirect
npm@babel/plugin-transform-template-literals7.27.1indirect
npm@babel/plugin-transform-typeof-symbol7.27.1indirect
npm@babel/plugin-transform-typescript7.28.5indirect
npm@babel/plugin-transform-unicode-escapes7.27.1indirect
npm@babel/plugin-transform-unicode-property-regex7.27.1indirect
npm@babel/plugin-transform-unicode-regex7.27.1indirect
npm@babel/plugin-transform-unicode-sets-regex7.27.1indirect
npm@babel/preset-env7.28.5indirect
npm@babel/preset-modules0.1.6-no-external-pluginsindirect
npm@babel/preset-react7.28.5indirect
npm@babel/preset-typescript7.28.5indirect
npm@babel/regjsgen0.8.0indirect
npm@babel/runtime7.28.4indirect
npm@babel/template7.25.0indirect
npm@babel/template7.27.2indirect
npm@babel/traverse7.25.6indirect
npm@babel/traverse7.28.5indirect
npm@babel/types7.25.6indirect
npm@babel/types7.28.2indirect
npm@babel/types7.28.5indirect
npm@colors/colors1.5.0indirect
npm@discoveryjs/json-ext0.5.7indirect
npm@flarum/prettier-config1.0.0indirect
npm@hypnosphi/create-react-context0.3.1indirect
npm@isaacs/balanced-match4.0.1indirect
npm@isaacs/brace-expansion5.0.1indirect
npm@jridgewell/gen-mapping0.3.13indirect
npm@jridgewell/gen-mapping0.3.5indirect
npm@jridgewell/remapping2.3.5indirect
npm@jridgewell/resolve-uri3.1.2indirect
npm@jridgewell/set-array1.2.1indirect
npm@jridgewell/source-map0.3.6indirect
npm@jridgewell/sourcemap-codec1.5.0indirect
npm@jridgewell/sourcemap-codec1.5.5indirect
npm@jridgewell/trace-mapping0.3.25indirect
npm@jridgewell/trace-mapping0.3.31indirect
npm@nodelib/fs.scandir2.1.5indirect
npm@nodelib/fs.stat2.0.5indirect
npm@nodelib/fs.walk1.2.8indirect
npm@polka/url1.0.0-next.25indirect
npm@semantic-ui-react/event-stack3.1.3indirect
npm@stardust-ui/react-component-event-listener0.38.0indirect
npm@stardust-ui/react-component-ref0.38.0indirect
npm@types/eslint9.6.1indirect
npm@types/eslint-scope3.7.7indirect
npm@types/estree1.0.8indirect
npm@types/jquery3.5.30indirect
npm@types/json-schema7.0.15indirect
npm@types/mithril2.2.7indirect
npm@types/node22.5.4indirect
npm@types/sizzle2.3.8indirect
npm@types/throttle-debounce2.1.0indirect
npm@webassemblyjs/ast1.14.1indirect
npm@webassemblyjs/floating-point-hex-parser1.13.2indirect
npm@webassemblyjs/helper-api-error1.13.2indirect
npm@webassemblyjs/helper-buffer1.14.1indirect
npm@webassemblyjs/helper-numbers1.13.2indirect
npm@webassemblyjs/helper-wasm-bytecode1.13.2indirect
npm@webassemblyjs/helper-wasm-section1.14.1indirect
npm@webassemblyjs/ieee7541.13.2indirect
npm@webassemblyjs/leb1281.13.2indirect
npm@webassemblyjs/utf81.13.2indirect
npm@webassemblyjs/wasm-edit1.14.1indirect
npm@webassemblyjs/wasm-gen1.14.1indirect
npm@webassemblyjs/wasm-opt1.14.1indirect
npm@webassemblyjs/wasm-parser1.14.1indirect
npm@webassemblyjs/wast-printer1.14.1indirect
npm@webpack-cli/configtest2.1.1indirect
npm@webpack-cli/info2.0.2indirect
npm@webpack-cli/serve2.0.5indirect
npm@xtuc/ieee7541.2.0indirect
npm@xtuc/long4.2.2indirect
npmacorn8.15.0indirect
npmacorn-import-phases1.0.4indirect
npmacorn-walk8.3.3indirect
npmajv6.12.6indirect
npmajv8.17.1indirect
npmajv-formats2.1.1indirect
npmajv-keywords3.5.2indirect
npmajv-keywords5.1.0indirect
npmansi-regex5.0.1indirect
npmansi-styles3.2.1indirect
npmansi-styles4.3.0indirect
npmbabel-loader9.2.1indirect
npmbabel-plugin-polyfill-corejs20.4.14indirect
npmbabel-plugin-polyfill-corejs30.13.0indirect
npmbabel-plugin-polyfill-regenerator0.6.5indirect
npmbalanced-match1.0.2indirect
npmbaseline-browser-mapping2.9.19indirect
npmbig.js5.2.2indirect
npmbrace-expansion1.1.12indirect
npmbraces3.0.3indirect
npmbrowserslist4.28.1indirect
npmbuffer-from1.1.2indirect
npmcall-bind1.0.8indirect
npmcall-bind-apply-helpers1.0.2indirect
npmcall-bound1.0.4indirect
npmcaniuse-lite1.0.30001769indirect
npmchalk2.4.2indirect
npmchalk4.1.2indirect
npmchrome-trace-event1.0.4indirect
npmclassnames2.5.1indirect
npmcli-table30.6.5indirect
npmclone-deep4.0.1indirect
npmcolor-convert1.9.3indirect
npmcolor-convert2.0.1indirect
npmcolor-name1.1.3indirect
npmcolor-name1.1.4indirect
npmcolorette2.0.20indirect
npmcommander10.0.1indirect
npmcommander2.20.3indirect
npmcommander5.1.0indirect
npmcommander7.2.0indirect
npmcommon-path-prefix3.0.0indirect
npmconcat-map0.0.1indirect
npmconvert-source-map2.0.0indirect
npmcore-js-compat3.46.0indirect
npmcross-spawn7.0.6indirect
npmdayjs1.11.13indirect
npmdebounce1.2.1indirect
npmdebug4.3.6indirect
npmdebug4.4.3indirect
npmdeep-equal1.1.2indirect
npmdefine-data-property1.1.4indirect
npmdefine-properties1.2.1indirect
npmdunder-proto1.0.1indirect
npmduplexer0.1.2indirect
npmelectron-to-chromium1.5.286indirect
npmemoji-regex8.0.0indirect
npmemojis-list3.0.0indirect
npmenhanced-resolve5.19.0indirect
npmenvinfo7.13.0indirect
npmes-define-property1.0.1indirect
npmes-errors1.3.0indirect
npmes-module-lexer2.0.0indirect
npmes-object-atoms1.1.1indirect
npmescalade3.2.0indirect
npmescape-string-regexp1.0.5indirect
npmescape-string-regexp4.0.0indirect
npmeslint-scope5.1.1indirect
npmesrecurse4.3.0indirect
npmestraverse4.3.0indirect
npmestraverse5.3.0indirect
npmesutils2.0.3indirect
npmevents3.3.0indirect
npmexenv1.2.2indirect
npmfast-deep-equal3.1.3indirect
npmfast-glob3.3.3indirect
npmfast-json-stable-stringify2.1.0indirect
npmfast-uri3.1.0indirect
npmfastest-levenshtein1.0.16indirect
npmfastq1.19.1indirect
npmfill-range7.1.1indirect
npmfind-cache-dir4.0.0indirect
npmfind-up4.1.0indirect
npmfind-up6.3.0indirect
npmflarum-tsconfig2.0.0indirect
npmflarum-webpack-config3.0.2indirect
npmflat5.0.2indirect
npmfs.realpath1.0.0indirect
npmfunction-bind1.1.2indirect
npmfunctions-have-names1.2.3indirect
npmgensync1.0.0-beta.2indirect
npmget-intrinsic1.3.0indirect
npmget-proto1.0.1indirect
npmglob7.2.3indirect
npmglob-parent5.1.2indirect
npmglob-to-regexp0.4.1indirect
npmglobals11.12.0indirect
npmgopd1.2.0indirect
npmgraceful-fs4.2.11indirect
npmgud1.0.0indirect
npmgzip-size6.0.0indirect
npmhas-flag3.0.0indirect
npmhas-flag4.0.0indirect
npmhas-property-descriptors1.0.2indirect
npmhas-symbols1.1.0indirect
npmhas-tostringtag1.0.2indirect
npmhasown2.0.2indirect
npmhtml-escaper2.0.2indirect
npmimport-local3.2.0indirect
npminflight1.0.6indirect
npminherits2.0.4indirect
npminterpret3.1.1indirect
npmis-arguments1.2.0indirect
npmis-core-module2.15.1indirect
npmis-core-module2.16.1indirect
npmis-date-object1.1.0indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point3.0.0indirect
npmis-glob4.0.3indirect
npmis-number7.0.0indirect
npmis-plain-object2.0.4indirect
npmis-regex1.2.1indirect
npmisexe2.0.0indirect
npmisobject3.0.1indirect
npmjest-worker27.5.1indirect
npmjs-tokens4.0.0indirect
npmjsesc0.5.0indirect
npmjsesc2.5.2indirect
npmjsesc3.1.0indirect
npmjson-parse-even-better-errors2.3.1indirect
npmjson-schema-traverse0.4.1indirect
npmjson-schema-traverse1.0.0indirect
npmjson51.0.2indirect
npmjson52.2.3indirect
npmkeyboard-key1.1.0indirect
npmkind-of6.0.3indirect
npmloader-runner4.3.1indirect
npmloader-utils1.4.2indirect
npmlocate-path5.0.0indirect
npmlocate-path7.2.0indirect
npmlodash4.18.1indirect
npmlodash.debounce4.0.8indirect
npmloose-envify1.4.0indirect
npmlru-cache5.1.1indirect
npmmath-intrinsics1.1.0indirect
npmmerge-stream2.0.0indirect
npmmerge21.4.1indirect
npmmicromatch4.0.8indirect
npmmime-db1.52.0indirect
npmmime-types2.1.35indirect
npmminimatch10.1.1indirect
npmminimatch3.1.2indirect
npmminimist1.2.8indirect
npmmrmime2.0.0indirect
npmms2.1.2indirect
npmms2.1.3indirect
npmncp2.0.0indirect
npmneo-async2.6.2indirect
npmnode-releases2.0.27indirect
npmnormalize-path3.0.0indirect
npmobject-assign4.1.1indirect
npmobject-is1.1.6indirect
npmobject-keys1.1.1indirect
npmonce1.4.0indirect
npmopener1.5.2indirect
npmp-limit2.3.0indirect
npmp-limit4.0.0indirect
npmp-locate4.1.0indirect
npmp-locate6.0.0indirect
npmp-try2.2.0indirect
npmpath-exists4.0.0indirect
npmpath-exists5.0.0indirect
npmpath-is-absolute1.0.1indirect
npmpath-key3.1.1indirect
npmpath-parse1.0.7indirect
npmpicocolors1.1.0indirect
npmpicocolors1.1.1indirect
npmpicomatch2.3.2indirect
npmpkg-dir4.2.0indirect
npmpkg-dir7.0.0indirect
npmpopper.js1.16.1indirect
npmprettier3.6.2indirect
npmprop-types15.8.1indirect
npmpunycode2.3.1indirect
npmqueue-microtask1.2.3indirect
npmrandombytes2.1.0indirect
npmreact16.14.0indirect
npmreact-dom16.14.0indirect
npmreact-is16.13.1indirect
npmreact-popper1.3.11indirect
npmrechoir0.8.0indirect
npmregenerate1.4.2indirect
npmregenerate-unicode-properties10.1.1indirect
npmregenerate-unicode-properties10.2.2indirect
npmregexp.prototype.flags1.5.4indirect
npmregexpu-core5.3.2indirect
npmregexpu-core6.4.0indirect
npmregjsgen0.8.0indirect
npmregjsparser0.13.0indirect
npmregjsparser0.9.1indirect
npmrequire-from-string2.0.2indirect
npmresolve1.22.11indirect
npmresolve1.22.8indirect
npmresolve-cwd3.0.0indirect
npmresolve-from5.0.0indirect
npmreusify1.1.0indirect
npmrimraf3.0.2indirect
npmrun-parallel1.2.0indirect
npmsafe-buffer5.2.1indirect
npmscheduler0.19.1indirect
npmschema-utils3.3.0indirect
npmschema-utils4.3.3indirect
npmsemantic-ui-react0.88.2indirect
npmsemver6.3.1indirect
npmserialize-javascript6.0.2indirect
npmset-function-length1.2.2indirect
npmset-function-name2.0.2indirect
npmshallow-clone3.0.1indirect
npmshallowequal1.1.0indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmsirv2.0.4indirect
npmsource-map0.6.1indirect
npmsource-map-support0.5.21indirect
npmstring-width4.2.3indirect
npmstrip-ansi6.0.1indirect
npmsupports-color5.5.0indirect
npmsupports-color7.2.0indirect
npmsupports-color8.1.1indirect
npmsupports-preserve-symlinks-flag1.0.0indirect
npmtapable2.3.0indirect
npmterser5.44.1indirect
npmterser-webpack-plugin5.3.16indirect
npmto-fast-properties2.0.0indirect
npmto-regex-range5.0.1indirect
npmtotalist3.0.1indirect
npmtslib1.14.1indirect
npmtslib2.8.1indirect
npmtsutils3.21.0indirect
npmtype-coverage-core2.29.7indirect
npmtyped-styles0.0.7indirect
npmtypescript4.9.5indirect
npmtypescript-coverage-report0.6.4indirect
npmundici-types6.19.8indirect
npmunicode-canonical-property-names-ecmascript2.0.0indirect
npmunicode-match-property-ecmascript2.0.0indirect
npmunicode-match-property-value-ecmascript2.1.0indirect
npmunicode-match-property-value-ecmascript2.2.1indirect
npmunicode-property-aliases-ecmascript2.1.0indirect
npmupdate-browserslist-db1.2.3indirect
npmuri-js4.4.1indirect
npmwarning4.0.3indirect
npmwatchpack2.4.4indirect
npmwebpack5.104.1indirect
npmwebpack-bundle-analyzer4.10.2indirect
npmwebpack-cli5.1.4indirect
npmwebpack-merge5.10.0indirect
npmwebpack-sources3.3.3indirect
npmwhich2.0.2indirect
npmwildcard2.0.1indirect
npmwrappy1.0.2indirect
npmws7.5.10indirect
npmyallist3.1.1indirect
npmyocto-queue1.2.1indirect
Packagistflarum/flagsindirect
Packagistflarum/gdprindirect
Packagistflarum/phpstanindirect
Packagistflarum/tagsindirect
Packagistflarum/testingindirect
Packagistfof/byobuindirect
Packagistfof/default-user-preferencesindirect
Dependency advisories 10

This repository publishes no package the index resolves, so its own dependency graph was assessed — 440 packages, which also include development and test pins that never ship: 10 carry known advisories, of which 0 are direct. 8 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list.

PackageVersionRelationSeverityAdvisoriesFixed in
@babel/plugin-transform-modules-systemjs7.28.5indirecthigh18.0.0-alpha.13
brace-expansion1.1.12indirecthigh25.0.7
fast-uri3.1.0indirecthigh44.1.1
minimatch10.1.1indirecthigh310.2.3
minimatch3.1.2indirecthigh310.2.3
serialize-javascript6.0.2indirecthigh27.0.5
ws7.5.10indirecthigh18.21.0
ajv6.12.6indirectmoderate18.18.0
ajv8.17.1indirectmoderate18.18.0
@babel/core7.28.5indirectlow18.0.0-rc.6

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "friendsofflarum",
        "flarum",
        "hacktoberfest"
      ],
      "is_fork": false,
      "size_kb": 1398,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "PHP": 30808,
        "Less": 1612,
        "JavaScript": 55,
        "TypeScript": 40966
      },
      "pushed_at": "2026-06-23T22:25:34Z",
      "created_at": "2019-08-03T09:33:02Z",
      "owner_type": "Organization",
      "updated_at": "2026-06-10T22:17:32Z",
      "description": "Enables creation of discussion drafts",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "2.x",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "PHP"
      ]
    },
    "owner": {
      "blog": "https://friendsofflarum.org",
      "name": "Friends of Flarum",
      "type": "Organization",
      "login": "FriendsOfFlarum",
      "company": null,
      "location": null,
      "followers": 101,
      "avatar_url": "https://avatars.githubusercontent.com/u/43339973?v=4",
      "created_at": "2018-09-17T11:10:19Z",
      "is_verified": null,
      "public_repos": 105,
      "account_age_days": 2866
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "2.0.0-beta.7",
          "kind": "prerelease",
          "published_at": "2026-04-08T22:34:47Z"
        },
        {
          "tag": "2.0.0-beta.6",
          "kind": "prerelease",
          "published_at": "2026-03-13T11:44:10Z"
        },
        {
          "tag": "1.2.14",
          "kind": "patch",
          "published_at": "2026-03-13T08:07:51Z"
        },
        {
          "tag": "2.0.0-beta.5",
          "kind": "prerelease",
          "published_at": "2026-03-13T08:07:21Z"
        },
        {
          "tag": "2.0.0-beta.4",
          "kind": "prerelease",
          "published_at": "2026-01-02T17:02:28Z"
        },
        {
          "tag": "2.0.0-beta.3",
          "kind": "prerelease",
          "published_at": "2026-01-02T16:57:34Z"
        },
        {
          "tag": "2.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2025-11-28T12:58:42Z"
        },
        {
          "tag": "2.0.0-beta.1",
          "kind": "prerelease",
          "published_at": "2025-11-06T22:48:33Z"
        },
        {
          "tag": "1.2.13",
          "kind": "patch",
          "published_at": "2025-10-08T11:52:37Z"
        },
        {
          "tag": "1.2.12",
          "kind": "patch",
          "published_at": "2024-11-03T15:07:53Z"
        },
        {
          "tag": "1.2.11",
          "kind": "patch",
          "published_at": "2024-09-05T13:00:21Z"
        },
        {
          "tag": "1.2.10",
          "kind": "patch",
          "published_at": "2023-11-15T14:37:53Z"
        },
        {
          "tag": "1.2.9",
          "kind": "patch",
          "published_at": "2023-11-12T22:32:28Z"
        },
        {
          "tag": "1.2.8",
          "kind": "patch",
          "published_at": "2023-10-30T17:46:42Z"
        },
        {
          "tag": "1.2.7",
          "kind": "patch",
          "published_at": "2023-10-25T21:07:17Z"
        },
        {
          "tag": "1.2.6",
          "kind": "patch",
          "published_at": "2023-10-23T17:18:10Z"
        },
        {
          "tag": "1.2.5",
          "kind": "patch",
          "published_at": "2023-10-12T17:44:26Z"
        },
        {
          "tag": "1.2.4",
          "kind": "patch",
          "published_at": "2023-10-12T07:56:12Z"
        },
        {
          "tag": "1.2.2",
          "kind": "patch",
          "published_at": "2022-12-06T10:22:49Z"
        },
        {
          "tag": "1.2.1",
          "kind": "patch",
          "published_at": "2022-12-05T10:44:43Z"
        },
        {
          "tag": "1.2.0",
          "kind": "minor",
          "published_at": "2022-12-01T22:22:24Z"
        },
        {
          "tag": "1.1.2",
          "kind": "patch",
          "published_at": "2022-05-18T21:18:14Z"
        },
        {
          "tag": "1.1.1",
          "kind": "patch",
          "published_at": "2022-04-06T20:26:38Z"
        },
        {
          "tag": "1.1.0",
          "kind": "minor",
          "published_at": "2022-04-06T13:01:25Z"
        },
        {
          "tag": "1.0.2",
          "kind": "patch",
          "published_at": "2021-09-09T13:01:54Z"
        },
        {
          "tag": "1.0.1",
          "kind": "patch",
          "published_at": "2021-06-23T19:28:35Z"
        },
        {
          "tag": "1.0.0",
          "kind": "major",
          "published_at": "2021-05-29T08:09:10Z"
        },
        {
          "tag": "0.4.0",
          "kind": "minor",
          "published_at": "2021-03-18T15:24:13Z"
        },
        {
          "tag": "0.3.2",
          "kind": "patch",
          "published_at": "2021-02-09T18:47:52Z"
        },
        {
          "tag": "0.3.1",
          "kind": "patch",
          "published_at": "2020-12-18T16:29:02Z"
        },
        {
          "tag": "0.3.0",
          "kind": "minor",
          "published_at": "2020-12-16T11:00:37Z"
        },
        {
          "tag": "0.2.1",
          "kind": "patch",
          "published_at": "2020-12-04T23:46:12Z"
        },
        {
          "tag": "0.2.0",
          "kind": "minor",
          "published_at": "2020-11-03T22:13:30Z"
        },
        {
          "tag": "0.1.13",
          "kind": "patch",
          "published_at": "2020-08-17T03:27:18Z"
        },
        {
          "tag": "0.1.12",
          "kind": "patch",
          "published_at": "2020-06-25T22:32:23Z"
        },
        {
          "tag": "0.1.11",
          "kind": "patch",
          "published_at": "2020-06-09T21:58:14Z"
        },
        {
          "tag": "0.1.10",
          "kind": "patch",
          "published_at": "2020-06-03T19:24:08Z"
        },
        {
          "tag": "0.1.9",
          "kind": "patch",
          "published_at": "2020-05-29T19:57:49Z"
        },
        {
          "tag": "0.1.8",
          "kind": "patch",
          "published_at": "2020-05-29T11:26:06Z"
        },
        {
          "tag": "0.1.7",
          "kind": "patch",
          "published_at": "2020-05-29T05:51:34Z"
        },
        {
          "tag": "0.1.6",
          "kind": "patch",
          "published_at": "2020-05-21T21:05:48Z"
        },
        {
          "tag": "0.1.5",
          "kind": "patch",
          "published_at": "2020-03-20T03:59:14Z"
        },
        {
          "tag": "0.1.4",
          "kind": "patch",
          "published_at": "2019-11-21T22:25:55Z"
        },
        {
          "tag": "0.1.3",
          "kind": "patch",
          "published_at": "2019-08-05T01:18:50Z"
        },
        {
          "tag": "0.1.2",
          "kind": "patch",
          "published_at": "2019-08-05T01:08:39Z"
        },
        {
          "tag": "0.1.1",
          "kind": "patch",
          "published_at": "2019-08-04T22:52:40Z"
        },
        {
          "tag": "0.1.0",
          "kind": "minor",
          "published_at": "2019-08-04T01:23:39Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cabe52be05013406c8ba47e567a40a35a07e3c31",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 7e14fd84af19c394274c29ca1362e7c9832dd34d",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-08T22:31:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e14fd84af19c394274c29ca1362e7c9832dd34d",
          "body": "…(#115)\n\nBumps @isaacs/brace-expansion from 5.0.0 to 5.0.1.\n\n---\nupdated-dependencies:\n- dependency-name: \"@isaacs/brace-expansion\"\n  dependency-version: 5.0.1\n  dependency-type: indirect\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": "build(deps): bump @isaacs/brace-expansion from 5.0.0 to 5.0.1 in /js …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-08T22:30:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5087aab9ddadb22a4397699c5a5b0cf995117c33",
          "body": "Bumps [webpack](https://github.com/webpack/webpack) from 5.102.1 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.102.1...v5.104.1)\n\n---\nupdate\n[…]\nency-version: 5.104.1\n  dependency-type: direct:development\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": "build(deps-dev): bump webpack from 5.102.1 to 5.104.1 in /js (#116)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-08T22:30:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e3da003788d6e1cb2cb4abe17969933086b4a98",
          "body": "Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.\n- [Release notes](https://github.com/micromatch/picomatch/releases)\n- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.\n[…]\ntch\n  dependency-version: 2.3.2\n  dependency-type: indirect\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": "build(deps): bump picomatch from 2.3.1 to 2.3.2 in /js (#125)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-08T22:30:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d44cf4140e4807cb90c58ae2405d70577f4819c4",
          "body": "Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.18.1.\n- [Release notes](https://github.com/lodash/lodash/releases)\n- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.18.1)\n\n---\nupdated-dependencies:\n- dependency-name: lodash\n  dependency-version: 4.18.1\n  dependency-type: indirect\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": "build(deps): bump lodash from 4.17.21 to 4.18.1 in /js (#126)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-08T22:30:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8455bbbef4952b5a605b1e4be1f41573748e6c9a",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit be64b7894acc78c7b6b74045770ec486c0796b6a",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-08T22:29:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be64b7894acc78c7b6b74045770ec486c0796b6a",
          "body": "* fix: show save draft button on mobile when composer is minimized (#128)\n\nOn mobile, ComposerState.Position.MINIMIZED is the active fullscreen composing\nstate (isFullScreen() returns true when app.screen() === 'phone'). The previous\nguard unconditionally hid the button when minimized, making it ina\n[…]\n't available.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n* fix: correct async route registration for /drafts page\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[2.x] fix: save draft button hidden on mobile; /drafts page blank (#129)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-04-08T22:28:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fb5ae77a51fd67dbd086c5bff4fb8b869412175",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 58741bb5526550f3c5df358355daff5582c2d51d",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-04-08T22:08:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58741bb5526550f3c5df358355daff5582c2d51d",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct draft counter increment and dropdown crash (#127)",
          "author_name": "huoxin",
          "author_login": "huoxin233",
          "committed_at": "2026-04-08T22:07:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d009c79c08a10583566275f4e812cd1f85b9925",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit c810b3205179d938b9b4f0c4c5fd4f254974eb3e",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-13T11:36:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c810b3205179d938b9b4f0c4c5fd4f254974eb3e",
          "body": "…#121)\n\n* fix: guard against scheduling discussion drafts with no title (#118)\n\nScheduling a discussion draft without a title would silently fail at\npublish time with a cryptic validation error. This adds a two-layer fix:\n\n- Frontend: `ScheduleDraftModal` now validates the title before saving;\n  sho\n[…]\n `#[Test]`,\nupdated schema, removed deprecated XML options).\n\n* Apply fixes from StyleCI\n\n* chore: ignore PHPUnit cache and .claude directories\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "[2.x] fix: guard against scheduling discussion drafts with no title (…",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-13T11:35:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de8cb7293216154133f8d0a4f7eea38e8948af8f",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit ee7a7f9c8512f87008e5bb2859662112f21f4e0b",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-03-13T00:30:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee7a7f9c8512f87008e5bb2859662112f21f4e0b",
          "body": null,
          "is_bot": false,
          "headline": "chore: update icons to avoid clashing, add haptics support (#120)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-13T00:29:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a433f9ce22b0eaeb91cbfcd4aa7dd6725542b6d1",
          "body": null,
          "is_bot": false,
          "headline": "chore: update constraints (#119)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-03-13T00:14:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17816cdea6fb5b39dd41ac6ae0ed79e263445471",
          "body": null,
          "is_bot": false,
          "headline": "chore: add release notification",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-02-15T20:42:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62596ea877376e4c02af61c0e3b63a36f33eccba",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit db6eaec980bf0f70c881bb849e5935bfad4ff01f",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-01-02T17:02:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db6eaec980bf0f70c881bb849e5935bfad4ff01f",
          "body": null,
          "is_bot": false,
          "headline": "Remove js/dist from .gitignore",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-02T17:01:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ba5083e16cd98295e6e439049b0034ff81253f7",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 15352a79647e82a950df723009a1d63f3d03fdd5",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2026-01-02T16:56:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15352a79647e82a950df723009a1d63f3d03fdd5",
          "body": null,
          "is_bot": false,
          "headline": "chore: code splitting, ts refactor (#113)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2026-01-02T16:55:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75d4dc49c00ecf2333a120115142bc4daf01e690",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 4ec2cb5ad2bef962bbef423a2bb2c2a4eb5a8442",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-11-28T12:39:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ec2cb5ad2bef962bbef423a2bb2c2a4eb5a8442",
          "body": null,
          "is_bot": false,
          "headline": "chore: re-add byobu support (#111)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-11-28T12:39:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48b54ba047219b0d048a979b18327efa7a5cd6b5",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 22663247105d0d2d9504c1b90cb8fca817c5c135",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-11-06T22:45:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22663247105d0d2d9504c1b90cb8fca817c5c135",
          "body": "* chore(2.0): update dependencies\n\nUpdate dependencies to Flarum 2.0 compatible versions.\n\n* chore(2.0): update infrastructure\n\nUpdate the extension infrastructure\n\n* chore(2.0): use new import from extension format\n\nImporting modules from an extension can now be done though `ext:vendor/extension/mo\n[…]\ning tag import temporarily\n\n* put tags import back, rename paramater\n\n* try again\n\n* finally, I think this is it\n\n* almost\n\n* this should be it\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: update for Flarum 2.0 (#110)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2025-11-06T22:44:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8abd8b65eb7eed57da15222ca1b3d499f92e42c7",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 16649ee665dd89e1ff5ac8cf091446d8e97a8de3",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2025-10-08T11:52:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16649ee665dd89e1ff5ac8cf091446d8e97a8de3",
          "body": "…109)\n\n* Fixed rare 404 while autosaving\n\n* Revert \"Bump @babel/runtime from 7.25.6 to 7.28.3 in /js (#105)\"\n\nThis reverts commit 3ad7bd86196e61f857e216f8a754e2d4a35b1d14.\n\n* Revert \"Fixed rare 404 while autosaving\"\n\nThis reverts commit 19eb5541bd00a357dc16c4e45f830b097309c8d8.\n\n* Revert \"Revert \"Bump @babel/runtime from 7.25.6 to 7.28.3 in /js (#105)\"\"\n\nThis reverts commit c0c536377ebfc5fa32ecf71a4e1b18cabf84b06d.\n\n* Patch to ignore autoupl 404",
          "is_bot": false,
          "headline": "fix: catch 404 error when autosave happens after post is submitted (#…",
          "author_name": "EdgeInfinity",
          "author_login": "edgeinfinity1",
          "committed_at": "2025-10-08T11:51:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ad7bd86196e61f857e216f8a754e2d4a35b1d14",
          "body": "Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.25.6 to 7.28.3.\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v7.28.3/pa\n[…]\ne\"\n  dependency-version: 7.28.3\n  dependency-type: indirect\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": "Bump @babel/runtime from 7.25.6 to 7.28.3 in /js (#105)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-09-16T16:17:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2aca9f6674d1011f99db9855557068253061f35b",
          "body": "Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.25.6 to 7.28.3.\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v7.28.3/pa\n[…]\ns\"\n  dependency-version: 7.28.3\n  dependency-type: indirect\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": "Bump @babel/helpers from 7.25.6 to 7.28.3 in /js (#106)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-09-16T16:17:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c2bf6df897b08200824a224cf89ab2131eb1b3d",
          "body": "Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.\n- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)\n\n---\nupdated-dependencies:\n- dependency-\n[…]\nawn\n  dependency-version: 7.0.6\n  dependency-type: indirect\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": "Bump cross-spawn from 7.0.3 to 7.0.6 in /js (#107)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-09-16T16:17:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "733fb8b781db68fcec7d2b6d7b39cee1b658650a",
          "body": "* test: setup basic backend testing\n\n* ci: test backend against php ^8.1\n\n* Apply fixes from StyleCI\n\n* test: target 1.x flows\n\n* chore: retrigger CI\n\n---------\n\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "test: setup basic backend testing (#104)",
          "author_name": "Davide Iadeluca",
          "author_login": "DavideIadeluca",
          "committed_at": "2025-08-25T15:16:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f54df53d84bea012ff5c23fa53a7c5f524bb683",
          "body": null,
          "is_bot": false,
          "headline": "chore: typo",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2024-11-03T15:06:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f95456d7822073536e8e1c98833e56b0cd00238f",
          "body": "* chore: prep for flarum/gdpr\r\n\r\n* Apply fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: prep for flarum/gdpr (#102)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2024-11-03T14:58:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78332c581e02d23ac5a2e04ebb06f38b4e59209b",
          "body": null,
          "is_bot": false,
          "headline": "Create CODEOWNERS",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2024-10-04T08:55:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c956f75d163c8d36c8c3f8878328c76fc8742aa5",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b60f722a910d09d80bbaacefd66d1ad2f4a70835",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-05T12:59:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b60f722a910d09d80bbaacefd66d1ad2f4a70835",
          "body": null,
          "is_bot": false,
          "headline": "fix: all drafts considered new by the drafts badge (#101)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2024-09-05T12:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4a70fb7ba9b8208ea6401b7c59467130ae23a94",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 47ac39662e73458820679b19d28078c2695b3b29",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-05T12:54:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47ac39662e73458820679b19d28078c2695b3b29",
          "body": "* chore: switch to yarn\r\n\r\n* chore: include php 8.3 in backend workflow",
          "is_bot": false,
          "headline": "chore: switch to yarn (#100)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2024-09-05T12:53:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0c86a1add7ed7603357ab7fcff6d3897691a88d",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a8a5314718703df4812b4af564bf24ffe43e6bf9",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2024-09-05T12:47:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8a5314718703df4812b4af564bf24ffe43e6bf9",
          "body": "Bumps [webpack](https://github.com/webpack/webpack) from 5.76.0 to 5.94.0.\r\n- [Release notes](https://github.com/webpack/webpack/releases)\r\n- [Commits](https://github.com/webpack/webpack/compare/v5.76.0...v5.94.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": "Bump webpack from 5.76.0 to 5.94.0 in /js (#99)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2024-09-05T12:46:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abdb05455915532636638a4da202d7fdec0ff55c",
          "body": "Bumps [ws](https://github.com/websockets/ws) from 7.4.6 to 7.5.10.\r\n- [Release notes](https://github.com/websockets/ws/releases)\r\n- [Commits](https://github.com/websockets/ws/compare/7.4.6...7.5.10)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: ws\r\n  dependency-type: indirect\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": "Bump ws from 7.4.6 to 7.5.10 in /js (#98)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2024-06-19T04:58:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6f8bdfe3569b6cbca5527e60818c3755c45d5bc",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 78c4b21d58cc84eda8495841155eef54525d7a50",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-11-15T14:37:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78c4b21d58cc84eda8495841155eef54525d7a50",
          "body": "objects",
          "is_bot": false,
          "headline": "Add deepEqual utility function for comparing (#96)",
          "author_name": "Rafael Horvat",
          "author_login": "iPurpl3x",
          "committed_at": "2023-11-15T14:36:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea4621ac2c64ed6b16b2a56fbf5fc49afcdff1ab",
          "body": "* chore: enable phpstan\r\n\r\n* fix: phpstan errors\r\n\r\n* chore: bump js deps, audit fix\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* chore: php8+\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: enable phpstan (#95)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-11-12T22:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8d06581d3a06edd6fcdad37ec4a87ff66ec89e2",
          "body": "* chore: update for gdpr 18\r\n\r\n* Apply fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: update for gdpr beta 18 (#93)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-10-30T17:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdb2a8fffbd5bef141b28ae695904258d160e489",
          "body": "* chore: support gdpr beta 17\r\n\r\n* Apply fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: support gdpr beta 17 (#92)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-10-25T21:04:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db5eb55821a23479a67b0346b72880a6a11a0b70",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 95cff661d43c5347cc79dc1ff20873a5d4614a83",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2023-10-23T17:17:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95cff661d43c5347cc79dc1ff20873a5d4614a83",
          "body": "Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.17.3 to 7.23.2.\r\n- [Release notes](https://github.com/babel/babel/releases)\r\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/babel/babel/commits/v7.23\n[…]\ncy-name: \"@babel/traverse\"\r\n  dependency-type: indirect\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": "Bump @babel/traverse from 7.17.3 to 7.23.2 in /js (#90)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2023-10-23T17:16:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2491b20a55f1105d5b22a961eeee363adb843242",
          "body": "* chore: support latest gdpr beta\r\n\r\n* Apply fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: support latest GDPR beta (#91)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-10-23T17:15:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c0a2e605b9a9b597abe77cb855d2539f7719359",
          "body": null,
          "is_bot": false,
          "headline": "fix: exported drafts not in drafts folder",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-10-12T17:41:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba7c45f223b8728d17275cae0ad7cd57aadaada9",
          "body": null,
          "is_bot": false,
          "headline": "Apply fixes from StyleCI",
          "author_name": "StyleCI Bot",
          "author_login": "StyleCIBot",
          "committed_at": "2023-10-12T07:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bbc8b73e9bb15115c3a0fa91cca233ea4caebef",
          "body": null,
          "is_bot": false,
          "headline": "fix: conditional extender workaround",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2023-10-12T07:54:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "847fac24591a5932a0f77c9eeb015537b163070a",
          "body": "* feat: add support for blomstra/gdpr\r\n\r\n* Apply fixes from StyleCI\r\n\r\n---------\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "feat: add support for blomstra/gdpr (#88)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2023-10-10T17:52:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75c7cf277fd3b9f278ddfdcdf21f2fb5eb6ffc11",
          "body": "* Bump semver from 6.3.0 to 6.3.1 in /js\r\n\r\nBumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 6.3.1.\r\n- [Release notes](https://github.com/npm/node-semver/releases)\r\n- [Changelog](https://github.com/npm/node-semver/blob/v6.3.1/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/node-sem\n[…]\nI\r\n\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>\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": true,
          "headline": "Bump semver from 6.3.0 to 6.3.1 in /js (#85)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2023-10-10T16:51:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa85e7c61152bf6817626fc95d50426b79f764d7",
          "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": "Bump webpack from 5.75.0 to 5.76.0 in /js (#83)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2023-03-15T09:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5caf35ab3bc06a3ecc4ea63d40d8b6844ed2f778",
          "body": null,
          "is_bot": false,
          "headline": "chore: npm audit fix",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2023-01-09T10:51:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88549359b83a1902f587043e5a83d5623ba6d54b",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump dependencies",
          "author_name": "David Wheatley",
          "author_login": "davwheat",
          "committed_at": "2022-12-14T10:39:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38adb70da992cf6524166ef92ce9fc0395e9d4b0",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove unused prettier config",
          "author_name": "David Wheatley",
          "author_login": "davwheat",
          "committed_at": "2022-12-14T10:39:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fd27b1849743c4c702028693ac1d980bd006a29",
          "body": null,
          "is_bot": false,
          "headline": "fix: check for null before encoding json",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-05T16:26:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5b293889eced7eb11df1c312d99f266e68b3c87",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit edf2a90616e8199530c43cd0278d700bba7f6be1",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-12-05T10:43:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edf2a90616e8199530c43cd0278d700bba7f6be1",
          "body": null,
          "is_bot": false,
          "headline": "Apply fixes from StyleCI",
          "author_name": "StyleCI Bot",
          "author_login": "StyleCIBot",
          "committed_at": "2022-12-05T10:43:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9b9b39de454332fb71897bb7f6d3332110a6f64",
          "body": null,
          "is_bot": false,
          "headline": "allow title or content to possibly be null",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-05T10:42:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46f6b9e9706a8afa350a6e91b24befb264a9933e",
          "body": null,
          "is_bot": false,
          "headline": "fix: typo in fa icon name",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-05T08:40:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "888ea47a783dfb0da42523be1e99d980fda8fa91",
          "body": "* chore: use default settings extender, fix: undefined array key\r\n\r\n* Apply fixes from StyleCI\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "chore: use default settings extender, fix: undefined array key (#81)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2022-12-01T21:45:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68caf83f725c94937a0562a3cf14199b01e1eccb",
          "body": "Includes transpiled JS/TS, and Typescript declaration files (typings).\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 0017d88bf505d58388e252c50c62c840064f8d28",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-12-01T19:59:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0017d88bf505d58388e252c50c62c840064f8d28",
          "body": null,
          "is_bot": false,
          "headline": "fix: discussion title after reload (#80)",
          "author_name": "IanM",
          "author_login": "imorland",
          "committed_at": "2022-12-01T19:58:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16ab0e1d55a98cef03058d6dce072a8b55a241b2",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 29a00258a29567263a413798cf182bf34aeca3ab",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-12-01T09:36:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29a00258a29567263a413798cf182bf34aeca3ab",
          "body": null,
          "is_bot": false,
          "headline": "chore: missing app imports",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-01T09:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8a3a77d5ad1dcd5d4f8ea9c62e6655b3c0dbd12",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 3b92e21c81ef8035808cc810c54f1286259058e4",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-12-01T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b92e21c81ef8035808cc810c54f1286259058e4",
          "body": null,
          "is_bot": false,
          "headline": "chore: update build workflow",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-01T09:21:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de771ff177a9824e84cedf50dea27cc46449f93f",
          "body": null,
          "is_bot": false,
          "headline": "chore: npm audit fix, format js, use RequestUtil",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-12-01T09:15:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2291ac07ebe7afaa1bf606d8116184d658277fcf",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit b003d324e65861d23b08241a1477ef365fe3aaf4",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-05-18T21:16:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b003d324e65861d23b08241a1477ef365fe3aaf4",
          "body": null,
          "is_bot": false,
          "headline": "fix: cannot read properties of null (#75)",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-05-18T21:15:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc6621c5c09a71299f0adbc3279e87437989ee05",
          "body": "* Address issue with timed replies\r\n\r\n* Apply fixes from StyleCI\r\n\r\nCo-authored-by: StyleCI Bot <bot@styleci.io>",
          "is_bot": false,
          "headline": "fix: Timed reply (#73)",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-04-06T20:25:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be58f3da24996902789d5d9bbda6a3bb8fd427e6",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 068b94d14c4e952172ec1043d96e251648fdf797",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-04-06T13:00:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "068b94d14c4e952172ec1043d96e251648fdf797",
          "body": "* Support fof/byobu\r\n\r\n* Remove comment code",
          "is_bot": false,
          "headline": "Support fof/byobu (#72)",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-04-06T12:59:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a8e861a37a2727e0c29924846b220b74112eff1",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 6e1d89bd912c21e4b9d2cf8ae3ad1de17a65c0e2",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-04-06T10:54:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e1d89bd912c21e4b9d2cf8ae3ad1de17a65c0e2",
          "body": "* Webpack 5\r\n\r\n* Prettier",
          "is_bot": false,
          "headline": "Webpack 5 (#71)",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2022-04-06T10:53:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc550f5a6a5a39239fd92ed16332ca831ed8d280",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 21e9dadcf77d4796472a59001cbc5dff5b4be287",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2022-04-06T10:48:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21e9dadcf77d4796472a59001cbc5dff5b4be287",
          "body": "* chore: don't use `app` global to reference composer state\r\n\r\n* fix: don't save deleted drafts.",
          "is_bot": false,
          "headline": "fix: RACE condition causes saving of deleted drafts (#64)",
          "author_name": "Alexander Skvortsov",
          "author_login": "askvortsov1",
          "committed_at": "2022-04-06T10:48:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad442cb33349f14c8cc9c64a850f558797b815b1",
          "body": null,
          "is_bot": false,
          "headline": "Update JS deps",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2021-09-09T13:33:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f736b2090fe9d8db9491e555d871040defcee4e",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5cece35264befa918b82634570e5c93ac88a6d13",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-09-09T13:31:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cece35264befa918b82634570e5c93ac88a6d13",
          "body": null,
          "is_bot": false,
          "headline": "Fixed states exports (#61)",
          "author_name": "Rafael Horvat",
          "author_login": "iPurpl3x",
          "committed_at": "2021-09-09T13:29:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb24e31425c1ba0fae2252eaf89dcd95f596e8bd",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md with scheduler instructions (#58)",
          "author_name": "Cory Martin",
          "author_login": "corydozen",
          "committed_at": "2021-09-09T13:22:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b8c51550f451917250378abad937efb5a88cc57",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 2edb6e1964d695816f6db6f876db646e4d60003d",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-09-09T13:00:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2edb6e1964d695816f6db6f876db646e4d60003d",
          "body": null,
          "is_bot": false,
          "headline": "Added missing exports (#60)",
          "author_name": "Rafael Horvat",
          "author_login": "iPurpl3x",
          "committed_at": "2021-09-09T12:58:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "240044e226625ec72d300f6c2b66878aa89a6d6c",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit a855026d8312608f0724aa86f2ddff597b2d846c",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-06-23T19:27:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a855026d8312608f0724aa86f2ddff597b2d846c",
          "body": "fixes #54",
          "is_bot": false,
          "headline": "fix tooltips (#55)",
          "author_name": "Hasan Özbey",
          "author_login": "hasan-ozbey",
          "committed_at": "2021-06-23T19:26:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "baa1567b8d6372a499d037f5ca0a0ae0417c4b64",
          "body": null,
          "is_bot": false,
          "headline": "Update README",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2021-05-29T07:31:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47c9033c3c05754f22638903bc15ffe594c74191",
          "body": "Includes transpiled JS/TS.\n\n[skip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit f1b06efd616bf06f8727db83711e5f37a4a36361",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-05-29T07:28:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b06efd616bf06f8727db83711e5f37a4a36361",
          "body": "* Flarum 1.0\r\n\r\n* Apply fixes from StyleCI\r\n\r\n* Bump packages; set up TS and typings\r\n\r\n* Add tooltip to delete all button\r\n\r\n* Fix loading indicator\r\n\r\n* WIP use of native date and time inputs\r\n\r\n* Remove flatpickr\r\n\r\n* Add prettier config\r\n\r\n* Update format script\r\n\r\n* Format\r\n\r\n* Update translati\n[…]\nat, add tooltips, add scheduled icon)\r\n\r\n* remove console.logs\r\n\r\n* update packages\r\n\r\nCo-authored-by: Ian Morland <imorland@users.noreply.github.com>\r\nCo-authored-by: David Wheatley <hi@davwheat.dev>",
          "is_bot": false,
          "headline": "Flarum 1.0 (#52)",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2021-05-29T07:27:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "443494b96336715b33224d00d8be53d8caabfe2b",
          "body": "Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.6.6 to 4.16.6.\r\n- [Release notes](https://github.com/browserslist/browserslist/releases)\r\n- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/browserslist/browserslist/compare/4.6.6...4.16.6)\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\n\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump browserslist from 4.6.6 to 4.16.6 in /js (#51)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2021-05-25T12:54:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19f45c997becc0a5508d74b3b5af796ef1b651e9",
          "body": "Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.\r\n- [Release notes](https://github.com/lodash/lodash/releases)\r\n- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)\r\n\r\nSigned-off-by: dependabot[bot] <support@github.com>\r\n\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump lodash from 4.17.20 to 4.17.21 in /js (#50)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2021-05-11T15:34:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10c3f1ca744b1864014e3e576de01ad4b3f21f8f",
          "body": "* Bump ssri from 6.0.1 to 6.0.2 in /js\r\n\r\nBumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.\r\n- [Release notes](https://github.com/npm/ssri/releases)\r\n- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)\r\n- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)\r\n\r\n\n[…]\nsupport@github.com>\r\n\r\n* Apply fixes from StyleCI\r\n\r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\r\nCo-authored-by: datitisev <datitisev@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump ssri from 6.0.1 to 6.0.2 in /js (#48)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2021-05-11T15:33:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce6092e01046ce267dc6ccd807e32e9d93831676",
          "body": "…kip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 5a729636be294732313f2ef6088761330b153f78 [s…",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-03-18T15:23:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a729636be294732313f2ef6088761330b153f78",
          "body": null,
          "is_bot": false,
          "headline": "Beta 16",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2021-03-18T15:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df5e9c69baaa7b63a7139579f9300a82b3f7928",
          "body": "…kip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit d9176e18fbf54ae04c7d94112c094533a8c5375c [s…",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-02-09T18:39:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9176e18fbf54ae04c7d94112c094533a8c5375c",
          "body": "* Fix deleting draft when posting discussion\r\n\r\nThere's a few changes here:\r\n\r\n- The draft is moved to `app.composer.draft`, which is more appropriate\r\n- Fix autosave interval not clearing, set `app.composer.draft` to null when composer is closed.\r\n\r\n* Don't save draft if content is empty\r\n\r\n* Add \"delete all drafts\" button\r\n\r\n* Use /drafts/all for delete route",
          "is_bot": false,
          "headline": "Some Fixes (#45)",
          "author_name": "Alexander Skvortsov",
          "author_login": "askvortsov1",
          "committed_at": "2021-02-09T18:38:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e10904b80ebfbcefc99454aee69552ba5a2b657e",
          "body": "…kip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit 092cbb4ad42d6b807d44a35160ea5f9203c1b034 [s…",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2021-01-16T00:05:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "092cbb4ad42d6b807d44a35160ea5f9203c1b034",
          "body": null,
          "is_bot": false,
          "headline": "Use updated byobu exports",
          "author_name": "Ian Morland",
          "author_login": "imorland",
          "committed_at": "2021-01-16T00:04:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc77ec510c1c7f31c66a45b30a36b1c76798c32e",
          "body": "…kip ci]",
          "is_bot": false,
          "headline": "Bundled output for commit d64749c56013a692b693ffc642611b7d0f93a96e [s…",
          "author_name": "flarum-bot",
          "author_login": "flarum-bot",
          "committed_at": "2020-12-18T16:26:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d64749c56013a692b693ffc642611b7d0f93a96e",
          "body": "Co-authored-by: Ian Morland <ian@morland.me>",
          "is_bot": false,
          "headline": "Exports of components, models & utils. (#35)",
          "author_name": "Rafael Horvat",
          "author_login": "iPurpl3x",
          "committed_at": "2020-12-18T16:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 47,
      "commits_last_year": 29,
      "latest_release_at": "2026-04-08T22:34:47Z",
      "latest_release_tag": "2.0.0-beta.7",
      "releases_from_tags": false,
      "days_since_last_push": 30,
      "active_weeks_last_year": 9,
      "days_since_latest_release": 106,
      "mean_days_between_releases": 57.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "fof/drafts",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "flarum",
            "Friends of Flarum"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/fof/drafts",
          "is_deprecated": false,
          "latest_version": "2.0.0-beta.7",
          "repository_url": "https://github.com/FriendsOfFlarum/drafts",
          "versions_count": 48,
          "total_downloads": 80245,
          "dependents_count": 5,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2317,
          "first_published_at": null,
          "latest_published_at": "2026-04-08T22:31:27Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 106
        }
      ]
    },
    "popularity": {
      "forks": 11,
      "stars": 17,
      "watchers": 5,
      "fork_history": {
        "days": [
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-11-05",
            "count": 1
          },
          {
            "date": "2019-11-21",
            "count": 1
          },
          {
            "date": "2020-05-21",
            "count": 1
          },
          {
            "date": "2020-05-22",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          },
          {
            "date": "2021-08-17",
            "count": 1
          },
          {
            "date": "2024-10-25",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 1
          },
          {
            "date": "2026-02-25",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 11,
        "total_forks": 11
      },
      "star_history": null,
      "open_issues_and_prs": 14
    },
    "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": 10942,
      "source_files_sampled": 61,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json",
        "js/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "@babel/plugin-transform-modules-systemjs",
            "direct": false,
            "version": "7.28.5",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 8.2,
            "advisory_ids": [
              "GHSA-fv7c-fp4j-7gwp"
            ],
            "fixed_version": "8.0.0-alpha.13",
            "advisory_count": 1,
            "oldest_advisory_days": 76
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.12",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-3jxr-9vmj-r5cp",
              "GHSA-f886-m6hf-6m8v"
            ],
            "fixed_version": "5.0.7",
            "advisory_count": 2,
            "oldest_advisory_days": 119
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.0",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-4c8g-83qw-93j6",
              "GHSA-q3j6-qgpj-74h6",
              "GHSA-v2hh-gcrm-f6hx",
              "GHSA-v39h-62p7-jpjc"
            ],
            "fixed_version": "4.1.1",
            "advisory_count": 4,
            "oldest_advisory_days": 76
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.1.1",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-23c5-xmqv-rm74",
              "GHSA-3ppc-4f35-3m26",
              "GHSA-7r86-cg39-jmmj"
            ],
            "fixed_version": "10.2.3",
            "advisory_count": 3,
            "oldest_advisory_days": 155
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-23c5-xmqv-rm74",
              "GHSA-3ppc-4f35-3m26",
              "GHSA-7r86-cg39-jmmj"
            ],
            "fixed_version": "10.2.3",
            "advisory_count": 3,
            "oldest_advisory_days": 155
          },
          {
            "name": "serialize-javascript",
            "direct": false,
            "version": "6.0.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 8.1,
            "advisory_ids": [
              "GHSA-5c6j-r48x-rmvq",
              "GHSA-qj8w-gfj5-8c6v"
            ],
            "fixed_version": "7.0.5",
            "advisory_count": 2,
            "oldest_advisory_days": 145
          },
          {
            "name": "ws",
            "direct": false,
            "version": "7.5.10",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-96hv-2xvq-fx4p"
            ],
            "fixed_version": "8.21.0",
            "advisory_count": 1,
            "oldest_advisory_days": 38
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.12.6",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-2g4f-4pwh-qvx6"
            ],
            "fixed_version": "8.18.0",
            "advisory_count": 1,
            "oldest_advisory_days": 162
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.17.1",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-2g4f-4pwh-qvx6"
            ],
            "fixed_version": "8.18.0",
            "advisory_count": 1,
            "oldest_advisory_days": 162
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.28.5",
            "severity": "low",
            "ecosystem": "npm",
            "cvss_score": 3.2,
            "advisory_ids": [
              "GHSA-4x5r-pxfx-6jf8"
            ],
            "fixed_version": "8.0.0-rc.6",
            "advisory_count": 1,
            "oldest_advisory_days": 38
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 1,
          "high": 7,
          "moderate": 2
        },
        "advisory_count": 19,
        "affected_count": 10,
        "assessed_count": 440,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 8,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "packagist"
      ],
      "dependencies": [
        {
          "name": "flarum/core",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^2.0.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "flarum/core",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/compat-data",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.25.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-annotate-as-pure",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-annotate-as-pure",
            "direct": false,
            "version": "7.27.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-compilation-targets",
            "direct": false,
            "version": "7.27.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-class-features-plugin",
            "direct": false,
            "version": "7.25.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-class-features-plugin",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-regexp-features-plugin",
            "direct": false,
            "version": "7.25.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-regexp-features-plugin",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-define-polyfill-provider",
            "direct": false,
            "version": "0.6.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-globals",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-member-expression-to-functions",
            "direct": false,
            "version": "7.24.8",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-member-expression-to-functions",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-imports",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-transforms",
            "direct": false,
            "version": "7.28.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-optimise-call-expression",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-optimise-call-expression",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-plugin-utils",
            "direct": false,
            "version": "7.24.8",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-plugin-utils",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-remap-async-to-generator",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-replace-supers",
            "direct": false,
            "version": "7.25.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-replace-supers",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-skip-transparent-expression-wrappers",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-skip-transparent-expression-wrappers",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.24.8",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-option",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-wrap-function",
            "direct": false,
            "version": "7.28.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helpers",
            "direct": false,
            "version": "7.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/highlight",
            "direct": false,
            "version": "7.24.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.25.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.28.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-firefox-class-in-computed-class-key",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-safari-class-field-initializer-scope",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly",
            "direct": false,
            "version": "7.28.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-proposal-class-properties",
            "direct": false,
            "version": "7.18.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-proposal-private-methods",
            "direct": false,
            "version": "7.18.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-proposal-private-property-in-object",
            "direct": false,
            "version": "7.21.0-placeholder-for-preset-env.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-assertions",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-attributes",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-jsx",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-typescript",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-unicode-sets-regex",
            "direct": false,
            "version": "7.18.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-arrow-functions",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-async-generator-functions",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-async-to-generator",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-block-scoped-functions",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-block-scoping",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-class-properties",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-class-static-block",
            "direct": false,
            "version": "7.28.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-classes",
            "direct": false,
            "version": "7.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-computed-properties",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-destructuring",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-dotall-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-duplicate-keys",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-duplicate-named-capturing-groups-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-dynamic-import",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-explicit-resource-management",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-exponentiation-operator",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-export-namespace-from",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-for-of",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-function-name",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-json-strings",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-literals",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-logical-assignment-operators",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-member-expression-literals",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-amd",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-commonjs",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-systemjs",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-umd",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-named-capturing-groups-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-new-target",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-nullish-coalescing-operator",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-numeric-separator",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-object-assign",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-object-rest-spread",
            "direct": false,
            "version": "7.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-object-super",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-optional-catch-binding",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-optional-chaining",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-parameters",
            "direct": false,
            "version": "7.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-private-methods",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-private-property-in-object",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-property-literals",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-display-name",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-jsx",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-jsx-development",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-pure-annotations",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-regenerator",
            "direct": false,
            "version": "7.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-regexp-modifiers",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-reserved-words",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-runtime",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-shorthand-properties",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-spread",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-sticky-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-template-literals",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-typeof-symbol",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-typescript",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-escapes",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-property-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-sets-regex",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-env",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-modules",
            "direct": false,
            "version": "0.1.6-no-external-plugins",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-react",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-typescript",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/regjsgen",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.25.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.27.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "7.25.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.25.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.28.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@colors/colors",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@discoveryjs/json-ext",
            "direct": false,
            "version": "0.5.7",
            "ecosystem": "npm"
          },
          {
            "name": "@flarum/prettier-config",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@hypnosphi/create-react-context",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/balanced-match",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/brace-expansion",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.13",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/remapping",
            "direct": false,
            "version": "2.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/set-array",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/source-map",
            "direct": false,
            "version": "0.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.25",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.scandir",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.stat",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.walk",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "@polka/url",
            "direct": false,
            "version": "1.0.0-next.25",
            "ecosystem": "npm"
          },
          {
            "name": "@semantic-ui-react/event-stack",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@stardust-ui/react-component-event-listener",
            "direct": false,
            "version": "0.38.0",
            "ecosystem": "npm"
          },
          {
            "name": "@stardust-ui/react-component-ref",
            "direct": false,
            "version": "0.38.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/eslint",
            "direct": false,
            "version": "9.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/eslint-scope",
            "direct": false,
            "version": "3.7.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/jquery",
            "direct": false,
            "version": "3.5.30",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mithril",
            "direct": false,
            "version": "2.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "22.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/sizzle",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/throttle-debounce",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/ast",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/floating-point-hex-parser",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-api-error",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-buffer",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-numbers",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-wasm-bytecode",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-wasm-section",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/ieee754",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/leb128",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/utf8",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-edit",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-gen",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-opt",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-parser",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wast-printer",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webpack-cli/configtest",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webpack-cli/info",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webpack-cli/serve",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@xtuc/ieee754",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@xtuc/long",
            "direct": false,
            "version": "4.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-import-phases",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-walk",
            "direct": false,
            "version": "8.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.12.6",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.17.1",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-formats",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-keywords",
            "direct": false,
            "version": "3.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-keywords",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-loader",
            "direct": false,
            "version": "9.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-corejs2",
            "direct": false,
            "version": "0.4.14",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-corejs3",
            "direct": false,
            "version": "0.13.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-regenerator",
            "direct": false,
            "version": "0.6.5",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.9.19",
            "ecosystem": "npm"
          },
          {
            "name": "big.js",
            "direct": false,
            "version": "5.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.12",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bound",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001769",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "2.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-trace-event",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "classnames",
            "direct": false,
            "version": "2.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "cli-table3",
            "direct": false,
            "version": "0.6.5",
            "ecosystem": "npm"
          },
          {
            "name": "clone-deep",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "1.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "colorette",
            "direct": false,
            "version": "2.0.20",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.20.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "common-path-prefix",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "core-js-compat",
            "direct": false,
            "version": "3.46.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "dayjs",
            "direct": false,
            "version": "1.11.13",
            "ecosystem": "npm"
          },
          {
            "name": "debounce",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "deep-equal",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "define-data-property",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "define-properties",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "duplexer",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.286",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emojis-list",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "enhanced-resolve",
            "direct": false,
            "version": "5.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "envinfo",
            "direct": false,
            "version": "7.13.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "events",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "exenv",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-glob",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fastest-levenshtein",
            "direct": false,
            "version": "1.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "fastq",
            "direct": false,
            "version": "1.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-cache-dir",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "flarum-tsconfig",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flarum-webpack-config",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "flat",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "fs.realpath",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "functions-have-names",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "gensync",
            "direct": false,
            "version": "1.0.0-beta.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "7.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "glob-to-regexp",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "11.12.0",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "gud",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "gzip-size",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-property-descriptors",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-tostringtag",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "html-escaper",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "import-local",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "inflight",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "interpret",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-arguments",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-core-module",
            "direct": false,
            "version": "2.15.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-core-module",
            "direct": false,
            "version": "2.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-date-object",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "is-regex",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isobject",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jest-worker",
            "direct": false,
            "version": "27.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "2.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-parse-even-better-errors",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "keyboard-key",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "loader-runner",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "loader-utils",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.debounce",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "loose-envify",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge2",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "2.1.35",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "minimist",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "mrmime",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "ncp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "neo-async",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.27",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-path",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "object-assign",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-is",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "object-keys",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "opener",
            "direct": false,
            "version": "1.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-try",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-is-absolute",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-parse",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "popper.js",
            "direct": false,
            "version": "1.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "prop-types",
            "direct": false,
            "version": "15.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "queue-microtask",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "randombytes",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": false,
            "version": "16.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": false,
            "version": "16.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-is",
            "direct": false,
            "version": "16.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-popper",
            "direct": false,
            "version": "1.3.11",
            "ecosystem": "npm"
          },
          {
            "name": "rechoir",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "regenerate",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "regenerate-unicode-properties",
            "direct": false,
            "version": "10.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "regenerate-unicode-properties",
            "direct": false,
            "version": "10.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "regexp.prototype.flags",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "regexpu-core",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "regexpu-core",
            "direct": false,
            "version": "6.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsgen",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsparser",
            "direct": false,
            "version": "0.13.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsparser",
            "direct": false,
            "version": "0.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "resolve",
            "direct": false,
            "version": "1.22.11",
            "ecosystem": "npm"
          },
          {
            "name": "resolve",
            "direct": false,
            "version": "1.22.8",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-cwd",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "reusify",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "rimraf",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "run-parallel",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "scheduler",
            "direct": false,
            "version": "0.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "schema-utils",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "schema-utils",
            "direct": false,
            "version": "4.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "semantic-ui-react",
            "direct": false,
            "version": "0.88.2",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "serialize-javascript",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "set-function-length",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "set-function-name",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "shallow-clone",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "shallowequal",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "sirv",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.21",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "5.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "8.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-preserve-symlinks-flag",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tapable",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "5.44.1",
            "ecosystem": "npm"
          },
          {
            "name": "terser-webpack-plugin",
            "direct": false,
            "version": "5.3.16",
            "ecosystem": "npm"
          },
          {
            "name": "to-fast-properties",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "totalist",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsutils",
            "direct": false,
            "version": "3.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-coverage-core",
            "direct": false,
            "version": "2.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "typed-styles",
            "direct": false,
            "version": "0.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "4.9.5",
            "ecosystem": "npm"
          },
          {
            "name": "typescript-coverage-report",
            "direct": false,
            "version": "0.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "6.19.8",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-canonical-property-names-ecmascript",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-match-property-ecmascript",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-match-property-value-ecmascript",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-match-property-value-ecmascript",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-property-aliases-ecmascript",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "warning",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "watchpack",
            "direct": false,
            "version": "2.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "webpack",
            "direct": false,
            "version": "5.104.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-bundle-analyzer",
            "direct": false,
            "version": "4.10.2",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-cli",
            "direct": false,
            "version": "5.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-merge",
            "direct": false,
            "version": "5.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-sources",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "wildcard",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "7.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "flarum/flags",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/gdpr",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/phpstan",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/tags",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "flarum/testing",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "fof/byobu",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "fof/default-user-preferences",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 448,
        "direct_count": 1,
        "indirect_count": 447
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 6,
        "merged_prs": 65,
        "open_issues": 8,
        "closed_ratio": 0.822,
        "closed_issues": 37,
        "closed_unmerged_prs": 19
      },
      "bus_factor": 2,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "imorland",
          "commits": 40,
          "avatar_url": "https://avatars.githubusercontent.com/u/16573496?v=4"
        },
        {
          "type": "User",
          "login": "flarum-bot",
          "commits": 34,
          "avatar_url": "https://avatars.githubusercontent.com/u/39334649?v=4"
        },
        {
          "type": "User",
          "login": "askvortsov1",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/38059171?v=4"
        },
        {
          "type": "User",
          "login": "KyrneDev",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/13856015?v=4"
        },
        {
          "type": "User",
          "login": "dsevillamartin",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/6401250?v=4"
        },
        {
          "type": "User",
          "login": "karaok491",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/72854852?v=4"
        },
        {
          "type": "User",
          "login": "iPurpl3x",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/18526076?v=4"
        },
        {
          "type": "User",
          "login": "StyleCIBot",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/11048387?v=4"
        },
        {
          "type": "User",
          "login": "wloot",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/30223095?v=4"
        },
        {
          "type": "User",
          "login": "davwheat",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/7406822?v=4"
        }
      ],
      "contributors_sampled": 16,
      "top_contributor_share": 0.296
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "backend.yml",
        "flarum-release-notification.yml",
        "frontend.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "phpstan.neon"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "yarn.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 10,
            "reason": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
            "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 2/23 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 11 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "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": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "15 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cabe52be05013406c8ba47e567a40a35a07e3c31",
        "ran_at": "2026-07-23T22:45:43Z",
        "aggregate_score": 4.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-06-24T00:24:24Z",
      "oldest_open_prs": [
        {
          "number": 112,
          "created_at": "2025-12-22T06:51:59Z",
          "last_comment_at": "2026-07-10T09:44:57Z",
          "last_comment_author": "edgeinfinity1"
        },
        {
          "number": 124,
          "created_at": "2026-03-15T05:54:02Z",
          "last_comment_at": "2026-04-09T10:05:29Z",
          "last_comment_author": "edgeinfinity1"
        },
        {
          "number": 131,
          "created_at": "2026-05-09T01:08:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 132,
          "created_at": "2026-05-09T17:17:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 135,
          "created_at": "2026-06-23T22:25:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 136,
          "created_at": "2026-07-02T08:15:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-04-08T22:30:39Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 18,
          "created_at": "2020-05-25T02:04:00Z",
          "last_comment_at": "2021-02-03T01:19:17Z",
          "last_comment_author": "askvortsov1"
        },
        {
          "number": 22,
          "created_at": "2020-05-27T23:56:39Z",
          "last_comment_at": "2020-05-28T12:53:12Z",
          "last_comment_author": "dsevillamartin"
        },
        {
          "number": 31,
          "created_at": "2020-06-03T21:51:50Z",
          "last_comment_at": "2020-06-04T19:52:55Z",
          "last_comment_author": "pflstr"
        },
        {
          "number": 32,
          "created_at": "2020-06-03T22:07:22Z",
          "last_comment_at": "2020-06-04T20:10:32Z",
          "last_comment_author": "pflstr"
        },
        {
          "number": 87,
          "created_at": "2023-10-05T06:03:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 94,
          "created_at": "2023-11-03T22:16:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 97,
          "created_at": "2023-11-30T07:36:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 122,
          "created_at": "2026-03-13T11:54:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/FriendsOfFlarum/drafts",
    "host": "github.com",
    "name": "drafts",
    "owner": "FriendsOfFlarum"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 53,
        "vitality": 62,
        "community": 45,
        "governance": 73,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 62,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "commits_last_year": 29,
              "human_commit_share": 0.85,
              "days_since_last_push": 30,
              "active_weeks_last_year": 9
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 30 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "9/52 weeks with commits",
                "points": 6.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "29 commits in the last year",
                "points": 13.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "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": 82,
            "inputs": {
              "releases_count": 47,
              "latest_release_tag": "2.0.0-beta.7",
              "releases_from_tags": false,
              "days_since_latest_release": 106,
              "mean_days_between_releases": 57.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "47 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 47
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 106 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 106
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~57.9 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 57.9
                    }
                  }
                ],
                "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": 106,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 106 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 106
                    }
                  }
                ],
                "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": 45,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "forks": 11,
              "stars": 17,
              "watchers": 5,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "17 stars",
                "points": 19.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "11 forks",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "5 watchers",
                "points": 3.3,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "packages": [
                "fof/drafts"
              ],
              "dependents": 5,
              "ecosystems": "packagist",
              "total_downloads": 80245,
              "monthly_downloads": 2317
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,317 downloads/month across packagist",
                "points": 44.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2317,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "5 packages depend on it",
                "points": 5.2,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": 73,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 16,
              "top_contributor_share": 0.296
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 30% of commits",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 30
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "16 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "merged_prs": 65,
              "open_issues": 8,
              "closed_issues": 37,
              "issue_closed_ratio": 0.822,
              "closed_unmerged_prs": 19
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "82% of issues closed",
                "points": 38.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "65/84 decided PRs merged",
                "points": 29.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 65,
                      "decided": 84
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "followers": 101,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "FriendsOfFlarum",
              "public_repos": 105,
              "account_age_days": 2866
            },
            "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": "101 followers of FriendsOfFlarum",
                "points": 14.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 101,
                      "login": "FriendsOfFlarum"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "105 public repos, account ~7 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 105
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "fof/drafts"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 106
            },
            "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 106 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 106
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "48 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 48
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "phpstan.neon",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpstan.neon"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "friendsofflarum",
                "flarum",
                "hacktoberfest"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 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": "3 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 53,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.1
            },
            "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": "17 out of 17 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "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": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file 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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "15 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 440 resolved dependencies against OSV; 8 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 440
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 8
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 19,
              "affected_packages": 10,
              "assessed_packages": 440,
              "unassessed_packages": 8,
              "affected_by_severity": "high 7, moderate 2, low 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 440,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 15
            },
            "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": 62,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.729,
              "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": "62 of 85 human commits state their intent (structured subject or explanatory body)",
                "points": 38.9,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 62,
                      "sampled": 85
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "yarn.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "js/tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.15
            },
            "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": "phpstan.neon",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpstan.neon"
                    }
                  }
                ],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "15 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 15,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 10942,
              "source_files_sampled": 61,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/61 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 61,
                      "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:46:14.571439Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/f/FriendsOfFlarum/drafts.svg",
  "full_name": "FriendsOfFlarum/drafts",
  "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.