Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.5.0 · 2026-08-02 15:39 UTC

maglevhq / maglev-core

Ruby on Rails website builder

Ruby · HTMLMIT★ 380 Sterne⑂ 65 Forksseit März 2021Auf GitHub ansehen ↗
ArtBibliothekNetzwerkdienstwie das ermittelt wird

maglevhq/maglev-core erreicht einen Gesundheitsindex von 78 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Engineering Quality (90/100) ab, am schwächsten bei Security (41/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

78
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

78
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Der gewichtete Gesamtwert 67 wird auf der veröffentlichten Indexskala auf 78 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

MaglevCMSOrganisation
19 Follower13 öffentliche Reposseit Aug. 2020

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
RubyGemsmaglevcms3.0.3-34vor 0 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

85Exzellent · 21 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
24.9/36Commit-Rhythmus — 36/52 Wochen mit Commits
18/18Commit-Volumen — 252 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year252
human_commit_share1
days_since_last_push0
active_weeks_last_year36
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 29 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 0 Tagen
19.8/27Release-Rhythmus — ein Release etwa alle 78 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count29
latest_release_tagv3.0.3
releases_from_tagsja
days_since_latest_release0
mean_days_between_releases78
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

55Mittel · 17 % des Gesamtindex
Wie die Bewertung erfolgt
41.8/60Stars — 380 Stars
15.1/25Forks — 65 Forks
0/15Watcher — 2 Watcher
Verwendete Eingangsdaten
forks65
stars380
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein
Wie die Bewertung erfolgt
47.5/80Downloads gesamt — 37.646 Downloads insgesamt über rubygems
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesmaglevcms
dependents
ecosystemsrubygems
total_downloads37.646
monthly_downloads
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

63Mittel · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
1.9/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 92 % der Commits
13.5/13.5Breite der Beitragenden — 14 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled14
top_contributor_share0,917
Wie die Bewertung erfolgt
35/42Issue-Lösungsquote — 83 % der Issues geschlossen
25.9/30PR-Annahme — 113/131 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs113
open_issues20
closed_issues100
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0,833
closed_unmerged_prs18
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
9.4/25Reichweite des Inhabers — 19 Follower von maglevhq
20.2/25Kontohistorie — 13 öffentliche Repos, Kontoalter ca. 5 Jahre
Verwendete Eingangsdaten
followers19
owner_typeOrganization
is_verified
owner_loginmaglevhq
public_repos13
account_age_days2.161

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf rubygems
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 34 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesmaglevcms
ecosystemsrubygems
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

90Exzellent · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .rubocop.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 11 out of 11 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

100Außergewöhnlich
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://www.maglev.dev
10/10Repository-Beschreibung
10/10Topics — 8 Topics
10/10Wiki
Verwendete Eingangsdaten
topicscms, ruby, ruby-on-rails, content-management-system, pagebuilder, page-builder, ror, website-builder
has_wikija
homepagehttps://www.maglev.dev
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

41Schwach · 16 % des Gesamtindex
Wie die Bewertung erfolgt
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 — 11 out of 11 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 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 6 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
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
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 47 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
8.2/35Direkte Abhängigkeiten ohne bekannte Advisories — 7 betroffen: puma 7.1.0 (high 7.5), puma 8.0.0 (high 7.5), loofah 2.25.1 (moderate 4.7), +4 weitere
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
40/40Keine offenen Advisories — kein Advisory ist länger als 90 Tage öffentlich
Verwendete Eingangsdaten
sourceosv
advisories61
affected_packages21
assessed_packages263
unassessed_packages7
affected_by_severitycritical 1, high 12, moderate 6, low 2
direct_affected_packages7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories. Die verbleibenden Gewichte wurden renormalisiert. 263 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. 7 konnten nicht bewertet werden — keine aufgelöste Version, ein nicht unterstütztes Ökosystem oder außerhalb der ausgewiesenen Paketliste. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

44Schwach · 4 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 98 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,98
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .rubocop.yml
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesGemfile.lock, yarn.lock
has_dockerfileja
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Ruby ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/574 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRuby
largest_source_bytes25.321
source_files_sampled574
oversized_source_files0

Eckdaten

380GitHub-Sterne
14Mitwirkende
252Commits, letzte 12 Monate
0Tage seit letztem Push
29Releases
1Bus-Faktor
20offene Issues
RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 65 ⇿
0Sterne
65Forks
27Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

01325385063756522022-102024-072026-05
Major 3Minor 9Patch 15

Jeder Punkt umfasst 4 Tage.

OpenSSF Scorecard 3.5 / 10
3.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-08-02 15:38 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests11 out of 11 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 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging 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
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities47 existing vulnerabilities detected
Direkte Abhängigkeiten 32
RegistryPaketVersionsvorgabeManifest
RubyGemsrails~> 8.1.3Gemfile
RubyGemsimage_processing~> 1.12.2Gemfile
RubyGemspropshaftGemfile
RubyGemspumaGemfile
RubyGemsmysql2Gemfile
RubyGemspg~> 1.5.9Gemfile
RubyGemssqlite3Gemfile
RubyGemsbenchmarkGemfile
RubyGemsobserverGemfile
RubyGemsostructGemfile
RubyGemslookbookGemfile
RubyGemsimportmap-rails~> 2.2Gemfile
RubyGemsloofah>= 2.25.1Gemfile
RubyGemsaddressable>= 2.9.0Gemfile
RubyGemserb>= 6.0.4Gemfile
RubyGemsjson>= 2.19.2Gemfile
RubyGemsnet-imap>= 0.6.4Gemfile
RubyGemsrack>= 3.2.6Gemfile
RubyGemsrack-session>= 2.1.2Gemfile
RubyGemsyard>= 0.9.42Gemfile
RubyGemsactiverecord-nulldb-adapterlookbook_host/Gemfile
RubyGemslookbooklookbook_host/Gemfile
RubyGemsmaglevcmslookbook_host/Gemfile
RubyGemspropshaftlookbook_host/Gemfile
RubyGemspuma>= 8.0lookbook_host/Gemfile
RubyGemsrails~> 8.1.3lookbook_host/Gemfile
RubyGemsaddressable>= 2.9.0lookbook_host/Gemfile
RubyGemserb>= 6.0.4lookbook_host/Gemfile
RubyGemsnet-imap>= 0.6.4lookbook_host/Gemfile
RubyGemsrack>= 3.2.6lookbook_host/Gemfile
RubyGemsrack-session>= 2.1.2lookbook_host/Gemfile
RubyGemsyard>= 0.9.42lookbook_host/Gemfile
Alle Abhängigkeiten 270

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 25 direkte und 245 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
RubyGemsactiverecord-nulldb-adapter1.2.2direkt
RubyGemsaddressable2.9.0direkt
RubyGemsbenchmark0.5.0direkt
RubyGemserb6.0.4direkt
RubyGemsimage_processing1.12.2direkt
RubyGemsimportmap-railsdirekt
RubyGemsimportmap-rails2.2.2direkt
RubyGemsimportmap-rails2.2.3direkt
RubyGemsjson2.19.3direkt
RubyGemsloofah2.25.1direkt
RubyGemslookbook2.3.14direkt
RubyGemsmysql20.5.7direkt
RubyGemsnet-imap0.6.4direkt
RubyGemsobserver0.1.2direkt
RubyGemsostruct0.6.3direkt
RubyGemspg1.5.9direkt
RubyGemspropshaft1.3.1direkt
RubyGemspuma7.1.0direkt
RubyGemspuma8.0.0direkt
RubyGemsrack3.2.6direkt
RubyGemsrack-session2.1.2direkt
RubyGemsrailsdirekt
RubyGemsrails8.1.3direkt
RubyGemssqlite32.7.4direkt
RubyGemsyard0.9.43direkt
npm@esbuild/aix-ppc640.25.12indirekt
npm@esbuild/android-arm0.25.12indirekt
npm@esbuild/android-arm640.25.12indirekt
npm@esbuild/android-x640.25.12indirekt
npm@esbuild/darwin-arm640.25.12indirekt
npm@esbuild/darwin-x640.25.12indirekt
npm@esbuild/freebsd-arm640.25.12indirekt
npm@esbuild/freebsd-x640.25.12indirekt
npm@esbuild/linux-arm0.25.12indirekt
npm@esbuild/linux-arm640.25.12indirekt
npm@esbuild/linux-ia320.25.12indirekt
npm@esbuild/linux-loong640.25.12indirekt
npm@esbuild/linux-mips64el0.25.12indirekt
npm@esbuild/linux-ppc640.25.12indirekt
npm@esbuild/linux-riscv640.25.12indirekt
npm@esbuild/linux-s390x0.25.12indirekt
npm@esbuild/linux-x640.25.12indirekt
npm@esbuild/netbsd-arm640.25.12indirekt
npm@esbuild/netbsd-x640.25.12indirekt
npm@esbuild/openbsd-arm640.25.12indirekt
npm@esbuild/openbsd-x640.25.12indirekt
npm@esbuild/openharmony-arm640.25.12indirekt
npm@esbuild/sunos-x640.25.12indirekt
npm@esbuild/win32-arm640.25.12indirekt
npm@esbuild/win32-ia320.25.12indirekt
npm@esbuild/win32-x640.25.12indirekt
npm@remirror/core-constants3.0.0indirekt
npm@rollup/rollup-android-arm-eabi4.60.2indirekt
npm@rollup/rollup-android-arm644.60.2indirekt
npm@rollup/rollup-darwin-arm644.60.2indirekt
npm@rollup/rollup-darwin-x644.60.2indirekt
npm@rollup/rollup-freebsd-arm644.60.2indirekt
npm@rollup/rollup-freebsd-x644.60.2indirekt
npm@rollup/rollup-linux-arm-gnueabihf4.60.2indirekt
npm@rollup/rollup-linux-arm-musleabihf4.60.2indirekt
npm@rollup/rollup-linux-arm64-gnu4.60.2indirekt
npm@rollup/rollup-linux-arm64-musl4.60.2indirekt
npm@rollup/rollup-linux-loong64-gnu4.60.2indirekt
npm@rollup/rollup-linux-loong64-musl4.60.2indirekt
npm@rollup/rollup-linux-ppc64-gnu4.60.2indirekt
npm@rollup/rollup-linux-ppc64-musl4.60.2indirekt
npm@rollup/rollup-linux-riscv64-gnu4.60.2indirekt
npm@rollup/rollup-linux-riscv64-musl4.60.2indirekt
npm@rollup/rollup-linux-s390x-gnu4.60.2indirekt
npm@rollup/rollup-linux-x64-gnu4.60.2indirekt
npm@rollup/rollup-linux-x64-musl4.60.2indirekt
npm@rollup/rollup-openbsd-x644.60.2indirekt
npm@rollup/rollup-openharmony-arm644.60.2indirekt
npm@rollup/rollup-win32-arm64-msvc4.60.2indirekt
npm@rollup/rollup-win32-ia32-msvc4.60.2indirekt
npm@rollup/rollup-win32-x64-gnu4.60.2indirekt
npm@rollup/rollup-win32-x64-msvc4.60.2indirekt
npm@tiptap/core3.6.2indirekt
npm@tiptap/extension-blockquote3.6.2indirekt
npm@tiptap/extension-bold3.6.2indirekt
npm@tiptap/extension-code-block3.6.2indirekt
npm@tiptap/extension-document3.6.2indirekt
npm@tiptap/extension-hard-break3.6.2indirekt
npm@tiptap/extension-heading3.6.2indirekt
npm@tiptap/extension-history3.6.2indirekt
npm@tiptap/extension-italic3.6.2indirekt
npm@tiptap/extension-link3.6.2indirekt
npm@tiptap/extension-list3.6.2indirekt
npm@tiptap/extension-paragraph3.6.2indirekt
npm@tiptap/extension-strike3.6.2indirekt
npm@tiptap/extension-superscript3.6.2indirekt
npm@tiptap/extension-text3.6.2indirekt
npm@tiptap/extension-underline3.6.2indirekt
npm@tiptap/extensions3.6.2indirekt
npm@tiptap/pm3.6.2indirekt
npm@types/estree1.0.8indirekt
npm@types/linkify-it5.0.0indirekt
npm@types/markdown-it14.1.2indirekt
npm@types/mdurl2.0.0indirekt
npmargparse2.0.1indirekt
npmcrelt1.0.6indirekt
npmentities4.5.0indirekt
npmesbuild0.25.12indirekt
npmescape-string-regexp4.0.0indirekt
npmfdir6.5.0indirekt
npmfsevents2.3.3indirekt
npmlinkify-it5.0.0indirekt
npmlinkifyjs4.3.2indirekt
npmmarkdown-it14.1.0indirekt
npmmdurl2.0.0indirekt
npmnanoid3.3.11indirekt
npmorderedmap2.1.1indirekt
npmpicocolors1.1.1indirekt
npmpicomatch4.0.4indirekt
npmpostcss8.5.10indirekt
npmprosemirror-changeset2.3.1indirekt
npmprosemirror-collab1.3.1indirekt
npmprosemirror-commands1.7.1indirekt
npmprosemirror-dropcursor1.8.2indirekt
npmprosemirror-gapcursor1.3.2indirekt
npmprosemirror-history1.4.1indirekt
npmprosemirror-inputrules1.5.0indirekt
npmprosemirror-keymap1.2.3indirekt
npmprosemirror-markdown1.13.2indirekt
npmprosemirror-menu1.2.5indirekt
npmprosemirror-model1.25.3indirekt
npmprosemirror-schema-basic1.2.4indirekt
npmprosemirror-schema-list1.5.1indirekt
npmprosemirror-state1.4.3indirekt
npmprosemirror-tables1.8.1indirekt
npmprosemirror-trailing-node3.0.0indirekt
npmprosemirror-transform1.10.4indirekt
npmprosemirror-view1.41.2indirekt
npmpunycode.js2.3.1indirekt
npmrollup4.60.2indirekt
npmrope-sequence1.3.4indirekt
npmsource-map-js1.2.1indirekt
npmtinyglobby0.2.16indirekt
npmuc.micro2.1.0indirekt
npmvite6.4.2indirekt
npmw3c-keyname2.2.8indirekt
RubyGemsaction_text-trix2.1.17indirekt
RubyGemsaction_text-trix2.1.18indirekt
RubyGemsactioncable8.1.3indirekt
RubyGemsactionmailbox8.1.3indirekt
RubyGemsactionmailer8.1.3indirekt
RubyGemsactionpack8.1.3indirekt
RubyGemsactiontext8.1.3indirekt
RubyGemsactionview8.1.3indirekt
RubyGemsactivejob8.1.3indirekt
RubyGemsactivemodel8.1.3indirekt
RubyGemsactiverecord8.1.3indirekt
RubyGemsactivestorage8.1.3indirekt
RubyGemsactivesupport8.1.3indirekt
RubyGemsannotaterb4.20.0indirekt
RubyGemsast2.4.3indirekt
RubyGemsbase640.3.0indirekt
RubyGemsbcrypt3.1.22indirekt
RubyGemsbigdecimal4.0.1indirekt
RubyGemsbigdecimal4.1.1indirekt
RubyGemsbindex0.8.1indirekt
RubyGemsbuilder3.3.0indirekt
RubyGemscapybara3.40.0indirekt
RubyGemsclass_variantsindirekt
RubyGemsclass_variants1.1.0indirekt
RubyGemsconcurrent-ruby1.3.6indirekt
RubyGemsconnection_pool3.0.2indirekt
RubyGemscrass1.0.6indirekt
RubyGemscss_parser1.21.1indirekt
RubyGemscss_parser2.0.0indirekt
RubyGemsdate3.5.1indirekt
RubyGemsdebug1.11.0indirekt
RubyGemsdiff-lcs1.6.2indirekt
RubyGemsdocile1.4.1indirekt
RubyGemsdotenv3.1.8indirekt
RubyGemsdrb2.2.3indirekt
RubyGemserubi1.13.1indirekt
RubyGemsfactory_bot6.2.1indirekt
RubyGemsfactory_bot_rails6.2.0indirekt
RubyGemsffi1.17.2indirekt
RubyGemsgenerator_spec0.10.0indirekt
RubyGemsglobalid1.3.0indirekt
RubyGemshtmlbeautifier1.4.3indirekt
RubyGemshtmlentities4.3.4indirekt
RubyGemsi18n1.14.8indirekt
RubyGemsio-console0.8.2indirekt
RubyGemsirb1.17.0indirekt
RubyGemslanguage_server-protocol3.17.0.5indirekt
RubyGemslint_roller1.1.0indirekt
RubyGemslogger1.7.0indirekt
RubyGemsmaglev-injectableindirekt
RubyGemsmaglev-injectable2.1.1indirekt
RubyGemsmail2.9.0indirekt
RubyGemsmarcel1.1.0indirekt
RubyGemsmatrix0.4.3indirekt
RubyGemsmini_magick4.13.2indirekt
RubyGemsmini_mime1.1.5indirekt
RubyGemsminitest6.0.2indirekt
RubyGemsminitest6.0.3indirekt
RubyGemsnet-pop0.1.2indirekt
RubyGemsnet-protocol0.2.2indirekt
RubyGemsnet-smtp0.5.1indirekt
RubyGemsnio4r2.7.5indirekt
RubyGemsnokogiri1.19.1indirekt
RubyGemsnokogiri1.19.2indirekt
RubyGemspagyindirekt
RubyGemspagy9.4.0indirekt
RubyGemsparallel1.27.0indirekt
RubyGemsparser3.3.10.0indirekt
RubyGemspp0.6.3indirekt
RubyGemsprettyprint0.2.0indirekt
RubyGemsprism1.6.0indirekt
RubyGemsprism1.9.0indirekt
RubyGemspsych5.3.1indirekt
RubyGemspublic_suffix6.0.2indirekt
RubyGemspublic_suffix7.0.5indirekt
RubyGemsracc1.8.1indirekt
RubyGemsrack-test2.2.0indirekt
RubyGemsrackup2.3.1indirekt
RubyGemsrails-dom-testing2.3.0indirekt
RubyGemsrails-html-sanitizer1.7.0indirekt
RubyGemsrailties8.1.3indirekt
RubyGemsrainbow3.1.1indirekt
RubyGemsrake13.3.1indirekt
RubyGemsrdoc7.2.0indirekt
RubyGemsredcarpet3.6.1indirekt
RubyGemsregexp_parser2.11.3indirekt
RubyGemsreline0.6.3indirekt
RubyGemsrouge4.6.1indirekt
RubyGemsrouge4.7.0indirekt
RubyGemsrspec-core3.13.6indirekt
RubyGemsrspec-expectations3.13.5indirekt
RubyGemsrspec-mocks3.13.7indirekt
RubyGemsrspec-rails8.0.2indirekt
RubyGemsrspec-support3.13.6indirekt
RubyGemsrubocop1.81.7indirekt
RubyGemsrubocop-ast1.47.1indirekt
RubyGemsrubocop-md2.0.3indirekt
RubyGemsrubocop-minitest0.38.2indirekt
RubyGemsrubocop-packaging0.6.0indirekt
RubyGemsrubocop-performance1.26.1indirekt
RubyGemsrubocop-rails2.33.4indirekt
RubyGemsrubocop-rails_config1.17.1indirekt
RubyGemsrubocop-rspec3.7.0indirekt
RubyGemsruby-progressbar1.13.0indirekt
RubyGemsruby-vips2.2.5indirekt
RubyGemssecurerandom0.4.1indirekt
RubyGemssimplecov0.22.0indirekt
RubyGemssimplecov-html0.13.2indirekt
RubyGemssimplecov_json_formatter0.1.4indirekt
RubyGemsstringio3.2.0indirekt
RubyGemsthor1.5.0indirekt
RubyGemstimeout0.4.4indirekt
RubyGemstimeout0.6.1indirekt
RubyGemstsort0.2.0indirekt
RubyGemsturbo-railsindirekt
RubyGemsturbo-rails2.0.20indirekt
RubyGemsturbo-rails2.0.23indirekt
RubyGemstzinfo2.0.6indirekt
RubyGemsunicode-display_width3.2.0indirekt
RubyGemsunicode-emoji4.1.0indirekt
RubyGemsuri1.1.1indirekt
RubyGemsuseragent0.16.11indirekt
RubyGemsview_componentindirekt
RubyGemsview_component4.1.1indirekt
RubyGemsweb-console4.2.1indirekt
RubyGemswebsocket-driver0.8.0indirekt
RubyGemswebsocket-extensions0.1.5indirekt
RubyGemsxpath3.2.0indirekt
RubyGemszeitwerk2.7.5indirekt
Abhängigkeits-Advisories 21

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 263 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 21 tragen bekannte Advisories, davon 7 direkte. 7 konnten nicht bewertet werden – keine aufgelöste Version, ein nicht unterstütztes Ökosystem, oder außerhalb der ausgewiesenen Paketliste.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
activestorage8.1.3indirektkritisch18.1.3.1
puma7.1.0direkthoch28.0.2
puma8.0.0direkthoch28.0.2
concurrent-ruby1.3.6indirekthoch31.3.7
css_parser1.21.1indirekthoch23.0.0
css_parser2.0.0indirekthoch23.0.0
linkify-it5.0.0indirekthoch25.0.2
nokogiri1.19.1indirekthoch101.19.4
nokogiri1.19.2indirekthoch101.19.4
postcss8.5.10indirekthoch28.5.18
view_component4.1.1indirekthoch44.12.0
vite6.4.2indirekthoch28.0.16
websocket-driver0.8.0indirekthoch40.8.2
loofah2.25.1direktmittel32.25.2
net-imap0.6.4direktmittel30.6.4.1
sqlite32.7.4direktmittel22.9.5
yard0.9.43direktmittel10.9.44
action_text-trix2.1.17indirektmittel22.1.18
markdown-it14.1.0indirektmittel214.2.0
json2.19.3direktniedrig12.19.9
rails-html-sanitizer1.7.0indirektniedrig11.7.1

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "cms",
        "ruby",
        "ruby-on-rails",
        "content-management-system",
        "pagebuilder",
        "page-builder",
        "ror",
        "website-builder"
      ],
      "is_fork": false,
      "size_kb": 9931,
      "has_wiki": true,
      "homepage": "https://www.maglev.dev",
      "languages": {
        "CSS": 90586,
        "HTML": 214167,
        "Ruby": 705711,
        "Shell": 440,
        "Dockerfile": 2805,
        "JavaScript": 104015
      },
      "pushed_at": "2026-08-02T15:33:53Z",
      "created_at": "2021-03-26T08:36:26Z",
      "owner_type": "Organization",
      "updated_at": "2026-08-02T15:10:21Z",
      "description": "Ruby on Rails website builder ",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby",
        "HTML"
      ]
    },
    "owner": {
      "blog": "https://www.maglev.dev",
      "name": "MaglevCMS",
      "type": "Organization",
      "login": "maglevhq",
      "company": null,
      "location": "Toulouse",
      "followers": 19,
      "avatar_url": "https://avatars.githubusercontent.com/u/70531979?v=4",
      "created_at": "2020-08-31T15:51:36Z",
      "is_verified": null,
      "public_repos": 13,
      "account_age_days": 2161
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2026-08-02T15:09:53Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2026-07-08T23:46:07Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2026-04-22T21:53:46Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2026-04-21T22:52:21Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2025-11-02T20:46:49Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2025-07-08T14:14:21Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2024-12-16T23:52:54Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2024-09-17T22:48:59Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2024-08-30T11:01:54Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2024-08-30T09:51:11Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2024-08-29T13:04:16Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2024-07-02T21:13:37Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2024-03-29T22:58:53Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2024-01-07T22:31:20Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2024-01-07T21:42:39Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2023-11-10T16:36:26Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2023-10-02T17:40:35Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2023-09-08T10:39:10Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2023-07-24T10:59:34Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2023-07-14T17:34:42Z"
        },
        {
          "tag": "v1.1.7",
          "kind": "patch",
          "published_at": "2022-12-11T20:11:52Z"
        },
        {
          "tag": "v1.1.6",
          "kind": "patch",
          "published_at": "2022-11-27T21:56:47Z"
        },
        {
          "tag": "v1.1.5",
          "kind": "patch",
          "published_at": "2022-11-20T19:24:36Z"
        },
        {
          "tag": "v1.1.4",
          "kind": "patch",
          "published_at": "2022-11-16T09:09:54Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2022-11-01T22:17:16Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2022-11-01T21:55:52Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2022-11-01T21:51:31Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2022-11-01T21:35:18Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2022-10-11T14:05:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "eff8c954e76765844376454e39a07b689ecd7e9c",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 3.0.3",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-08-02T15:09:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5e18e8eea7dd6cdc70dd3f68426f6bf2b870c48",
          "body": null,
          "is_bot": false,
          "headline": "fix: cast checkbox settings on update so unchecked values stay false",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-08-02T15:08:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95ba7a92dba2237f85878d20796a0b441757a376",
          "body": "…p warning (#253)",
          "is_bot": false,
          "headline": "fix(editor): defer preview resize updates to avoid ResizeObserver loo…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-08-02T14:11:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48c0bc1b1e2c66945f68a8a97839c392e7db5842",
          "body": null,
          "is_bot": false,
          "headline": "fix: prevent stale lock_version errors during editor autosave (#249)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-07-22T22:17:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dffe082e3aab3fecac304fff90344fed708f176f",
          "body": "…(#247) (#248)",
          "is_bot": false,
          "headline": "fix: prevent overlapping autosaves from sending a stale lock_version …",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-07-21T22:15:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f903a80fee764ecd0152479fc4458dc39e9a154",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v3.0.2",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-07-08T23:46:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b01d0694c3df267e0ebfeb7bbdcffb5867c0e792",
          "body": "…mportmap error in theme layouts (#244)",
          "is_bot": false,
          "headline": "fix: add maglev_javascript_importmap_tags to prevent Firefox double-i…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-07-02T14:42:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26a860feb5b9b0fd4df1f747ef846cb4b541d55d",
          "body": "* fix: sort sections crash when site-scoped section IDs differ from page IDs",
          "is_bot": false,
          "headline": "bug: moving a section triggers an error on demo page (#242)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-06-22T20:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b4cbd82276ad3b6a6ad8cce9d19ac13ae1aba77",
          "body": "Use Rails.error.report in track_maglev_error so errors caught by the turbo_stream rescue branch are forwarded to all subscribed error trackers (Honeybadger, Sentry, etc.) instead of being silently swallowed.",
          "is_bot": false,
          "headline": "fix: fix editor errors not being reported to Honeybadger (#241)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-06-15T10:49:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47a082de1fe7aea876711f7637951c70ac4bd16d",
          "body": null,
          "is_bot": false,
          "headline": "fix: truncate long page titles and paths in editor top bar (#240)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-06-14T15:50:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fca38773b6f1ae417f21341e3a6a6206777880c1",
          "body": "… (#239)",
          "is_bot": false,
          "headline": "feat: add studio section preview endpoint and webp screenshot support…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-06-09T22:12:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ac2abbccd7e07e1e2d56213203e16c8eb25c798",
          "body": null,
          "is_bot": false,
          "headline": "fix: preserve picker params across image gallery search (#232)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-05-06T17:26:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f241a84eee09309c25f7d2f549c3d9ee638805ab",
          "body": null,
          "is_bot": false,
          "headline": "chore(security): pin erb and net-imap to patched versions",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-05-06T17:25:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86d0d27b4c32c20d077134010b0c7b05e04b292a",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix dependabot alerts",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-05-04T20:40:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d2539384c665186c7cd02f11e65a28a8a818016",
          "body": null,
          "is_bot": false,
          "headline": "fix: run section add preview update without debounce",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-05-04T20:38:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c268031de200b37348db69060339cbe47e39cf6e",
          "body": null,
          "is_bot": false,
          "headline": "chore: the template now uses Maglev v3.0.1",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8dd4a1a5cdb10008fbe791d8850bd5f594b3d7b",
          "body": null,
          "is_bot": false,
          "headline": "chore: wrong syntax in the gemspec",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a39df9c141a25f1d67f811c2d2c38880c70e93b4",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 3.0.1",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:50:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e11fb4bd59185bfff73b2fb325857fe04a365e25",
          "body": null,
          "is_bot": false,
          "headline": "chore: lint the maglevcms.gemspec file",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:48:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f6910a9a05cb5ac453783dd7636a93e437aab21",
          "body": null,
          "is_bot": false,
          "headline": "fix(editor): open section picker modal from list insert buttons",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:40:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e989cb044e9b0a08c3063c9d66970175039882a",
          "body": null,
          "is_bot": false,
          "headline": "fix(editor): use correct i18n key for section breadcrumb back link",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T21:29:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b77cc4cdbc6e9dded6a74a27605ffedc01e5cbec",
          "body": null,
          "is_bot": false,
          "headline": "fix(editor): make asset delete use Turbo-friendly URL",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-22T19:50:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e15234611649c65bc87287cdccef6d98c4f51b1",
          "body": null,
          "is_bot": false,
          "headline": "chore: when testing Maglev, publish the site at the end",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T23:04:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd26cfc3956ac053db50b5a2963358e668d8c7fd",
          "body": null,
          "is_bot": false,
          "headline": "chore: template.rb now uses Maglev v3",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:53:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e2ce4fd1085375e8236a210dca52e46eed7c91f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): prepare Maglev v3",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:52:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1252302945296f779f6770adc9b1e56123683bb6",
          "body": null,
          "is_bot": false,
          "headline": "docs: rewrite README + add changelog, docs, and repo links to gemspec",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8c32bfa5fcbd7100a1ba12b71abbf7853b3bb79",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix vulnerabilities in Gems (again)",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:35:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4f2d8d1af7da31d88bb54df1ba868b1525803fe",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix vulnerabilities in Gems (again)",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:31:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e983652b213eb20fa3b5512c07b6e3be33aec8ed",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix vulnerabilities in Gems",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-04-21T22:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d6bbfa7d23a7c3511a2a0af14ec9b727bc94794",
          "body": "* feat: allow configuring Maglev base controller class",
          "is_bot": false,
          "headline": "feat: allow configuring Maglev base controller class (#228)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-04-17T21:00:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a347aedf8e088df73509b5ff6ea65e5ea839b15",
          "body": "* feat: build the lookbook_host Rails app\n\n* chore: use CDN to serve assets of the uikit preview app\n\n* chore: we don't need kamal hooks",
          "is_bot": false,
          "headline": "feat: publish the Maglev lookbook (#227)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-04-17T19:28:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63ee2ffabcc4c07734b9a1b76e1157070d1d77a5",
          "body": null,
          "is_bot": false,
          "headline": "fix: regression when setting a link in the RTE component",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-30T22:34:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d88ebc884521b99079d22444b91e556f401abfc",
          "body": null,
          "is_bot": false,
          "headline": "fix: NoMethodError when link_type is missing or unknown in LinkComponent",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-30T22:17:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5d11dc2d2ee5d465a484fbb006a90a425483e4e",
          "body": "* feat: use a modal to present the sections from the theme + allow to search for a specific section\n\n* fix: truncate the labels of the button\n\n* chore: allow to disable the loading of the single theme",
          "is_bot": false,
          "headline": "feat: revamp the \"add section\" UI/UX (#225)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-29T22:33:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67826c021dbbadb42dd0a3b04732742bc692e0b4",
          "body": "* feat: refine Maglev editor sidebar icon navigation styling\n\n* feat: polish the device toggler\n\n* feat: use a secondary button for the LocaleSwitcher component\n\n* feat: pimp the color picker presets popup + add a sub title for the edit style page\n\n* fix: empty-page \"add section\" link follows current page (overlay in #root, Tailwind variant)",
          "is_bot": false,
          "headline": "feat: small UI polishing (#224)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-28T21:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26710970b4079d25a6b157bedb3b69d518aecddc",
          "body": "…load) (#223)\n\n* fix editor preview iframe consuming browser Back (use replace/reload)\n\n* fix: editor preview: sync iframe to meta, avoid history/double-load on list",
          "is_bot": false,
          "headline": "fix: fix editor preview iframe consuming browser Back (use replace/re…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-28T09:41:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "505d98ef4e1780270d106779848801ac4809e839",
          "body": null,
          "is_bot": false,
          "headline": "chore: fix vulnerabilities",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-27T21:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1612a323d9f1ee07268a3432f1722015a30ed0e",
          "body": "* feat: pimp the ListItemComponent to display a sub title + add the ghost variant\n\n* feat: pimp the ListItemComponent to render an icon + apply it to the list of pages\n\n* chore: run the tests job in the PR on GH",
          "is_bot": false,
          "headline": "feat: display the path in the list of pages (#222)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-27T21:10:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1da540b5d45446374958f835f729c770d099a2f5",
          "body": null,
          "is_bot": false,
          "headline": "fix: serve SVG uploads as image/svg+xml in Maglev asset proxy",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-23T13:11:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "807729a572305826233f63f1add31819dab2ecb2",
          "body": null,
          "is_bot": false,
          "headline": "chore: write the first 2  tech docs",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-15T11:31:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5eb42bcaaac051886020517241a5d06abe34609",
          "body": "* chore: bump version to 3.0.0.beta4\n\n* chore: better instructions (install generator)",
          "is_bot": false,
          "headline": "chore: bump version to 3.0.0.beta4 (#220)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-15T10:11:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09c3daaa9150263c94b00a289531414081751411",
          "body": null,
          "is_bot": false,
          "headline": "chore: resolve dependabot alerts",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-15T00:04:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13d685fbd8202141eb0d8424ed9a573b6401a233",
          "body": null,
          "is_bot": false,
          "headline": "fix: make sure the config event is always sent to the iframe (#219)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-14T23:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5e1332949fd6440163567abc5afc524a688943e",
          "body": null,
          "is_bot": false,
          "headline": "chore: by default, keep the Maglev JS Editor silent (#218)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-14T17:43:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "053af96c4e796273de68f5542defd20a6a27ca4e",
          "body": "* feat: prefetch the edit section or block form when hovering a setting in the live preview\n\n* fix: return the 404 error page if a visitor asks for a page which doesn't exist even in draft mode\n\n* feat: change the background color of the Turbo progress bar.",
          "is_bot": false,
          "headline": "feat: prefetch on hovering section (#217)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-14T17:06:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c92e5086b7cb0ba34a6354853ef2689c5905a468",
          "body": "… admin section anymore)",
          "is_bot": false,
          "headline": "chore: deprecate admin_username and admin_password (we don't have the…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-10T17:53:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dd6b6ee1a8301191975228cefc0ecf19e1d69bc",
          "body": "… (MaglevPro)",
          "is_bot": false,
          "headline": "feat: disable the live preview link if there is no available live url…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-03-08T23:01:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a57d0e0dcad41600f9d332a86b2b7e8ac3842f84",
          "body": null,
          "is_bot": false,
          "headline": "chore: don't implement lock_version of the section/block levels (#216)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-03-05T21:34:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a042531c0ed211492979af940d2865585310b7f",
          "body": "…gs + introduce the Well UIKit component",
          "is_bot": false,
          "headline": "feat: display a message if a section or a block has no defined settin…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-14T13:38:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9a59548878bed276e95c83844b0169b48c5b05d",
          "body": null,
          "is_bot": false,
          "headline": "fix: don't display the pagination info in the list of pages drawer",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-13T21:43:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0116031e21573c359a60a1dcbcbb1175310f0993",
          "body": null,
          "is_bot": false,
          "headline": "fix: use offset argument name instead of page when doing pagination",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-13T21:43:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e317047a015dba06e6872c8826f68fb870126ef",
          "body": "…#215)",
          "is_bot": false,
          "headline": "fix: allow to publish changes on site scoped sections from any page (…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-02-11T12:37:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2fad0d878aed0d066c413c6a9f56f994018aeac",
          "body": "…value",
          "is_bot": false,
          "headline": "feat: the per_page value for assets pagination is now a configurable …",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-04T22:25:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bc9eaf05813094012b9af304907e541711e6c9d",
          "body": "* feat: paginate the list of pages, disabled by default\n\n* chore: cosmetic changes to the maglev buttons",
          "is_bot": false,
          "headline": "feat: paginate the list of pages (#214)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-02-04T21:52:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1633629c6a069d7cbf08814508449d2f5ce2f2e9",
          "body": "…block which doesn't exist anymore after a draft discarding",
          "is_bot": false,
          "headline": "fix: redirect to the list of sections if the view is about a section/…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-03T23:34:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0aa2905bd3296703528d5d80cb6a9ae2a48355a6",
          "body": null,
          "is_bot": false,
          "headline": "chore: refactor the PageClone controller",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-02-03T23:10:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a2329fb02e25922ec82e38c09e87830f1f21080",
          "body": null,
          "is_bot": false,
          "headline": "feat: don't hide the error if the service can't discard the draft",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-01-28T11:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab5e5f76fd10b008259f921041dc802b1884ed6d",
          "body": "* feat: implementing the revert draft changes action\n\n* chore: install ViewComponent 4.1.1 (Rails 7.2)\n\n* feat: new menu dropdown component\n\n* feat: new button group component",
          "is_bot": false,
          "headline": "feat: implementing the revert changes action (#213)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-01-27T23:17:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e51ef3cbb6fd603cf04c5ff8b134edaf3cfa1d3",
          "body": "… a block tree structured section",
          "is_bot": false,
          "headline": "fix: don't build non-root blocks when building the default content of…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-01-21T11:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87bc35c73467fb49530254e81603662e3829a17d",
          "body": "* feat: publish page information (title + seo information)\n\n* feat: make easier for developers to add additionnal page attributes to publish\n\n* chore: support for Sqlite /MySQL/MariaDB",
          "is_bot": false,
          "headline": "feat: publish page information (title + seo information) (#212)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-01-18T10:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "564aa394b47375647247bfbb01be51afdf07621e",
          "body": null,
          "is_bot": false,
          "headline": "fix: handle nil links (when editing a link + published page)",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2026-01-13T12:24:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e9a61511b269dc7a0f2d001568ad09e84cb32e0",
          "body": "…the main app (#211)",
          "is_bot": false,
          "headline": "chore: namespace all the external JS libraries to avoid conflicts in …",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2026-01-11T10:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77455678efdeb15993e6f988bd598b2314dd5512",
          "body": null,
          "is_bot": false,
          "headline": "feat(editor): fire a global event when the page is updated (#207)",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-22T11:01:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02da101ab5f971ed7d10d5d7ad5033c4c8d767ec",
          "body": null,
          "is_bot": false,
          "headline": "feat(routes): split the big engine routes in chunks",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-22T10:10:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40e38957bf718fb006f6cbcff88cc65ed0e9179d",
          "body": null,
          "is_bot": false,
          "headline": "fix(assets): issue #206",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-22T09:58:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2857ad48400ecf839c27926de5fea99e6e2df8b",
          "body": null,
          "is_bot": false,
          "headline": "fix(assets): fix #198",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-05T17:55:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4790f968422de37bfbea8389435c0a8ed9ff299e",
          "body": null,
          "is_bot": false,
          "headline": "fix(assets): help Sprockets to process the right css files",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-01T23:23:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9533db51bf9c3dd6f00fe1fea1796c8aa1c1777b",
          "body": null,
          "is_bot": false,
          "headline": "chore: install 3.0.0.beta3 by default",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-12-01T14:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96579f999c1d27ed64ff75bb3ca4ee83861ccfd2",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 3.0.0.beta3",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-30T22:42:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ac865383eff41ce52d0922d342e9f0624321b90",
          "body": null,
          "is_bot": false,
          "headline": "fix: don't break the page rendering of a published page with no sections",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-29T16:57:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31a54c8996e8d44cb1f0b06b99cb55b036403951",
          "body": null,
          "is_bot": false,
          "headline": "chore: apply Rubocop",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-29T15:39:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9b18b7c36fc33b381c198d26767477e7e1675cb",
          "body": "* feat: add a column in the Site + Page models to know when a page has been published + refresh the status of the page in the UI (WIP)\n\n* feat: delay the render of the turbo streams when publishing a page (better UX)\n\n* feat: find the exact combination to sync the PageInfo component + PublishPage button in any situation",
          "is_bot": false,
          "headline": "feat: display the page with a dot for the publishing status (#201)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2025-11-27T21:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efe7ff40d11733f4863125316195c6289815444a",
          "body": "…rs other than the Maglev core source",
          "is_bot": false,
          "headline": "fix: the Tailwindcss compiled file contained classes from local folde…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-16T15:04:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ede73cfbae0ed069c731edd5b78af75b2f4dd64",
          "body": "…the site) if no site has been found",
          "is_bot": false,
          "headline": "feat: in development only, display a help page (with a CTA to create …",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-16T14:46:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ed9bb0e3ef195bdb692781e9e819e49cb68d0e7",
          "body": null,
          "is_bot": false,
          "headline": "chore: 3.0.0.beta2 is now used by the template.rb",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-13T23:15:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fb82e8aa0b371941ad7f1b3cf98d0728afc9cb0",
          "body": null,
          "is_bot": false,
          "headline": "chore: forgot to include the vendor in the gem 🤦🏻‍♂️",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-13T23:12:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "181074e525f71df582b870998d3fe14b313d6bea",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 3.0.0.beta1",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-13T23:02:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f3ff656d096cfb024a7135b8fce4f991e037434",
          "body": null,
          "is_bot": false,
          "headline": "fix: wrong calculated position of a section when insert_at was bottom",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T20:58:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c6499851908144dd372212d6097776f9519a25d",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove useless files",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T17:29:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab0069efe318f6851f12dc8a24fcbb1dce4cb889",
          "body": null,
          "is_bot": false,
          "headline": "chore: ignore the docs folder",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T17:27:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed8dc5ea6b36258df116918e921907f30b7b2a4c",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2025-11-11T17:25:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d836a67d63028d7ab9996f377c5b0bb9c94db499",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2025-11-11T17:22:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3baa0f79720733776249847b9e5a25cc22fc066e",
          "body": null,
          "is_bot": false,
          "headline": "chore: better landing page for the project",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T15:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7a3d86aad6377d7b094acd1ee9577ae4a929e35",
          "body": null,
          "is_bot": false,
          "headline": "fix: halt if no site was found (publish_site CLI command)",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T15:06:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f23f68571ad88f389e585855d353b2c0e96e4abf",
          "body": null,
          "is_bot": false,
          "headline": "feat: write a CLI command to publish all the pages of a site",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T15:00:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca4c6d551e39c7f5ed25f246431de4a6c7d6ad12",
          "body": "… draft/live versions of a page",
          "is_bot": false,
          "headline": "feat(ui/ux): add a button in the page actions dropdown to preview the…",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-11T14:42:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4df9066b076d453a05a5397a7baefa336d155a9",
          "body": null,
          "is_bot": false,
          "headline": "feat(ux): use an old school back link instead of the breadcrumbs",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-10T23:17:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "923cecadee710277e5eb86c9596f953b4b651134",
          "body": null,
          "is_bot": false,
          "headline": "feat: don't use \"-ing\" form in the title",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-09T21:36:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0974c797d14d7a1af5a9f351fd38fd089001386",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui/ux): display a notification when publishing the page is done",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-09T21:22:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f6e85b9132a2c718b2208b018f76add2a10a57e",
          "body": null,
          "is_bot": false,
          "headline": "feat(ux): don't display the locale switcher if one single locale",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-08T10:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7790fcd012bad3f54964555802ba178326d84f49",
          "body": null,
          "is_bot": false,
          "headline": "feat(ux): add a link to preview a page",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-08T10:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dad38e92be992776a7e6f6ab0fe43d0584d227f8",
          "body": null,
          "is_bot": false,
          "headline": "chore: don't support the last version of Pagy yet 🤞",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-03T13:11:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4a58409338ecb05a1700b00f49fa7b7e6105239",
          "body": null,
          "is_bot": false,
          "headline": "chore: don't support the last version of Pagy yet",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-03T12:14:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fd91343a35c11c4bc80e86d551d7e8850b6a629",
          "body": null,
          "is_bot": false,
          "headline": "chore: don't support the last version of Pagy yet",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-03T12:14:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ab679cc4cbb8843dcce56d9e833b8ba06d8aaf5",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade to Rails 8.1.1",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-02T23:05:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d19dbdffda48a3b2bf57b1cc4ca6a98594d0e907",
          "body": "…ion screenshots (#187)",
          "is_bot": false,
          "headline": "feat: use the Rails asset host to generate the URL of the static sect…",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2025-11-02T22:19:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e175b0c1b24bd315605d842eeadf5fec092ae907",
          "body": "The Quick Start doc for the `long_version` suggests already 1.3 and not 1.2 anymore.\r\nRef: https://docs.maglev.dev/quickstart/#long-version",
          "is_bot": false,
          "headline": "Update template.rb to use image_processing '~> 1.3' (#191)",
          "author_name": "Helio Cola",
          "author_login": "heliocola",
          "committed_at": "2025-11-02T22:18:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c640c99ff17eabd2a06bb8193028c324ddc8ecde",
          "body": "* fix: make sure the default value of translatable attributes work in MySQL\n\n* chore: another way of registering the LocalesType\n\n* fix: use Arel.sql instead (in order to support Rails 7.0)\n\n* chore(ci): update the test matrix (databases / rails versions)\n\n* chore(ci): MySQL/MariaDB doesnt work well with Rails 7.0",
          "is_bot": false,
          "headline": "feat: MariaDB/MySQL support  (#185)",
          "author_name": "Didier Lafforgue",
          "author_login": "did",
          "committed_at": "2025-11-02T22:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd0ca51bd12dd65823b4784079002ecdf0fbdf8b",
          "body": null,
          "is_bot": false,
          "headline": "chore: add a Lookbook preview about to design buttons",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-02T17:12:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fc1ceecfe1bf7522d7d8bc96a71afbcf546ce86",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui/ux): improve the assets library based on a designer's feedbacks",
          "author_name": "Did",
          "author_login": "did",
          "committed_at": "2025-11-02T16:53:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 29,
      "commits_last_year": 252,
      "latest_release_at": "2026-08-02T15:09:53Z",
      "latest_release_tag": "v3.0.3",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 36,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 78
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "maglevcms",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/maglevcms",
          "is_deprecated": false,
          "latest_version": "3.0.3",
          "repository_url": "https://github.com/maglevhq/maglev-core",
          "versions_count": 34,
          "total_downloads": 37646,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2022-09-30T15:47:10.378000Z",
          "latest_published_at": "2026-08-02T15:34:06.674000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 65,
      "stars": 380,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2022-10-05",
            "count": 1
          },
          {
            "date": "2022-10-13",
            "count": 1
          },
          {
            "date": "2022-10-18",
            "count": 1
          },
          {
            "date": "2022-10-21",
            "count": 1
          },
          {
            "date": "2022-11-10",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 1
          },
          {
            "date": "2022-11-28",
            "count": 1
          },
          {
            "date": "2022-12-18",
            "count": 1
          },
          {
            "date": "2023-01-31",
            "count": 1
          },
          {
            "date": "2023-02-03",
            "count": 1
          },
          {
            "date": "2023-02-10",
            "count": 1
          },
          {
            "date": "2023-03-23",
            "count": 1
          },
          {
            "date": "2023-03-26",
            "count": 1
          },
          {
            "date": "2023-04-18",
            "count": 1
          },
          {
            "date": "2023-04-26",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-05-15",
            "count": 1
          },
          {
            "date": "2023-05-23",
            "count": 1
          },
          {
            "date": "2023-06-29",
            "count": 1
          },
          {
            "date": "2023-07-02",
            "count": 1
          },
          {
            "date": "2023-07-07",
            "count": 1
          },
          {
            "date": "2023-07-08",
            "count": 1
          },
          {
            "date": "2023-07-22",
            "count": 1
          },
          {
            "date": "2023-07-23",
            "count": 1
          },
          {
            "date": "2023-07-24",
            "count": 1
          },
          {
            "date": "2023-08-09",
            "count": 1
          },
          {
            "date": "2023-08-12",
            "count": 1
          },
          {
            "date": "2023-09-18",
            "count": 1
          },
          {
            "date": "2023-10-04",
            "count": 1
          },
          {
            "date": "2023-11-01",
            "count": 1
          },
          {
            "date": "2023-11-12",
            "count": 1
          },
          {
            "date": "2024-01-02",
            "count": 1
          },
          {
            "date": "2024-02-24",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-04-04",
            "count": 1
          },
          {
            "date": "2024-05-27",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-07-13",
            "count": 1
          },
          {
            "date": "2024-07-19",
            "count": 1
          },
          {
            "date": "2024-09-01",
            "count": 1
          },
          {
            "date": "2024-09-25",
            "count": 1
          },
          {
            "date": "2024-09-30",
            "count": 1
          },
          {
            "date": "2024-11-12",
            "count": 1
          },
          {
            "date": "2024-12-02",
            "count": 1
          },
          {
            "date": "2024-12-24",
            "count": 1
          },
          {
            "date": "2024-12-27",
            "count": 1
          },
          {
            "date": "2024-12-28",
            "count": 1
          },
          {
            "date": "2025-01-04",
            "count": 1
          },
          {
            "date": "2025-01-30",
            "count": 1
          },
          {
            "date": "2025-02-01",
            "count": 1
          },
          {
            "date": "2025-02-04",
            "count": 1
          },
          {
            "date": "2025-02-20",
            "count": 1
          },
          {
            "date": "2025-03-06",
            "count": 1
          },
          {
            "date": "2025-03-09",
            "count": 1
          },
          {
            "date": "2025-04-03",
            "count": 1
          },
          {
            "date": "2025-07-03",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-08-17",
            "count": 1
          },
          {
            "date": "2025-09-26",
            "count": 1
          },
          {
            "date": "2025-10-02",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 65,
        "total_forks": 65
      },
      "star_history": null,
      "open_issues_and_prs": 23
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 25321,
      "source_files_sampled": 574,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile",
        "lookbook_host/Gemfile"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "activestorage",
            "direct": false,
            "version": "8.1.3",
            "severity": "critical",
            "ecosystem": "rubygems",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-xr9x-r78c-5hrm"
            ],
            "fixed_version": "8.1.3.1",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          },
          {
            "name": "puma",
            "direct": true,
            "version": "7.1.0",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-2vqw-3mp8-cgmx",
              "GHSA-qpgp-93vx-g8v8"
            ],
            "fixed_version": "8.0.2",
            "advisory_count": 2,
            "oldest_advisory_days": 54
          },
          {
            "name": "puma",
            "direct": true,
            "version": "8.0.0",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-2vqw-3mp8-cgmx",
              "GHSA-qpgp-93vx-g8v8"
            ],
            "fixed_version": "8.0.2",
            "advisory_count": 2,
            "oldest_advisory_days": 54
          },
          {
            "name": "concurrent-ruby",
            "direct": false,
            "version": "1.3.6",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-6wx8-w4f5-wwcr",
              "GHSA-h8w8-99g7-qmvj",
              "GHSA-wv3x-4vxv-whpp"
            ],
            "fixed_version": "1.3.7",
            "advisory_count": 3,
            "oldest_advisory_days": 43
          },
          {
            "name": "css_parser",
            "direct": false,
            "version": "1.21.1",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-9pmc-p236-855h",
              "GHSA-ff6c-w6qf-7xqc"
            ],
            "fixed_version": "3.0.0",
            "advisory_count": 2,
            "oldest_advisory_days": 87
          },
          {
            "name": "css_parser",
            "direct": false,
            "version": "2.0.0",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-9pmc-p236-855h",
              "GHSA-ff6c-w6qf-7xqc"
            ],
            "fixed_version": "3.0.0",
            "advisory_count": 2,
            "oldest_advisory_days": 87
          },
          {
            "name": "linkify-it",
            "direct": false,
            "version": "5.0.0",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-22p9-wv53-3rq4",
              "GHSA-v245-v573-v5vm"
            ],
            "fixed_version": "5.0.2",
            "advisory_count": 2,
            "oldest_advisory_days": 36
          },
          {
            "name": "nokogiri",
            "direct": false,
            "version": "1.19.1",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-5prr-v3j2-97mh",
              "GHSA-5v8h-3h3q-446p",
              "GHSA-8678-w3jw-xfc2",
              "GHSA-9cv2-cfxc-v4v2",
              "GHSA-c4rq-3m3g-8wgx",
              "GHSA-p67v-3w7g-wjg7",
              "GHSA-phwj-rprq-35pp",
              "GHSA-v2fc-qm4h-8hqv",
              "GHSA-wfpw-mmfh-qq69",
              "GHSA-wjv4-x9w8-wm3h"
            ],
            "fixed_version": "1.19.4",
            "advisory_count": 10,
            "oldest_advisory_days": 87
          },
          {
            "name": "nokogiri",
            "direct": false,
            "version": "1.19.2",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-5prr-v3j2-97mh",
              "GHSA-5v8h-3h3q-446p",
              "GHSA-8678-w3jw-xfc2",
              "GHSA-9cv2-cfxc-v4v2",
              "GHSA-c4rq-3m3g-8wgx",
              "GHSA-p67v-3w7g-wjg7",
              "GHSA-phwj-rprq-35pp",
              "GHSA-v2fc-qm4h-8hqv",
              "GHSA-wfpw-mmfh-qq69",
              "GHSA-wjv4-x9w8-wm3h"
            ],
            "fixed_version": "1.19.4",
            "advisory_count": 10,
            "oldest_advisory_days": 87
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.10",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-6g55-p6wh-862q",
              "GHSA-r28c-9q8g-f849"
            ],
            "fixed_version": "8.5.18",
            "advisory_count": 2,
            "oldest_advisory_days": 10
          },
          {
            "name": "view_component",
            "direct": false,
            "version": "4.1.1",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 8.7,
            "advisory_ids": [
              "GHSA-7f3r-gwc9-2995",
              "GHSA-97jw-64cj-jc58",
              "GHSA-9h85-g7w3-rh49",
              "GHSA-hg3h-g7xc-f7vp"
            ],
            "fixed_version": "4.12.0",
            "advisory_count": 4,
            "oldest_advisory_days": 85
          },
          {
            "name": "vite",
            "direct": false,
            "version": "6.4.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-fx2h-pf6j-xcff",
              "GHSA-v6wh-96g9-6wx3"
            ],
            "fixed_version": "8.0.16",
            "advisory_count": 2,
            "oldest_advisory_days": 47
          },
          {
            "name": "websocket-driver",
            "direct": false,
            "version": "0.8.0",
            "severity": "high",
            "ecosystem": "rubygems",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-2x63-gw47-w4mm",
              "GHSA-33ph-fccm-39pj",
              "GHSA-8j3g-f24p-4mpw",
              "GHSA-ghhp-3qvg-889p"
            ],
            "fixed_version": "0.8.2",
            "advisory_count": 4,
            "oldest_advisory_days": 17
          },
          {
            "name": "loofah",
            "direct": true,
            "version": "2.25.1",
            "severity": "moderate",
            "ecosystem": "rubygems",
            "cvss_score": 4.7,
            "advisory_ids": [
              "GHSA-5qhf-9phg-95m2",
              "GHSA-8whx-365g-h9vv",
              "GHSA-9wjq-cp2p-hrgf"
            ],
            "fixed_version": "2.25.2",
            "advisory_count": 3,
            "oldest_advisory_days": 12
          },
          {
            "name": "net-imap",
            "direct": true,
            "version": "0.6.4",
            "severity": "moderate",
            "ecosystem": "rubygems",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-46q3-7gv7-qmgg",
              "GHSA-8p34-64r3-mwg8",
              "GHSA-c4fp-cxrr-mj66"
            ],
            "fixed_version": "0.6.4.1",
            "advisory_count": 3,
            "oldest_advisory_days": 53
          },
          {
            "name": "sqlite3",
            "direct": true,
            "version": "2.7.4",
            "severity": "moderate",
            "ecosystem": "rubygems",
            "cvss_score": 4.5,
            "advisory_ids": [
              "GHSA-28hh-pr2h-2w89",
              "GHSA-j7fr-3v8c-3qc3"
            ],
            "fixed_version": "2.9.5",
            "advisory_count": 2,
            "oldest_advisory_days": 4
          },
          {
            "name": "yard",
            "direct": true,
            "version": "0.9.43",
            "severity": "moderate",
            "ecosystem": "rubygems",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-pxcc-8665-phx8"
            ],
            "fixed_version": "0.9.44",
            "advisory_count": 1,
            "oldest_advisory_days": 36
          },
          {
            "name": "action_text-trix",
            "direct": false,
            "version": "2.1.17",
            "severity": "moderate",
            "ecosystem": "rubygems",
            "cvss_score": 4.6,
            "advisory_ids": [
              "GHSA-53g2-mvcc-q9x3",
              "GHSA-53p3-c7vp-4mcc"
            ],
            "fixed_version": "2.1.18",
            "advisory_count": 2,
            "oldest_advisory_days": 126
          },
          {
            "name": "markdown-it",
            "direct": false,
            "version": "14.1.0",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-38c4-r59v-3vqw",
              "GHSA-6v5v-wf23-fmfq"
            ],
            "fixed_version": "14.2.0",
            "advisory_count": 2,
            "oldest_advisory_days": 171
          },
          {
            "name": "json",
            "direct": true,
            "version": "2.19.3",
            "severity": "low",
            "ecosystem": "rubygems",
            "cvss_score": 3.7,
            "advisory_ids": [
              "GHSA-x2f5-4prf-w687"
            ],
            "fixed_version": "2.19.9",
            "advisory_count": 1,
            "oldest_advisory_days": 9
          },
          {
            "name": "rails-html-sanitizer",
            "direct": false,
            "version": "1.7.0",
            "severity": "low",
            "ecosystem": "rubygems",
            "cvss_score": 0,
            "advisory_ids": [
              "GHSA-cj75-f6xr-r4g7"
            ],
            "fixed_version": "1.7.1",
            "advisory_count": 1,
            "oldest_advisory_days": 11
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 2,
          "high": 12,
          "critical": 1,
          "moderate": 6
        },
        "advisory_count": 61,
        "affected_count": 21,
        "assessed_count": 263,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 7,
        "direct_affected_count": 7
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "rails",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 8.1.3"
        },
        {
          "name": "image_processing",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 1.12.2"
        },
        {
          "name": "propshaft",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "puma",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "mysql2",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "pg",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 1.5.9"
        },
        {
          "name": "sqlite3",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "benchmark",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "observer",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "ostruct",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "lookbook",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "importmap-rails",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 2.2"
        },
        {
          "name": "loofah",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.25.1"
        },
        {
          "name": "addressable",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.9.0"
        },
        {
          "name": "erb",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 6.0.4"
        },
        {
          "name": "json",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.19.2"
        },
        {
          "name": "net-imap",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 0.6.4"
        },
        {
          "name": "rack",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 3.2.6"
        },
        {
          "name": "rack-session",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.1.2"
        },
        {
          "name": "yard",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 0.9.42"
        },
        {
          "name": "activerecord-nulldb-adapter",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "lookbook",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "maglevcms",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "propshaft",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "puma",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 8.0"
        },
        {
          "name": "rails",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 8.1.3"
        },
        {
          "name": "addressable",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.9.0"
        },
        {
          "name": "erb",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 6.0.4"
        },
        {
          "name": "net-imap",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 0.6.4"
        },
        {
          "name": "rack",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 3.2.6"
        },
        {
          "name": "rack-session",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 2.1.2"
        },
        {
          "name": "yard",
          "manifest": "lookbook_host/Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": ">= 0.9.42"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "activerecord-nulldb-adapter",
            "direct": true,
            "version": "1.2.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "addressable",
            "direct": true,
            "version": "2.9.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "benchmark",
            "direct": true,
            "version": "0.5.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "erb",
            "direct": true,
            "version": "6.0.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "image_processing",
            "direct": true,
            "version": "1.12.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "importmap-rails",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "importmap-rails",
            "direct": true,
            "version": "2.2.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "importmap-rails",
            "direct": true,
            "version": "2.2.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "json",
            "direct": true,
            "version": "2.19.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "loofah",
            "direct": true,
            "version": "2.25.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "lookbook",
            "direct": true,
            "version": "2.3.14",
            "ecosystem": "rubygems"
          },
          {
            "name": "mysql2",
            "direct": true,
            "version": "0.5.7",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-imap",
            "direct": true,
            "version": "0.6.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "observer",
            "direct": true,
            "version": "0.1.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "ostruct",
            "direct": true,
            "version": "0.6.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "pg",
            "direct": true,
            "version": "1.5.9",
            "ecosystem": "rubygems"
          },
          {
            "name": "propshaft",
            "direct": true,
            "version": "1.3.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "puma",
            "direct": true,
            "version": "7.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "puma",
            "direct": true,
            "version": "8.0.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "rack",
            "direct": true,
            "version": "3.2.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "rack-session",
            "direct": true,
            "version": "2.1.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "rails",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rails",
            "direct": true,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": true,
            "version": "2.7.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "yard",
            "direct": true,
            "version": "0.9.43",
            "ecosystem": "rubygems"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@remirror/core-constants",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm-eabi",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-musleabihf",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-s390x-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openbsd-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openharmony-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-arm64-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-ia32-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/core",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-blockquote",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-bold",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-code-block",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-document",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-hard-break",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-heading",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-history",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-italic",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-link",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-list",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-paragraph",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-strike",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-superscript",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-text",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extension-underline",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/extensions",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tiptap/pm",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/markdown-it",
            "direct": false,
            "version": "14.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "crelt",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "linkifyjs",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-it",
            "direct": false,
            "version": "14.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.11",
            "ecosystem": "npm"
          },
          {
            "name": "orderedmap",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-changeset",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-collab",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-commands",
            "direct": false,
            "version": "1.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-dropcursor",
            "direct": false,
            "version": "1.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-gapcursor",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-history",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-inputrules",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-keymap",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-markdown",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-menu",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-model",
            "direct": false,
            "version": "1.25.3",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-schema-basic",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-schema-list",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-state",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-tables",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-trailing-node",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-transform",
            "direct": false,
            "version": "1.10.4",
            "ecosystem": "npm"
          },
          {
            "name": "prosemirror-view",
            "direct": false,
            "version": "1.41.2",
            "ecosystem": "npm"
          },
          {
            "name": "punycode.js",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "rope-sequence",
            "direct": false,
            "version": "1.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.16",
            "ecosystem": "npm"
          },
          {
            "name": "uc.micro",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "6.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "w3c-keyname",
            "direct": false,
            "version": "2.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "action_text-trix",
            "direct": false,
            "version": "2.1.17",
            "ecosystem": "rubygems"
          },
          {
            "name": "action_text-trix",
            "direct": false,
            "version": "2.1.18",
            "ecosystem": "rubygems"
          },
          {
            "name": "actioncable",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "actionmailbox",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "actionmailer",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "actionpack",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "actiontext",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "actionview",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "activejob",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "activemodel",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "activerecord",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "activestorage",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "activesupport",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "annotaterb",
            "direct": false,
            "version": "4.20.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "ast",
            "direct": false,
            "version": "2.4.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "base64",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "bcrypt",
            "direct": false,
            "version": "3.1.22",
            "ecosystem": "rubygems"
          },
          {
            "name": "bigdecimal",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "bigdecimal",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "bindex",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "builder",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "capybara",
            "direct": false,
            "version": "3.40.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "class_variants",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "class_variants",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "concurrent-ruby",
            "direct": false,
            "version": "1.3.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "connection_pool",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "crass",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "css_parser",
            "direct": false,
            "version": "1.21.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "css_parser",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "date",
            "direct": false,
            "version": "3.5.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "1.11.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "diff-lcs",
            "direct": false,
            "version": "1.6.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "docile",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "dotenv",
            "direct": false,
            "version": "3.1.8",
            "ecosystem": "rubygems"
          },
          {
            "name": "drb",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "erubi",
            "direct": false,
            "version": "1.13.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "factory_bot",
            "direct": false,
            "version": "6.2.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "factory_bot_rails",
            "direct": false,
            "version": "6.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "ffi",
            "direct": false,
            "version": "1.17.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "generator_spec",
            "direct": false,
            "version": "0.10.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "globalid",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "htmlbeautifier",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "htmlentities",
            "direct": false,
            "version": "4.3.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "i18n",
            "direct": false,
            "version": "1.14.8",
            "ecosystem": "rubygems"
          },
          {
            "name": "io-console",
            "direct": false,
            "version": "0.8.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "irb",
            "direct": false,
            "version": "1.17.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "language_server-protocol",
            "direct": false,
            "version": "3.17.0.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "lint_roller",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "logger",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "maglev-injectable",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "maglev-injectable",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "mail",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "marcel",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "matrix",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "mini_magick",
            "direct": false,
            "version": "4.13.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "mini_mime",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-pop",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-protocol",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "net-smtp",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "nio4r",
            "direct": false,
            "version": "2.7.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "nokogiri",
            "direct": false,
            "version": "1.19.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "nokogiri",
            "direct": false,
            "version": "1.19.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "pagy",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pagy",
            "direct": false,
            "version": "9.4.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "parallel",
            "direct": false,
            "version": "1.27.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "parser",
            "direct": false,
            "version": "3.3.10.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "pp",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "prettyprint",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "prism",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "prism",
            "direct": false,
            "version": "1.9.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "psych",
            "direct": false,
            "version": "5.3.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "public_suffix",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "public_suffix",
            "direct": false,
            "version": "7.0.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "racc",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rack-test",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "rackup",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rails-dom-testing",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "rails-html-sanitizer",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "railties",
            "direct": false,
            "version": "8.1.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "rainbow",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": "13.3.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rdoc",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "redcarpet",
            "direct": false,
            "version": "3.6.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "regexp_parser",
            "direct": false,
            "version": "2.11.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "reline",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "rouge",
            "direct": false,
            "version": "4.6.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rouge",
            "direct": false,
            "version": "4.7.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec-core",
            "direct": false,
            "version": "3.13.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec-expectations",
            "direct": false,
            "version": "3.13.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec-mocks",
            "direct": false,
            "version": "3.13.7",
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec-rails",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec-support",
            "direct": false,
            "version": "3.13.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop",
            "direct": false,
            "version": "1.81.7",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-ast",
            "direct": false,
            "version": "1.47.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-md",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-minitest",
            "direct": false,
            "version": "0.38.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-packaging",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-performance",
            "direct": false,
            "version": "1.26.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rails",
            "direct": false,
            "version": "2.33.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rails_config",
            "direct": false,
            "version": "1.17.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rspec",
            "direct": false,
            "version": "3.7.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "ruby-progressbar",
            "direct": false,
            "version": "1.13.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "ruby-vips",
            "direct": false,
            "version": "2.2.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "securerandom",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov",
            "direct": false,
            "version": "0.22.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov-html",
            "direct": false,
            "version": "0.13.2",
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov_json_formatter",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "stringio",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "thor",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "timeout",
            "direct": false,
            "version": "0.4.4",
            "ecosystem": "rubygems"
          },
          {
            "name": "timeout",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "tsort",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "turbo-rails",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "turbo-rails",
            "direct": false,
            "version": "2.0.20",
            "ecosystem": "rubygems"
          },
          {
            "name": "turbo-rails",
            "direct": false,
            "version": "2.0.23",
            "ecosystem": "rubygems"
          },
          {
            "name": "tzinfo",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "rubygems"
          },
          {
            "name": "unicode-display_width",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "unicode-emoji",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "uri",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "useragent",
            "direct": false,
            "version": "0.16.11",
            "ecosystem": "rubygems"
          },
          {
            "name": "view_component",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "view_component",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "web-console",
            "direct": false,
            "version": "4.2.1",
            "ecosystem": "rubygems"
          },
          {
            "name": "websocket-driver",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "websocket-extensions",
            "direct": false,
            "version": "0.1.5",
            "ecosystem": "rubygems"
          },
          {
            "name": "xpath",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "rubygems"
          },
          {
            "name": "zeitwerk",
            "direct": false,
            "version": "2.7.5",
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 270,
        "direct_count": 25,
        "indirect_count": 245
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 113,
        "open_issues": 20,
        "closed_ratio": 0.833,
        "closed_issues": 100,
        "closed_unmerged_prs": 18
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "did",
          "commits": 822,
          "avatar_url": "https://avatars.githubusercontent.com/u/8065?v=4"
        },
        {
          "type": "User",
          "login": "Papipo",
          "commits": 43,
          "avatar_url": "https://avatars.githubusercontent.com/u/22678?v=4"
        },
        {
          "type": "User",
          "login": "patdec",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/1129283?v=4"
        },
        {
          "type": "User",
          "login": "hasaniskandar",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/416213?v=4"
        },
        {
          "type": "User",
          "login": "mabras",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/9248917?v=4"
        },
        {
          "type": "User",
          "login": "dlupu",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/247936?v=4"
        },
        {
          "type": "User",
          "login": "mayeco",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/369490?v=4"
        },
        {
          "type": "User",
          "login": "drnic",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/108?v=4"
        },
        {
          "type": "User",
          "login": "heliocola",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1107956?v=4"
        },
        {
          "type": "User",
          "login": "gridar",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/7994594?v=4"
        }
      ],
      "contributors_sampled": 14,
      "top_contributor_share": 0.917
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "verify.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Gemfile.lock",
        "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": "11 out of 11 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 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 6 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 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": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "47 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "eff8c954e76765844376454e39a07b689ecd7e9c",
        "ran_at": "2026-08-02T15:38:51Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-08-02T15:12:05Z",
      "oldest_open_prs": [
        {
          "number": 189,
          "created_at": "2025-08-27T08:44:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 210,
          "created_at": "2025-12-30T00:13:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 250,
          "created_at": "2026-07-24T09:33:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-08-02T15:08:38Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 67,
          "created_at": "2023-11-03T17:33:35Z",
          "last_comment_at": "2023-11-05T22:42:06Z",
          "last_comment_author": "code-bunny"
        },
        {
          "number": 88,
          "created_at": "2024-10-18T10:14:47Z",
          "last_comment_at": "2025-01-09T13:33:58Z",
          "last_comment_author": "did"
        },
        {
          "number": 106,
          "created_at": "2024-12-29T18:22:40Z",
          "last_comment_at": "2025-01-10T17:10:02Z",
          "last_comment_author": "code-bunny"
        },
        {
          "number": 110,
          "created_at": "2025-01-04T00:34:55Z",
          "last_comment_at": "2025-04-24T23:13:57Z",
          "last_comment_author": "code-bunny"
        },
        {
          "number": 170,
          "created_at": "2025-07-07T09:38:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 171,
          "created_at": "2025-07-08T09:25:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 176,
          "created_at": "2025-07-11T08:06:19Z",
          "last_comment_at": "2025-07-11T17:03:08Z",
          "last_comment_author": "did"
        },
        {
          "number": 192,
          "created_at": "2025-10-28T17:30:59Z",
          "last_comment_at": "2025-11-02T23:24:13Z",
          "last_comment_author": "did"
        },
        {
          "number": 195,
          "created_at": "2025-11-08T13:55:09Z",
          "last_comment_at": "2025-11-12T02:57:07Z",
          "last_comment_author": "ishields"
        },
        {
          "number": 196,
          "created_at": "2025-11-09T21:10:17Z",
          "last_comment_at": "2025-11-11T23:51:24Z",
          "last_comment_author": "did"
        },
        {
          "number": 197,
          "created_at": "2025-11-12T12:05:47Z",
          "last_comment_at": "2025-11-13T22:01:30Z",
          "last_comment_author": "did"
        },
        {
          "number": 199,
          "created_at": "2025-11-20T12:42:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 200,
          "created_at": "2025-11-21T22:44:17Z",
          "last_comment_at": "2025-11-27T21:41:34Z",
          "last_comment_author": "did"
        },
        {
          "number": 202,
          "created_at": "2025-11-24T11:35:41Z",
          "last_comment_at": "2025-11-27T21:37:17Z",
          "last_comment_author": "did"
        },
        {
          "number": 203,
          "created_at": "2025-11-25T13:53:15Z",
          "last_comment_at": "2025-11-27T21:28:21Z",
          "last_comment_author": "did"
        },
        {
          "number": 205,
          "created_at": "2025-12-03T11:59:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 230,
          "created_at": "2026-04-27T13:37:24Z",
          "last_comment_at": "2026-05-04T20:40:55Z",
          "last_comment_author": "did"
        },
        {
          "number": 233,
          "created_at": "2026-05-21T13:45:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 238,
          "created_at": "2026-06-09T17:07:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 245,
          "created_at": "2026-07-02T15:53:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/maglevhq/maglev-core",
    "host": "github.com",
    "name": "maglev-core",
    "owner": "maglevhq"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 67 is calibrated to 78 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 67,
            "calibrated": 78,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 78,
      "inputs": {
        "security": 41,
        "vitality": 85,
        "community": 55,
        "governance": 63,
        "calibration": "2026-08-02",
        "engineering": 90,
        "ai_readiness": 44,
        "weighted_overall_raw": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 89,
            "inputs": {
              "commits_last_year": 252,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 36
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "36/52 weeks with commits",
                "points": 24.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 36
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "252 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 252
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "releases_count": 29,
              "latest_release_tag": "v3.0.3",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 78
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "29 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~78 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 78
                    }
                  }
                ],
                "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": "exceptional",
            "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": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 55,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "forks": 65,
              "stars": 380,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "380 stars",
                "points": 41.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 380
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "65 forks",
                "points": 15.1,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 65
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "packages": [
                "maglevcms"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 37646,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "37,646 downloads all-time across rubygems",
                "points": 47.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 37646,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 63,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 14,
              "top_contributor_share": 0.917
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 92% of commits",
                "points": 1.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "14 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 113,
              "open_issues": 20,
              "closed_issues": 100,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.833,
              "closed_unmerged_prs": 18,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "83% of issues closed",
                "points": 35,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 83
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "113/131 decided PRs merged",
                "points": 25.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 113,
                      "decided": 131
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "followers": 19,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "maglevhq",
              "public_repos": 13,
              "account_age_days": 2161
            },
            "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": "19 followers of maglevhq",
                "points": 9.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 19,
                      "login": "maglevhq"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "13 public repos, account ~5 yr old",
                "points": 20.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 13
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "maglevcms"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "34 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 34
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "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": "11 out of 11 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cms",
                "ruby",
                "ruby-on-rails",
                "content-management-system",
                "pagebuilder",
                "page-builder",
                "ror",
                "website-builder"
              ],
              "has_wiki": true,
              "homepage": "https://www.maglev.dev",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.maglev.dev",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": "weak",
        "name": "Security",
        "value": 41,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "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": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "11 out of 11 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 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 6 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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "47 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "moderate",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 263 resolved dependencies against OSV; 7 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"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 263
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 7
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "source": "osv",
              "advisories": 61,
              "affected_packages": 21,
              "assessed_packages": 263,
              "unassessed_packages": 7,
              "affected_by_severity": "critical 1, high 12, moderate 6, low 2",
              "direct_affected_packages": 7
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "7 affected: puma 7.1.0 (high 7.5), puma 8.0.0 (high 7.5), loofah 2.25.1 (moderate 4.7), +4 more",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 7,
                      "packages": "puma 7.1.0 (high 7.5), puma 8.0.0 (high 7.5), loofah 2.25.1 (moderate 4.7)"
                    }
                  },
                  {
                    "code": "advisories_affected_more",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "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": 263,
              "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": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 14
            },
            "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": "weak",
        "name": "AI Readiness",
        "value": 44,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.98,
              "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": "98 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "weak",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Gemfile.lock",
                "yarn.lock"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "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": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 25321,
              "source_files_sampled": 574,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/574 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 574,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application"
      ],
      "labels": [
        "library",
        "network-service"
      ],
      "scores": {
        "library": 6,
        "network-service": 4
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:rubygems",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "network-service",
          "source": "dep:rails",
          "weight": 4
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-02T15:39:05.187536Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/maglevhq/maglev-core.svg",
  "full_name": "maglevhq/maglev-core",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v2.5.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenRubyGems.