Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.5.0 · 2026-07-29 22:15 UTC

voglster / lumbergh

Self-hosted web dashboard for supervising multiple Claude Code AI sessions in tmux. Live terminals, real-time git diffs, file browser, todo lists, prompt templates, and mobile PWA support. Micromanage your AI interns from any device.

Python · TypeScriptMIT★ 32 Sterne⑂ 9 Forksseit Feb. 2026Auf GitHub ansehen ↗
ArtNetzwerkdienstWeboberflächeBibliothekwie das ermittelt wird

voglster/lumbergh erreicht einen Gesundheitsindex von 69 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Engineering Quality (88/100) ab, am schwächsten bei Security (33/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

69
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 62 wird auf der veröffentlichten Indexskala auf 69 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

James VogelPersönliches Konto
25 Follower68 öffentliche Reposseit Feb. 2011capSpire

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npmslidesverweist auf ein anderes Repo — nicht bewertet0.0.0571vor 4557 Tagenslideshowppt
PyPIpylumbergh0.20.1-226vor 0 Tagenagentaiclaude-codedashboarddevtoolssession-managersupervisorterminaltmux

Metriken nach Kategorie

Vitalität

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

83Exzellent · 21 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
15.2/36Commit-Rhythmus — 22/52 Wochen mit Commits
18/18Commit-Volumen — 424 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year424
human_commit_share1
days_since_last_push0
active_weeks_last_year22
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 77 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 3,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count77
latest_release_tagalpha
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases3,9

Community & Verbreitung

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

40Schwach · 17 % des Gesamtindex
Wie die Bewertung erfolgt
24.2/60Stars — 32 Stars
7.5/25Forks — 9 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks9
stars32
watchers0
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

Nachhaltigkeit & Governance

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

55Mittel · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
1.1/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 95 % der Commits
10.8/13.5Breite der Beitragenden — 8 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled8
top_contributor_share0,951
Wie die Bewertung erfolgt
42/42Issue-Lösungsquote — 100 % der Issues geschlossen
5.3/30PR-Annahme — 3/17 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_prs3
open_issues0
closed_issues8
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs14
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
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
10.2/25Reichweite des Inhabers — 25 Follower von voglster
25/25Kontohistorie — 68 öffentliche Repos, Kontoalter ca. 15 Jahre
Verwendete Eingangsdaten
followers25
owner_typeUser
is_verified
owner_loginvoglster
public_repos68
account_age_days5.642
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

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

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

88Exzellent · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

100Außergewöhnlich
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://voglster.github.io/lumbergh/
10/10Repository-Beschreibung
10/10Topics — 11 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsai-tools, claude-code, dashboard, developer-tools, fastapi, react, self-hosted, terminal, tmux, xterm-js, claude
has_wikija
homepagehttps://voglster.github.io/lumbergh/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

33Gefährdet · 16 % des Gesamtindex

Sicherheitslage

33Gefährdet
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
0/2.5CI-Tests — keine Daten
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
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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 — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 76 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests. Die verbleibenden Gewichte wurden renormalisiert.

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.

75Gut · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes6.117
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
11/11Statische Typprüfung — frontend/tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 5 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configsfrontend/tsconfig.json
agent_commit_share0,05
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Python mit Typprüfungs-Konfiguration (frontend/tsconfig.json)
54.4/55Handhabbare Dateigrößen — 3/291 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes69.602
source_files_sampled291
oversized_source_files3

Eckdaten

32GitHub-Sterne
8Mitwirkende
424Commits, letzte 12 Monate
0Tage seit letztem Push
77Releases
1Bus-Faktor
0offene Issues
npm, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • npm package 'slides' points at a different repository (https://github.com/hacksparrow/slides); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 9 ⇿
0Sterne
9Forks
68Releases

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.

0246810912026-032026-052026-07
Major 0Minor 17Patch 51
OpenSSF Scorecard 3.3 / 10
3.3Gesamtwert

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-07-29 22:15 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities76 existing vulnerabilities detected
Direkte Abhängigkeiten 29
RegistryPaketVersionsvorgabeManifest
PyPIfastapibackend/pyproject.toml
PyPIuvicornbackend/pyproject.toml
PyPIlibtmuxbackend/pyproject.toml
PyPItinydbbackend/pyproject.toml
PyPIgitpython>=3.1backend/pyproject.toml
PyPIhttpx>=0.27backend/pyproject.toml
PyPIcryptography>=42.0backend/pyproject.toml
PyPIpython-multipartbackend/pyproject.toml
PyPIpywinpty>=3.0.3backend/pyproject.toml
npm@git-diff-view/core^0.0.39frontend/package.json
npm@git-diff-view/react^0.0.39frontend/package.json
npm@tanstack/react-virtual^3.13.24frontend/package.json
npm@types/papaparse^5.5.2frontend/package.json
npm@uiw/react-markdown-preview^5.1.5frontend/package.json
npm@xterm/addon-fit^0.11.0frontend/package.json
npm@xterm/addon-unicode11^0.9.0frontend/package.json
npm@xterm/addon-web-links^0.12.0frontend/package.json
npm@xterm/xterm^6.0.0frontend/package.json
npmdayjs^1.11.19frontend/package.json
npmhighlight.js^11.11.1frontend/package.json
npmlucide-react^0.576.0frontend/package.json
npmmermaid^11.4.0frontend/package.json
npmpapaparse^5.5.3frontend/package.json
npmreact^19.2.0frontend/package.json
npmreact-dom^19.2.0frontend/package.json
npmreact-router-dom^7.13.0frontend/package.json
npm@iconify-json/carbon^1.2.19slides/package.json
npm@slidev/cli^52.14.1slides/package.json
npm@slidev/theme-default^0.25.0slides/package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "ai-tools",
        "claude-code",
        "dashboard",
        "developer-tools",
        "fastapi",
        "react",
        "self-hosted",
        "terminal",
        "tmux",
        "xterm-js",
        "claude"
      ],
      "is_fork": false,
      "size_kb": 27400,
      "has_wiki": true,
      "homepage": "https://voglster.github.io/lumbergh/",
      "languages": {
        "CSS": 6024,
        "HTML": 745,
        "Shell": 39170,
        "Python": 924446,
        "Gherkin": 6253,
        "JavaScript": 2476,
        "PowerShell": 217,
        "TypeScript": 667795
      },
      "pushed_at": "2026-07-29T22:02:12Z",
      "created_at": "2026-02-16T03:06:02Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T22:00:46Z",
      "description": "Self-hosted web dashboard for supervising multiple Claude Code AI sessions in tmux. Live terminals, real-time git diffs, file browser, todo lists, prompt templates, and mobile PWA support. Micromanage your AI interns from any device.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "vogelcc.com",
      "name": "James Vogel",
      "type": "User",
      "login": "voglster",
      "company": "capSpire",
      "location": "Dallas, TX",
      "followers": 25,
      "avatar_url": "https://avatars.githubusercontent.com/u/620205?v=4",
      "created_at": "2011-02-15T23:53:18Z",
      "is_verified": null,
      "public_repos": 68,
      "account_age_days": 5642
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "alpha",
          "kind": "other",
          "published_at": "2026-07-29T22:02:13Z"
        },
        {
          "tag": "v0.20.1",
          "kind": "patch",
          "published_at": "2026-07-29T22:01:42Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-07-28T05:21:22Z"
        },
        {
          "tag": "v0.19.2",
          "kind": "patch",
          "published_at": "2026-07-27T03:44:33Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-07-26T01:08:46Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-25T14:00:29Z"
        },
        {
          "tag": "v0.18.7",
          "kind": "patch",
          "published_at": "2026-07-23T20:27:17Z"
        },
        {
          "tag": "v0.18.6",
          "kind": "patch",
          "published_at": "2026-07-19T18:29:50Z"
        },
        {
          "tag": "v0.18.5",
          "kind": "patch",
          "published_at": "2026-07-06T23:22:02Z"
        },
        {
          "tag": "v0.18.4",
          "kind": "patch",
          "published_at": "2026-06-24T17:58:21Z"
        },
        {
          "tag": "v0.18.3",
          "kind": "patch",
          "published_at": "2026-06-05T17:47:22Z"
        },
        {
          "tag": "v0.18.2",
          "kind": "patch",
          "published_at": "2026-05-29T13:22:45Z"
        },
        {
          "tag": "v0.18.1",
          "kind": "patch",
          "published_at": "2026-05-20T04:38:12Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-05-20T04:34:01Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-05-16T20:38:20Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-05-10T22:16:30Z"
        },
        {
          "tag": "v0.15.7",
          "kind": "patch",
          "published_at": "2026-05-10T22:06:15Z"
        },
        {
          "tag": "v0.15.6",
          "kind": "patch",
          "published_at": "2026-05-10T14:15:14Z"
        },
        {
          "tag": "v0.15.5",
          "kind": "patch",
          "published_at": "2026-05-07T16:36:22Z"
        },
        {
          "tag": "v0.15.4",
          "kind": "patch",
          "published_at": "2026-04-30T03:28:45Z"
        },
        {
          "tag": "v0.15.3",
          "kind": "patch",
          "published_at": "2026-04-28T22:27:05Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-04-28T22:13:43Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-04-27T15:44:04Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-25T17:35:39Z"
        },
        {
          "tag": "v0.14.5",
          "kind": "patch",
          "published_at": "2026-04-25T06:13:20Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-04-25T06:06:10Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-04-23T14:38:56Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-04-17T18:23:40Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-04-09T12:11:01Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-04-03T22:25:44Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-04-03T00:43:56Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-04-03T00:37:22Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-04-02T23:24:39Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-04-01T05:37:29Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-03-31T02:28:14Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-03-30T22:05:27Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-03-29T20:40:44Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-03-28T21:13:17Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-03-28T20:45:19Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-03-28T18:43:04Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-03-28T16:41:30Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-03-27T15:21:28Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-03-27T05:15:50Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-03-26T19:42:24Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-03-26T14:43:22Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-03-25T17:51:56Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-03-25T16:35:25Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-03-25T16:17:24Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-03-25T03:04:07Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-03-25T01:28:55Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-03-25T00:34:40Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-03-24T20:56:12Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-03-24T02:37:47Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-03-22T20:02:18Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-03-22T15:44:15Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-03-22T15:21:16Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-03-22T14:53:46Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-03-22T04:00:02Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-03-18T15:25:01Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-03-17T22:47:26Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-03-17T12:48:53Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-03-17T04:09:03Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-03-17T03:52:09Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-03-17T03:08:55Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-14T20:09:56Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-13T19:34:51Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-03-13T07:00:06Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-03-13T03:33:07Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-03-12T05:17:00Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-03-12T04:44:18Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-12T00:03:24Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-03-11T13:22:19Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-03-11T12:57:35Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-03-11T05:20:38Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2026-03-11T02:34:13Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2026-03-11T01:16:39Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-03-11T01:11:45Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "f2d53da57a60db016f230859e06335a6edc541e9",
          "body": "…wlists\n\nThe syntax highlighters (highlight.js full bundle, @git-diff-view/lowlight\nbuilt with the full language set) already know ~190 languages and resolve\nextensions via their own alias tables. The hand-maintained EXT_TO_LANGUAGE /\ngetLangFromPath maps were an allowlist sitting in front of them, \n[…]\ney're unaffected.\n\n- backend get_file_language returns the bare extension hint\n- frontend getLangFromPath passes the extension through\n- FileBrowser label resolves the hint to a friendly name via hljs",
          "is_bot": false,
          "headline": "refactor(highlight): infer language from extension, drop curated allo…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T21:57:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc2de90b230c2b0f2448f3a813f8664232893917",
          "body": "Map .feature to the gherkin language in both highlighting paths:\n- backend EXT_TO_LANGUAGE (file viewer, via highlight.js full bundle)\n- frontend getLangFromPath (diff viewer, via @git-diff-view/lowlight)\n\nBoth highlighters already ship gherkin (hljs full bundle / lowlight 'all'),\nso this is just wiring the extension through.",
          "is_bot": false,
          "headline": "feat(highlight): Gherkin syntax highlighting for .feature files",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T21:51:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad410e121ddf390f4684cdf09cf19dcf420817d0",
          "body": "First real Bill run surfaced four issues in fleet supervision and spawn.\n\n- spawn_delivery: `lb spawn` typed the brief ~150ms after launch, but a fresh\n  worktree boots for seconds and opens on Claude Code's folder-trust dialog\n  (which --dangerously-skip-permissions does not bypass). The brief was \n[…]\n_pane_text (plain text) is used for detection, not capture_pane_content\n(ANSI + absolute cursor positioning, built for xterm re-rendering).\n\n461 backend tests green; Bill's spawn validated end-to-end.",
          "is_bot": false,
          "headline": "fix(bill): reliable spawn handoff, stop the delivered-task nag loop",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T16:19:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "acc99dbd9f44c1558edd6cfec653f1ac6592f554",
          "body": "A single scrollTop=scrollHeight ran before markdown/fonts/flex sizing\nfinished growing the feed, leaving it stranded mid-scroll ('centered on\nload'). Wrap the items in an observed content div and re-stick to the\nbottom on every ResizeObserver callback while following, so the view holds\nat the latest through initial settle and new events. 'Jump to latest' now\nscrolls immediately too.",
          "is_bot": false,
          "headline": "fix(activity): pin activity feed to latest through async layout",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T07:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c080f275a1f6be295e51214b87250e33592a2ef5",
          "body": "Give ActivityFeed a key={name} so switching sessions remounts it fresh\n(following=true -> scroll to bottom), matching how GitTab already keys per\nsession. Previously the follow/scroll state persisted across session\nswitches, leaving the activity view scrolled up on the new session.",
          "is_bot": false,
          "headline": "fix(activity): scroll to latest when the activity tab is shown",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T07:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11ea9c4fd93292cc783cd4c1e37beafd9eefb842",
          "body": "…nstruction bundle\n\nBill is a global orchestrator that dispatches worker sessions into isolated\nworktrees and supervises them. He is not new infrastructure: he is an ordinary\nLumbergh session whose working directory is a materialized instruction bundle,\ndriving peers through the `lb` CLI. He never w\n[…]\nr reaches worker-facing text\n- bill_nudge: wakes Bill if he idles while his workers are live\n- dashboard: Summon Bill\n\nSpec and plan under docs/superpowers/. 450 backend tests; E2E verified in the VM.",
          "is_bot": false,
          "headline": "feat(bill): first-mate orchestrator — fleet supervision, spawn, and i…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T07:10:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb6112f305c1058991ddc1ff391a60f5bb3ce8ed",
          "body": "Create/link/track/reconcile/reap git worktrees, exposed as backend REST\n(/api/worktrees), an `lb worktree` CLI, session-creation integration, and\na dashboard panel.\n\n- Core backend/lumbergh/worktrees.py: .lumbergh.toml [worktree] config\n  (authoritative link list, per-path symlink/copy, post_create \n[…]\nphan\n  badges and a guarded reap.\n- .lumbergh.toml: symlink frontend/node_modules; uv sync the editable\n  backend venv on worktree create.\n\nDesign spec and implementation plan under docs/superpowers/.",
          "is_bot": false,
          "headline": "feat(worktree): first-class worktree lifecycle + lb worktree CLI",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-29T02:45:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc3d1dded3f6630d79bcbb043ea0977cf0c589b4",
          "body": "The home view and `lb read` are consumed on every invocation, so their tokens\nrecur far more than SKILL.md's.\n\n- Home view: drop the bin/description/count header block (bin is in argv,\n  description is in the skill, and count was always \"N of N\" — redundant with\n  the `sessions[N]` TOON header). 429\n[…]\nr default per-event text truncation 500 -> 300 chars; still\n  conveys the gist, and `--full` remains for detail. (Not lower, so agents\n  rarely need a second `--full` round-trip that would cost more.)",
          "is_bot": false,
          "headline": "perf(lb): trim recurring runtime output",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T12:26:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dba1fc3069f72dbd27e9e5fa899f10a0018f6f5e",
          "body": "The skill loads into agent context on every trigger, so cut prose that\nrestated the frontmatter description, duplicated the command list, or narrated\nself-evident runtime output (the TOON format line, the server-not-running\nnote). Kept the anti-trigger guidance, the \"binary is the authority, run\n--help\" rule, each command's purpose, and the two non-obvious notes\n(wait-output snapshot-first, $LUMBERGH_SESSION default). ~25% smaller body;\ncommitted copy regenerated (drift guard passes).",
          "is_bot": false,
          "headline": "docs(lb): trim SKILL.md for token efficiency",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T12:21:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "651308b8b3badaf645efa1245b3d26494788d4b2",
          "body": "Adds the first v2 control-API wait primitive: `lb wait-output --session <name>\n--match \"<text>\" [--regex <re>] [--timeout <s>]` and the backing endpoint\nGET /api/agent/sessions/{name}/wait-output. Blocks until the pane content\ncontains a substring or matches a regex, so one agent can wait on a concr\n[…]\n the command (committed copy regenerated; drift\ncheck passes).\n\nVerified live against a running tmux session: on-screen text matches with\nwaited=0.0, absent text times out, regex matches real content.",
          "is_bot": false,
          "headline": "feat(agent): lb wait-output — block until a peer prints matching text",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T12:17:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ac4ee06c23d759671a414917be1700e22683ea8",
          "body": "Structural manifest detection recognizes approval/structured-question UIs\n(BLOCKED) but cannot see a free-text question — an agent (esp. Pi) asking\n\"which database?\" is quiescent and reads as plain IDLE. This adds an opt-in\ncheap-LLM check: when a session sits sustained-idle, ask the configured AI\np\n[…]\n Ollama gemma3 (the default model) and llama3.2:\nboth score 7/7 on a realistic idle-pane set after chrome stripping.\n\nDesign: docs/superpowers/specs/2026-07-28-needs-answer-question-detector-design.md",
          "is_bot": false,
          "headline": "feat(detect): cheap-LLM \"needs-answer\" question detector",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T12:08:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94aaf524e752b981b3ea4a49ba558ff59a78105c",
          "body": null,
          "is_bot": false,
          "headline": "docs: herdr-steal design specs and implementation plans",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T05:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "775b5a255f256fc1feabcc415cd4bbc0144af657",
          "body": "An AXI CLI 'lb' (list/read/state/wait/prompt) over a token-gated /api/agent\nsurface lets an agent supervise peer sessions. Reads transcripts via the\nactivity adapters incl. a new PiAdapter; ships a SKILL.md + ambient SessionStart\ncontext so agents auto-discover lb.",
          "is_bot": false,
          "headline": "feat(agent): lb control CLI, /api/agent, Pi transcript adapter, skill",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T05:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ae0b2d03132fd4fa3aa90f97045b28eba1e1f50",
          "body": "Sessions that enter idle/blocked/error while unviewed are flagged 'unseen'\n(cleared on viewer focus); surfaced as a dashboard count + 'while you were\naway' labels and optional local system notifications.",
          "is_bot": false,
          "headline": "feat(attention): done-vs-idle seen/unseen + local notifications",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T05:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03fc07697aab86525bdfc1b7c81ccc65c40e63c3",
          "body": "A self-contained, env-gated Claude SessionStart hook reports session_id +\ntranscript_path per session; idempotent installer bakes the interpreter into\n~/.claude/settings.json. Replaces the fragile newest-mtime transcript guess.",
          "is_bot": false,
          "headline": "feat(identity): SessionStart transcript-identity hook",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T05:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fbb522df067336d99207b1c1faf26dbcf6ecd6c",
          "body": "Data-driven TOML manifests (detect/) replace hardcoded regexes: region\nselectors, predicate algebra, priority-ordered rules with a BLOCKED override\nfor approval/question/login prompts. Vendored Claude/Pi rule content (herdr,\nApache-2.0). Adds pane-title capture for the osc_title signal.",
          "is_bot": false,
          "headline": "feat(detect): manifest-driven state detection with BLOCKED state",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-28T05:19:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48c330196446dedcafac8405f33347ef9231c086",
          "body": "Make the Activity feed usable on desktop and stop it rendering harness noise.\n\n- Add Activity as a desktop right-panel tab, gated by the tab-visibility\n  settings and shipped off by default; mobile keeps Activity always-on.\n- Restyle ActivityFeed/ActivityRespondBox with the app theme tokens so they\n\n[…]\nistory once real output follows.\n- Auto-reconnect the activity WebSocket with capped backoff so the feed\n  self-heals after a backend reload or transient drop instead of freezing\n  until a tab switch.",
          "is_bot": false,
          "headline": "feat(activity): desktop tab, cleaner rendering, and live-update fixes",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-27T03:43:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0449a06c2376a656a60a01d347368c01dc77fc5d",
          "body": "The /send endpoint baked a trailing newline into the tmux paste buffer for\ntext over 128 chars. paste-buffer -p wraps content in bracketed-paste codes,\nand agents like Claude Code treat a newline inside a bracketed paste as a\nliteral newline rather than a submit, so long replies from the Activity panel\nsat unsent in the input box. Paste the text without the newline and deliver\nEnter as a separate key press, matching the short-text path.",
          "is_bot": false,
          "headline": "fix(activity): submit long messages instead of inserting a newline",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-26T01:07:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "609e99d4ba45f241ed4a66429041ce64b6ebfa68",
          "body": "Restore native wheel scrolling for every pane that isn't a mouse-tracking\nTUI. v0.18.7 cancelled every wheel event on every pane and converted travel\ninto synthetic PageUp/PageDown, which severed the wheel -> xterm mouse report\n-> tmux copy-mode path for plain shells and injected page keys at the pr\n[…]\ncancellation, the pane-state monitor could die and leak the PTY,\nand a second client joining a pooled session never received pane state. Adds\nvitest and runs the frontend test suite in CI.\n\nFixes #24.",
          "is_bot": false,
          "headline": "fix(terminal): only take over the wheel for mouse-mode panes (#25)",
          "author_name": "Taylor Ondrey",
          "author_login": "maafk",
          "committed_at": "2026-07-25T13:57:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64c498148efca442c52ad070017a1339781a2a44",
          "body": "Add an \"Activity\" tab that renders a Claude Code session's conversation as a\nnative, mobile-first feed you can read, navigate, and reply to — instead of\nscraping the xterm.js terminal.\n\nBackend introduces an agent-agnostic seam: a normalized ConversationEvent\nmodel and an AgentAdapter interface, wit\n[…]\nwn, collapsible thinking, tool cards, auto-follow with\njump-to-latest, and a respond box that sends into the tmux session. Wired as a\nmobile-only tab in SessionDetail; the desktop layout is untouched.",
          "is_bot": false,
          "headline": "feat(activity): mobile activity pane with real-time transcript feed",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-25T13:45:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24597c9a99920868dc6a72fdafadda526ebd46d5",
          "body": null,
          "is_bot": false,
          "headline": "feat(providers): Add Pi agent and generalize agent references",
          "author_name": "swapg",
          "author_login": "srgcap",
          "committed_at": "2026-07-23T20:49:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71fcb40fa1e262065b46cbc3ce30b3e15e83154a",
          "body": "…sions\n\nA tmux window has a single size for every client, so a session open on both\na phone and a desktop can't render at both native sizes at once. Track each\nclient's viewport plus a focus/foreground activity sequence and size the\nshared PTY to the most-recently-active device; other clients reflow\n[…]\n reclaims the window.\n\nClients emit activate on connect/foreground/focus and deactivate on hide.\nFixes having to manually resize after opening a session on a phone while the\ndesktop tab is still open.",
          "is_bot": false,
          "headline": "feat(terminal): latest-active-device-wins sizing for multi-device ses…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-23T20:23:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c92cf826e88b7cbb050c9013e3bbeb0c1e57b46",
          "body": "Repaint via tmux refresh-client instead of a reconstructed capture-pane\nsnapshot, which could never reproduce the status bar or pane borders. On\npooled-PTY reuse, session switch/activate, and the manual Fit button, ask\ntmux to stream a full native redraw down the client tty; keep the snapshot\nonly as a fallback when no client is attached.",
          "is_bot": false,
          "headline": "fix(terminal): force native tmux redraw on switch/activate/fit",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-23T20:08:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f439f3ff5f47e8658fa82389878d52e4329ba0d5",
          "body": "…l reports\n\nSynthesizing xterm wheel reports scrolled the fullscreen TUI unreliably\n(coordinate-sensitive, and routed to input history over the prompt box).\nDrive Claude Code's own transcript scrollback with PageUp/PageDown key\nsequences instead, sent through the normal keystroke path.\n\n- Desktop wh\n[…]\nmit PageUp/PageDown, paced by\n  pixel-travel thresholds (WHEEL_PAGE_PX / TOUCH_PAGE_PX).\n- Wheel handler is non-passive + capture so it preventDefaults xterm's\n  own wheel handling (no double-scroll).",
          "is_bot": false,
          "headline": "fix(terminal): scroll Claude Code via PageUp/PageDown instead of whee…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-23T17:52:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12525df1a4c9dd338c9475bb7099ebeddcb5da2d",
          "body": "…n TUI\n\nClaude Code's fullscreen TUI renders on the alternate screen with a\nconstantly-redrawing spinner/status line. Every redraw that touches the\nselected rows makes xterm.js drop the selection, so a drag-select was\nwiped before it could be copied.\n\n- Freeze terminal output once a drag crosses the\n[…]\neezes output and a release outside the terminal still thaws.\n- Show a brief \"Copied\" confirmation.\n- Remove the focus click-shield so drag-select works in one motion\n  without a preceding focus-click.",
          "is_bot": false,
          "headline": "fix(terminal): restore desktop copy/paste under Claude Code fullscree…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-19T18:28:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "887d76fd3540da81889b52ce30a79afbe012d375",
          "body": "Touch-scroll dispatched wheel events at the finger's live position, so a\ndrag over Claude Code's input box scrolled its command/input history\ninstead of the conversation — leaving no way to scroll the transcript\nfrom mobile. Anchor every wheel report to a fixed cell near the top\n(~25% down) so scrolling always targets the transcript.",
          "is_bot": false,
          "headline": "fix(terminal): anchor touch-scroll wheel to transcript region",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-13T21:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cf51ae7700db078cd1b71949b8c110034b22e4c",
          "body": "Touch-drag scrolling replaces the manual tmux copy-mode flow, so the\nScroll/Exit toggle, the Page Up/Down overlay, and the 'Exit Scroll'\nsafety button are redundant. Removes them plus the now-dead prop\nplumbing; copy-mode detection (for desktop wheel on plain shells) stays.",
          "is_bot": false,
          "headline": "refactor(terminal): remove manual scroll-mode buttons",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-06T23:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d79958e523481ae0705d37161d04debe6446c7d0",
          "body": null,
          "is_bot": false,
          "headline": "chore(frontend): sync package-lock peer metadata",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-06T23:20:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc9ae67fc62fc9d12f16c3c2d1a084fab5004259",
          "body": "Claude Code now runs in the alternate screen with mouse tracking on and\nowns its scrollback, so tmux history stays empty and copy-mode has\nnothing to scroll — the Page Up/Down buttons appeared but did nothing.\n\nTranslate a one-finger vertical drag into wheel events dispatched through\nxterm's own enc\n[…]\n them as mouse-wheel reports so the app scrolls itself. Only\nengages on touch devices and preventDefault's once the gesture is a\nrecognized scroll, so taps-to-focus and the header menu stay reachable.",
          "is_bot": false,
          "headline": "fix(terminal): restore mobile scrolling via touch-drag",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-07-06T23:20:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7eec27c1b2132cfd8d10f519e62e950b8bed8d6",
          "body": "…nent",
          "is_bot": false,
          "headline": "refactor(frontend/components): Update styles in DirectoryPicker compo…",
          "author_name": "swapg",
          "author_login": "srgcap",
          "committed_at": "2026-06-24T17:20:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f83ac15e175c16b10cb75211f4ca0ff4b3c4af4",
          "body": "capture-pane returns only the pane content, but with status-position top\ntmux draws its status bar at screen row 1 and the pane at rows 2..N. The\nsnapshot anchored every pane line at row 1, shifting the whole capture up by\none: the status row got clobbered, the bottom row left blank, and tmux's\nlate\n[…]\ntry alongside the cursor in the existing display-message\ncall and offset both the positioned lines and the restored cursor by the\ntop status-bar height. No offset when the bar is at the bottom or off.",
          "is_bot": false,
          "headline": "fix(terminal): offset capture-pane snapshot for top status bar",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-06-05T17:18:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "981b7a0ac112137eb9e03dafd0f86a63cb50816a",
          "body": "- Add @xterm/addon-unicode11 and switch xterm to Unicode v11 width\n  tables so emoji and ambiguous-width glyphs render at the same width\n  tmux is accounting for.\n- Replace the 5px pixel-stability suppression in the resize observer\n  with a cols/rows-based dedupe inside handleFit. Small layout shift\n[…]\nend.\n- Add a debug HUD + per-session raw-byte capture, gated on\n  localStorage['terminal-debug']==='1'. Exposes window.__termRawDump()\n  for post-hoc inspection of the byte stream. Zero cost when off.",
          "is_bot": false,
          "headline": "feat(terminal): unicode11 width tables, debug HUD, fit dedupe",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-29T13:21:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e445d99680e8d3bfd7bc535470411dfa759dbc7",
          "body": "The connect guard only skipped existing sockets in OPEN state, not\nCONNECTING. In React 19 StrictMode dev double-effect (and on rapid\nsession switches), a second connect call would create ws2 while ws1\nwas still in flight, and cleanup left CONNECTING sockets alive on the\nassumption they'd self-close\n[…]\nre_pane_content snapshot — wasted work that\nalso produced log noise.\n\nSkip connect when an existing socket is CONNECTING, and on cleanup\nschedule close-on-open for CONNECTING sockets so they die fast.",
          "is_bot": false,
          "headline": "fix(terminal): dedupe WebSocket on StrictMode/CONNECTING race",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-29T13:21:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec47052cbaf263c261e24980c9bdc3a95b9088b0",
          "body": "The snapshot built by capture_pane_content cleared the screen and\nabsolute-positioned every line of pane content, but never repositioned\nthe cursor at the end. xterm's cursor would land wherever the last\npositioned write ended — typically the bottom-most non-empty row —\ninstead of at tmux's actual c\n[…]\ntside the prompt box' first-paint corruption on session\nswitch.\n\nQuery tmux for cursor_x/cursor_y/cursor_flag and append a CSI cursor-\nposition + DECSET/DECRST 25 to match tmux's current cursor state.",
          "is_bot": false,
          "headline": "fix(terminal): restore tmux cursor position in capture-pane snapshot",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-29T13:21:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e2970566a330576d64e439f4453da6161c1a3dc",
          "body": "…lHeader.tsx",
          "is_bot": false,
          "headline": "feat: Add whitespace around gap-2 for improved readability in Termina…",
          "author_name": "swapg",
          "author_login": "srgcap",
          "committed_at": "2026-05-23T16:59:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2359ba9702c04e57108b3731b5b8190579340fd3",
          "body": "…ERM in PTY child (#22)\n\n* fix(contrib/systemd): revert %h to /home/%i for system-instantiated units\n\nCommit c409793 swapped `/home/%i` for `%h` in WorkingDirectory, the PATH\nEnvironment line, and ExecStart. That breaks every install that follows\nthe README, because this unit is enabled under the **\n[…]\nng. Two regression tests cover the\ndefault and the override path.\n\nWindows (`_spawn_windows` via pywinpty) is intentionally untouched —\nthis bug is Unix-specific and the right TERM for conpty differs.",
          "is_bot": false,
          "headline": "fix(self-hosting): unbreak v0.17.0 — revert %h in systemd unit, set T…",
          "author_name": "Mason Egger",
          "author_login": "MasonEgger",
          "committed_at": "2026-05-20T04:36:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c483219c3efc52f978d3014ae885c00db4cc37f3",
          "body": "Refactors the frontend to introduce a comprehensive design system, enhancing visual consistency and maintainability.\n\n- Establishes new CSS variables for semantic colors (action, success, danger, warning, purple, amber), radii, and shadows.\n- Develops foundational UI components (e.g., Button, Input,\n[…]\nnel, Banner) for standardized usage.\n- Integrates modern glassmorphism effects for modals, headers, and panels.\n- Migrates existing components to utilize the new design tokens and reusable components.",
          "is_bot": false,
          "headline": "Implements new UI design system",
          "author_name": "cofmon",
          "author_login": null,
          "committed_at": "2026-05-20T04:31:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98a0f7b734a345a5a127355502226d272cb42d91",
          "body": "Records the last 20 app boots and service-worker controller changes to\nlocalStorage (lumbergh:bootlog, lumbergh:swlog) so we can distinguish OS\ncold-boot evictions from SW-driven reloads when debugging mobile PWA\nbehavior. Also logs to the console on each boot.",
          "is_bot": false,
          "headline": "chore(pwa): log boot type and SW controllerchange for mobile diagnostics",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-19T16:26:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44fd284a3aa9b44bf1791bf5aa39992257a6de6d",
          "body": "…ad button\n\niOS standalone PWAs aggressively suspend background tabs and can kill the\nWebSocket without firing onclose; the 2s reconnect timer is also paused\nwhile backgrounded, leaving the terminal stuck disconnected. Add\nvisibilitychange/pageshow/online listeners that probe the socket and\nreconnec\n[…]\ndate to prompt and show a small\n\"New version available\" toast so deploys no longer slam-reload the PWA\nmid-session. Add a Reload button to the terminal header's More row for\nmanual recovery on mobile.",
          "is_bot": false,
          "headline": "fix(pwa): reconnect WebSocket on resume, prompt for updates, add relo…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-17T14:28:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c40979310823acb3539b836d0451c858c4df1bec",
          "body": "- Remove commit-msg.md ignore (contributor's local tooling artifact)\n- Replace hardcoded /home/%i with systemd's %h specifier in\n  WorkingDirectory, PATH, and ExecStart so the unit works regardless\n  of where the user's home actually lives",
          "is_bot": false,
          "headline": "fix(contrib/systemd): drop personal gitignore entry, use %h for home",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-16T17:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64274d04126cb32e1f217ec9c31b832a01e69cd4",
          "body": "The docs cover installation but stop short of running lumbergh as a\nboot-time service, so every operator rolls their own systemd unit. Add\na contrib/ recipe (template unit + annotated env-file + README) that\ncovers the common case: tailscale-only bind, optional password, custom\ndata dir.\n\nThe unit i\n[…]\nt\n$HOME, and PrivateTmp is left off so the service shares /tmp/tmux-<uid>\nsockets with the user's interactive shells. The README documents these\nchoices so future tightening attempts know what breaks.",
          "is_bot": false,
          "headline": "feat(contrib): add systemd unit and env-file recipe for self-hosting",
          "author_name": "Mason Egger",
          "author_login": "MasonEgger",
          "committed_at": "2026-05-16T17:24:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbe437aaee4a55dd3eced6834d06e1842f5e4512",
          "body": null,
          "is_bot": false,
          "headline": "feat(api): Added new feature to README",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-16T17:18:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fc183c7bd3a44fc72dc9806c11d64e39dad750a",
          "body": "…g. Migrated all subprocess.run calls to UTF-8, refactored Windows kill path to use taskkill /F /T, and added unit tests.",
          "is_bot": false,
          "headline": "feat(backend): improve Windows support and migrate subprocess encodin…",
          "author_name": "JesseFlip",
          "author_login": "JesseFlip",
          "committed_at": "2026-05-10T22:14:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83f7719ecd9b8b171d03600c5292cedeca437e28",
          "body": "…rtualization\n\nOpens .csv/.tsv files as a sortable, filterable table by default with a\nRaw toggle to fall back to highlighted text. Uses PapaParse for parsing\nand @tanstack/react-virtual so large exports stay smooth. Click the row\nnumber to copy a row as TSV.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(file-browser): native CSV/TSV table viewer with sort, filter, vi…",
          "author_name": "Tate Hasenclever",
          "author_login": "Tate-Has",
          "committed_at": "2026-05-10T22:03:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0f01f86979df7d0b0e56c0ec9b82c522da124b8",
          "body": "The release-stable workflow previously crashed the release if the LLM\nendpoint was unreachable or returned an unexpected payload. Refactor\nthe inline script to a heredoc, hoist commit/stat data into env vars,\nand emit a commit-log RELEASE_NOTES.md as a fallback so a flaky LLM\nprovider can no longer block a tagged release.",
          "is_bot": false,
          "headline": "ci(release): fall back to commit-log notes when LLM call fails",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-10T14:13:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3118044b2e3447cf2615815abd36f14cd9493fb7",
          "body": "Closes #20. When switching sessions before a scratchpad fetch resolved,\nthe stale response would call setContent against the new session's\nuseLocalStorageDraft, poisoning its localStorage entry and persisting\nthe wrong repo's notes into the destination project's TinyDB on the\nnext keystroke. Adds a cancellation guard in the fetch effect cleanup\nand a Playwright scenario that reproduces the race via a delayed route\nand SPA navigation.",
          "is_bot": false,
          "headline": "fix(scratchpad): cancel stale fetch to prevent cross-session note leak",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-10T14:13:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8aae6e7f704cef5f2567141028120a2c9ad8a7d",
          "body": null,
          "is_bot": false,
          "headline": "feat(backend): Drop cached PTY when Tmux session is dead",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-05T21:27:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "034e5877fb81d1428f8dfe5815144e36b4b59e55",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): add terminal pop out",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-05-05T00:32:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f157c947bb7bd7edd76d7f0fb4b0f31882a938d0",
          "body": "- pass client viewport cols/rows in WebSocket query so the new PTY spawns\n  at the correct size instead of the 80x24 default\n- xterm constructor uses the cached size so the first capture-pane\n  snapshot lands in a correctly-sized buffer\n- capture-pane snapshot emits absolute cursor positioning per l\n[…]\nof xterm's prior cursor state\n- skip the snapshot entirely on a freshly attached PTY since\n  tmux attach-session already streams a full redraw\n- drop xterm scrollback (tmux owns history via copy-mode)",
          "is_bot": false,
          "headline": "fix(terminal): eliminate session-switch render offset",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-30T03:27:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8850bc3d8bc8b08f572d40bdcdc055857dccc15e",
          "body": "Clicking a paused session card now clears the paused flag in addition to\nnavigating to the session detail page. The session immediately shows up\nin the active-session bubbles and the user doesn't have to hit play\nseparately (which was also surfacing a confusing 'extra processes will\nbe killed' prompt when the agent was already running).",
          "is_bot": false,
          "headline": "fix(dashboard): auto-unpause when clicking a paused session card",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-28T22:25:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05840f71dd76357ce81b570a67bd1e521476a6bf",
          "body": "The pause endpoint returns 409 with a list of extras so the user can\nconfirm before killing whatever is running. Resume reused the same\nflow, but on resume the user has already chosen to restart — any\nlingering processes (e.g. claude that didn't exit on SIGTERM) are\nstale by definition. The prompt w\n[…]\ns just noise, and confusing because\nthe session is already 'paused' from the user's POV.\n\nNow resume always kills leftover children and relaunches without\nprompting. Pause's confirmation is unchanged.",
          "is_bot": false,
          "headline": "fix(sessions): drop confusing 'extra processes' prompt on resume",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-28T22:12:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d86e64476eb54e20f5d60cd196702e82c54f9bcd",
          "body": "Replace text=True with encoding=\"utf-8\", errors=\"replace\" in all\ntmux/ps/pkill subprocess calls. On Windows, text=True uses the system\nANSI codepage which corrupts non-ASCII output from tmux/psmux. Forcing\nutf-8 with replacement avoids UnicodeDecodeError and garbled panes.\n\nPicked up from PR #15.",
          "is_bot": false,
          "headline": "fix(backend): use explicit utf-8 encoding for tmux subprocess calls",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-27T15:42:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4d8e9d2d61c780ac3f8c6bc9533ff28cde2235e",
          "body": "Catch up the public docs after a long stretch of feature work. Adds\ncoverage for native Windows/psmux, scratch sessions, \"the one\" starring,\nsession summaries, the cloud tunnel, telemetry opt-in, and the event-loop\nlag watchdog. Fixes several drift items: nonexistent --tls-cert/--tls-key\nflags, cont\n[…]\nims, and an outdated lag-watchdog\ndescription.\n\nMarks docs/architecture.md and docs/features/the-one.md as historical and\npoints readers to the canonical docs-src copies. mkdocs --strict builds\nclean.",
          "is_bot": false,
          "headline": "docs: sync user docs with shipped features",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-25T17:34:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94aa66f5162c91d436567d4f7411b324a4e230e1",
          "body": null,
          "is_bot": false,
          "headline": "feat(backend/command-line-utilities): Add native windows support",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-25T17:10:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ee7e24857185f60dc5b5820174a2b25d80b9478",
          "body": "Variant of e2e-vm.sh that boots Rocky 10 GenericCloud-Base, installs\npylumbergh, and stays running for manual probing — used to reproduce\nissue #12 (tmux next-3.4 heap corruption in the Rocky 10 package).\n\nDiffers from e2e-vm.sh: uses -cpu host (Rocky 10 glibc requires\nx86-64-v3, qemu64 default panics on init), forwards SSH on 12222 for\npost-crash log retrieval, captures tmux -V upfront, and skips the\nautomated test phases since the goal is interactive diagnosis.",
          "is_bot": false,
          "headline": "test: add Rocky 10 QEMU repro harness",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-25T14:54:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85176001593d9e7db4d67ef9a8212f7c769a8ee5",
          "body": "The WebSocket input handler called sync self.write(), which calls os.write\nonce and ignores the return value. On non-blocking PTY fds, writes larger\nthan the kernel input buffer (~4KB) come back as short writes — the dropped\ntail often included xterm.js's bracketed-paste end marker (ESC[201~),\ncausi\n[…]\no treat the embedded newline as Enter and submit\nprematurely.\n\nSwitch to await self.write_async(), which already loops on partial writes\nand handles BlockingIOError via the asyncio writer.\n\nFixes #14.",
          "is_bot": false,
          "headline": "fix(tmux_pty): retry on short writes so large pastes don't get truncated",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-25T06:12:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9511415db8133c7ae6224e6173de75c65bc2e435",
          "body": "Creating a session at a path outside the configured repo search\ndirectory left the UI wedged: the picker returned no matches with no\nway forward, and a backend that had been running a while would 500\nwith \"Internal Server Error\" instead of a diagnostic. Root-causing it\nturned up three independent pr\n[…]\n RuntimeError→500 mapping via\nTestClient, and a Playwright scenario for typing an absolute path into\nthe picker. Added pytest-mock to dev deps since the global convention\nis mocker over unittest.mock.",
          "is_bot": false,
          "headline": "🐛 fix(sessions): surface session-create failures and plug fd leak",
          "author_name": "Bernát Gábor",
          "author_login": "gaborbernat",
          "committed_at": "2026-04-25T06:04:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4caa5e6e7b9cbdd568b278b8eb968b254b6c99c",
          "body": "When bootstrap.sh runs tmux send-keys immediately after creating a new\nwindow, fish hasn't finished sourcing its config yet, so /opt/homebrew/bin\nisn't on PATH and start.sh fails with \"npm: command not found\" even\nthough the tool is installed. The interactive shell the user then sees\nin that same wi\n[…]\nAlso extended check-node.sh to check for npm separately and\nto print the current PATH on failure, so the next time this goes wrong\nthe root cause is visible instead of hidden behind a generic message.",
          "is_bot": false,
          "headline": "🔧 build(bootstrap): harden start scripts against tmux PATH race",
          "author_name": "Bernát Gábor",
          "author_login": "gaborbernat",
          "committed_at": "2026-04-25T06:04:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88b00e91112cd409d16ae5f893171428a6ac58df",
          "body": "Pause/resume returns 409 with the list of unexpected child processes when\nthe pane has more than the agent running. Frontend shows a confirm dialog\nlisting them and retries with ?force=true on user OK.",
          "is_bot": false,
          "headline": "feat(sessions): warn before pause/resume kills extra pane processes",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-25T05:57:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d6f8e4cf65b10f4363706afba8c49dbda0070e1",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Remove stale peer dependency markers from package-lock.json",
          "author_name": "Tate Hasenclever",
          "author_login": "Tate-Has",
          "committed_at": "2026-04-25T05:53:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b3ab101aa1601c3b50c1e0067d97cff220c69451",
          "body": "Pause now actually kills the Claude Code process and its MCP servers via\nSIGTERM, freeing ~500-700MB per idle session. Resume restarts with\n`claude --continue` to restore conversation state. Both endpoints are\nidempotent — pause always kills stale processes, resume cleans up before\nstarting fresh an\n[…]\nhe metadata-only PATCH flag. Paused sessions sort into the inactive\nsection and show a play button regardless of tmux alive state.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sessions): Add session hibernation to kill/restart Claude processes",
          "author_name": "Tate Hasenclever",
          "author_login": "Tate-Has",
          "committed_at": "2026-04-25T05:53:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f996378f70317b1e7c6293c4b924a00adb299ff2",
          "body": "… leaks",
          "is_bot": false,
          "headline": "feat(db): Cache TinyDB instances by resolved path to prevent resource…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-21T15:24:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f78d5549001f7a1522e732cee2892246309e2470",
          "body": "…trol for AI coding agents",
          "is_bot": false,
          "headline": "feat(ui/auth): Externalize mental model for better visibility and con…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-19T14:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d13d5aab27a49693a861c3f4ab112ebef11cb6d1",
          "body": "…tionality for performance",
          "is_bot": false,
          "headline": "feat(backend): Improved diff generation and tmux session capture func…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-16T16:26:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2cf04bf7e3497751249f592debc0d18d0dde0a1",
          "body": null,
          "is_bot": false,
          "headline": "feat(api): Improve session data persistence and handling",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-13T20:38:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8881276283d4bf99fddabc7425abe03dd7b2baec",
          "body": null,
          "is_bot": false,
          "headline": "feat(idle_monitor): Pattern-based overrides for session state detection",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-13T18:47:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a8a984a2fdded242c402c9c2af5c3cce6348d10",
          "body": "…tching sessions",
          "is_bot": false,
          "headline": "fix(ui): Add Ctrl+[/] session cycling and fix tab visibility when swi…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-09T12:09:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ce5b1c9a147d25490959f985a1a239f5c2adf29",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): Add source view toggle and copy button to MarkdownViewer",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-09T12:09:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62d946d997b12a64825d46b16afda55d22ea5519",
          "body": null,
          "is_bot": false,
          "headline": "feat(api): Improved large text input handling for tmux sessions",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-04T04:52:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59a2b8690e199407689bf0979ce58b20c962668a",
          "body": null,
          "is_bot": false,
          "headline": "feat(lumbergh): scratch sessions management",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T22:24:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1013014e27d43126f9457b25b705d8c47e0077d8",
          "body": null,
          "is_bot": false,
          "headline": "feat(graph): Simplify GitGraph component and improve commit management",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T19:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba01a2cd55802c2aef44b575d8f25284dc6d541e",
          "body": "Star sessions to mark them as high priority. Starred sessions sort first\non the dashboard, pin to the left of navigation dots with a separator,\nand get checked first when cycling forward (if idle).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): Add starred sessions with priority cycling and navigation",
          "author_name": "Tate Hasenclever",
          "author_login": "Tate-Has",
          "committed_at": "2026-04-03T18:35:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ed8085513193ec044e28ab8f85c9b594665890d8",
          "body": "…mponent",
          "is_bot": false,
          "headline": "feat(frontend): Added delete branch confirmation modal to GitGraph co…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T18:31:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "314cef525c50c977d0428556598bde36306f8ce5",
          "body": null,
          "is_bot": false,
          "headline": "require at least specific version of node",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T17:57:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a3fea775a08afcfc698e8296276cb8552d168dc",
          "body": "Show full session name and status on hover with styled CSS tooltips\ninstead of native title attributes for instant display.",
          "is_bot": false,
          "headline": "feat(ui): Add tooltips to session navigator dots",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T00:42:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80800ed85fb06952a403a5c9f35bfefbf9748134",
          "body": null,
          "is_bot": false,
          "headline": "fix(diff): Fix image preview in diffs",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-03T00:35:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fb7941da7203c3f675c63aa1768c6e7705f942b",
          "body": null,
          "is_bot": false,
          "headline": "refactor(tool): Improve Node.js version check and update requirements",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-02T23:23:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6afd0e7b2ebf98b76e66cac13bee5d74e052cfce",
          "body": null,
          "is_bot": false,
          "headline": "refactor(backend): fix annoying autoshow history",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-04-01T05:36:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "044918dfda188837c890ded00cc3f23ec8efb1d0",
          "body": "… handle automated version bumping and workflow monitoring",
          "is_bot": false,
          "headline": "refactor(release): Update release workflow instructions and script to…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-31T02:30:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0349af8179900fccd3648d55428ec563d641e4b8",
          "body": null,
          "is_bot": false,
          "headline": "refactor(ui): reorganize dismiss functionality",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-31T01:01:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37eb78fcd9d40e9f631ce9e6dac25ddb98ddcdcd",
          "body": "…ntegration, and updated terminal header components",
          "is_bot": false,
          "headline": "feat(frontend): Added AI-generated session summaries, improved tmux i…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-30T17:46:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9422565a86956d13467bdb071da5f4f5394f6bc1",
          "body": "…pdate key features",
          "is_bot": false,
          "headline": "refactor(docs): Refactor roadmap to remove unnecessary sections and u…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-30T04:45:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4213a740d1c6e305d7750f736c8fd3e9e27ef7ea",
          "body": "…rn matching",
          "is_bot": false,
          "headline": "refactor(backend/lumbergh): Improve idle detection priority and patte…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-30T03:20:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2d8fee68909626616b394ec31b0c71b95faddb5",
          "body": "…se TerminalClient protocol",
          "is_bot": false,
          "headline": "feat(backend/ sessions): Update session management and tunneling to u…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-29T20:39:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc78f2b1644bc7981b271fcb3867eb72c7d9102e",
          "body": null,
          "is_bot": false,
          "headline": "feat(auth/api): Add Cloud Tunnel Proxy Bypass and API Endpoints",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-29T20:32:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8176db51b3c9355347a266b2cb4d72c98cd86223",
          "body": "…ing in Vite Config",
          "is_bot": false,
          "headline": "feat(frontend): Add support for maskable icons and update image handl…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T21:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c57bbc602e3fc061b144d46ec9d2eff047203f14",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): Update icons for responsive design",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T20:38:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba01245978925711bce6be4975000011cb779014",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): updated logo",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T20:23:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ce18051f9afaf874e9f300e990098d6d73dc2cc",
          "body": null,
          "is_bot": false,
          "headline": "fix(ai): Filter binary/asset files from AI commit message diffs",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T19:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1f05bb55ae257d799f267a2c6aae8bc858be735",
          "body": null,
          "is_bot": false,
          "headline": "feat(cloud): Send hostname in link-instance and telemetry events",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T19:35:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45c08a8f08e4d8bb11c76e352caa2cf4342d4f9f",
          "body": null,
          "is_bot": false,
          "headline": "feat(lumbergh): Update lumbergh cloud client to connect to lumbergh.dev",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T18:41:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61c36a72d95863c1292fdd010f13bb658be4816d",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): Add compact mode to SessionNavigatorDots",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-28T15:52:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c49173656d9014db93166797175c26ce87a771f",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): Added toggle for session dots in Session Detail page",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-27T15:18:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35b269ecf630df9e93d749da68182f09dc3f3dc9",
          "body": "…Modal",
          "is_bot": false,
          "headline": "refactor(ui): Extract GeneralSettings and AISettingsTab from Settings…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-27T15:18:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc7576b85e0f238824f282d6bf597a019585d2ee",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): Show session dots in terminal headers and modal",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-27T15:05:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4ad048a1c51df7230d0edc5441e548fdd53c913",
          "body": "Adds a row of status-colored dots between the session name and\naction buttons (desktop only) for at-a-glance session monitoring\nand direct navigation without returning to the dashboard.\n\n- Each dot shows the session's first initial and idle-state color\n- Active session indicated by size bump + color\n[…]\ng\n- 3-pulse animation when a session transitions out of working state\n- Extracted shared session status utilities from SessionCard\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): Add session navigator dots to terminal header",
          "author_name": "Tate Hasenclever",
          "author_login": "Tate-Has",
          "committed_at": "2026-03-27T14:54:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f85128ce4252af99d636fafe56cd37c5be61773a",
          "body": null,
          "is_bot": false,
          "headline": "fix(frontend): prevent double paste on Linux middle click",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-27T05:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2caf961c7542db19ac2a7d4f4e16b8a731ed71e4",
          "body": "… and Cloud sync features",
          "is_bot": false,
          "headline": "featauthor: AI improvements(Guides): Enhanced AI provider integration…",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-27T05:11:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dd5cb3e9f16f11af1f3c8a182fccd3ac3f0d8da",
          "body": null,
          "is_bot": false,
          "headline": "feature(docs): Implement optional password protection on Lumbergh",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-26T23:30:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfed0e0009e802c4ba023a279b849e990fdd32b4",
          "body": "…removing send to terminal button",
          "is_bot": false,
          "headline": "refactor(frontend/components): Clear selection on file content fetch …",
          "author_name": "Jim Vogel",
          "author_login": "voglster",
          "committed_at": "2026-03-26T19:40:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 77,
      "commits_last_year": 424,
      "latest_release_at": "2026-07-29T22:02:13Z",
      "latest_release_tag": "alpha",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 3.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "slides",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "slideshow",
            "ppt"
          ],
          "ecosystem": "npm",
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/slides",
          "is_deprecated": false,
          "latest_version": "0.0.0",
          "repository_url": "https://github.com/hacksparrow/slides",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 57,
          "first_published_at": "2014-02-05T13:23:55.278000Z",
          "latest_published_at": "2014-02-05T13:23:55.278000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4557
        },
        {
          "name": "pylumbergh",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "agent",
            "ai",
            "claude-code",
            "dashboard",
            "devtools",
            "session-manager",
            "supervisor",
            "terminal",
            "tmux",
            "Development Status :: 4 - Beta",
            "Environment :: Web Environment",
            "Framework :: FastAPI",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Operating System :: MacOS",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Topic :: Software Development :: Quality Assurance",
            "Topic :: System :: Monitoring",
            "Topic :: Terminals :: Terminal Emulators/X Terminals",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/pylumbergh/",
          "is_deprecated": false,
          "latest_version": "0.20.1",
          "repository_url": "https://github.com/voglster/lumbergh",
          "versions_count": 226,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-03-11T00:42:46.241863Z",
          "latest_published_at": "2026-07-29T22:01:57.035070Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 9,
      "stars": 32,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-07-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 9,
        "total_forks": 9
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "frontend/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 69602,
      "source_files_sampled": 291,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6117
    },
    "dependencies": {
      "manifests": [
        "backend/pyproject.toml",
        "frontend/package.json",
        "slides/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "fastapi",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "uvicorn",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "libtmux",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "tinydb",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "gitpython",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.1"
        },
        {
          "name": "httpx",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.27"
        },
        {
          "name": "cryptography",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=42.0"
        },
        {
          "name": "python-multipart",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pywinpty",
          "manifest": "backend/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.0.3"
        },
        {
          "name": "@git-diff-view/core",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.0.39"
        },
        {
          "name": "@git-diff-view/react",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.0.39"
        },
        {
          "name": "@tanstack/react-virtual",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.13.24"
        },
        {
          "name": "@types/papaparse",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.2"
        },
        {
          "name": "@uiw/react-markdown-preview",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.5"
        },
        {
          "name": "@xterm/addon-fit",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.11.0"
        },
        {
          "name": "@xterm/addon-unicode11",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.0"
        },
        {
          "name": "@xterm/addon-web-links",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.12.0"
        },
        {
          "name": "@xterm/xterm",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "dayjs",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.11.19"
        },
        {
          "name": "highlight.js",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.11.1"
        },
        {
          "name": "lucide-react",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.576.0"
        },
        {
          "name": "mermaid",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.4.0"
        },
        {
          "name": "papaparse",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.3"
        },
        {
          "name": "react",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "react-dom",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "frontend/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.13.0"
        },
        {
          "name": "@iconify-json/carbon",
          "manifest": "slides/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.2.19"
        },
        {
          "name": "@slidev/cli",
          "manifest": "slides/package.json",
          "ecosystem": "npm",
          "version_constraint": "^52.14.1"
        },
        {
          "name": "@slidev/theme-default",
          "manifest": "slides/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.25.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 3,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 8,
        "closed_unmerged_prs": 14
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "voglster",
          "commits": 406,
          "avatar_url": "https://avatars.githubusercontent.com/u/620205?v=4"
        },
        {
          "type": "User",
          "login": "srgcap",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/122290009?v=4"
        },
        {
          "type": "User",
          "login": "Tate-Has",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/95153495?v=4"
        },
        {
          "type": "User",
          "login": "gaborbernat",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/690238?v=4"
        },
        {
          "type": "User",
          "login": "MasonEgger",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/11214847?v=4"
        },
        {
          "type": "User",
          "login": "JesseFlip",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/51765840?v=4"
        },
        {
          "type": "User",
          "login": "randdane",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/14217774?v=4"
        },
        {
          "type": "User",
          "login": "maafk",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/2449193?v=4"
        }
      ],
      "contributors_sampled": 8,
      "top_contributor_share": 0.951
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "pages.yml",
        "release-alpha.yml",
        "release-stable.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": "76 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "f2d53da57a60db016f230859e06335a6edc541e9",
        "ran_at": "2026-07-29T22:15:08Z",
        "aggregate_score": 3.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T22:02:29Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-05-20T04:36:19Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/voglster/lumbergh",
    "host": "github.com",
    "name": "lumbergh",
    "owner": "voglster"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 62 is calibrated to 69 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 62,
            "calibrated": 69,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 69,
      "inputs": {
        "security": 33,
        "vitality": 83,
        "community": 40,
        "governance": 55,
        "calibration": "2026-08-02",
        "engineering": 88,
        "ai_readiness": 75,
        "weighted_overall_raw": 62
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 83,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "commits_last_year": 424,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "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": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "424 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 424
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 77,
              "latest_release_tag": "alpha",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 3.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "77 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 77
                    }
                  }
                ],
                "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 ~3.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "forks": 9,
              "stars": 32,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "32 stars",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "9 forks",
                "points": 7.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 8,
              "top_contributor_share": 0.951
            },
            "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 95% of commits",
                "points": 1.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "8 contributors",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "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": 54,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 0,
              "closed_issues": 8,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 14,
              "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": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "3/17 decided PRs merged",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 17
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "followers": 25,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "voglster",
              "public_repos": 68,
              "account_age_days": 5642
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "25 followers of voglster",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 25,
                      "login": "voglster"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "68 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 68
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "pylumbergh"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "226 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 226
                    }
                  }
                ],
                "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": 88,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "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": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai-tools",
                "claude-code",
                "dashboard",
                "developer-tools",
                "fastapi",
                "react",
                "self-hosted",
                "terminal",
                "tmux",
                "xterm-js",
                "claude"
              ],
              "has_wiki": true,
              "homepage": "https://voglster.github.io/lumbergh/",
              "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://voglster.github.io/lumbergh/",
                "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": "11 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Security",
        "value": 33,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 33,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "76 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 8
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 75,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6117
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "frontend/tsconfig.json"
              ],
              "agent_commit_share": 0.05,
              "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "frontend/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "frontend/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "5 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 5,
                      "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 69602,
              "source_files_sampled": 291,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (frontend/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "frontend/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/291 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 291,
                      "oversized": 3
                    }
                  }
                ],
                "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": [
        "network-service",
        "web-ui",
        "library"
      ],
      "scores": {
        "web-ui": 8,
        "library": 6,
        "network-service": 8
      },
      "primary": "network-service",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:pypi",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "network-service",
          "source": "dep:fastapi",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "description",
          "label": "network-service",
          "source": "description:network-service",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "network-service",
          "source": "tag:self-hosted",
          "weight": 2
        },
        {
          "tier": "description",
          "label": "web-ui",
          "source": "description:web-ui",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "web-ui",
          "source": "tag:dashboard",
          "weight": 2
        }
      ],
      "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",
    "npm package 'slides' points at a different repository (https://github.com/hacksparrow/slides); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T22:15:19.804925Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/voglster/lumbergh.svg",
  "full_name": "voglster/lumbergh",
  "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 Statistikennpm, PyPI.