Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-25 22:12 UTC

dotjarden / pixeltui

A fast, minimal, cross-platform terminal music player with a hybrid recommendation engine and Subsonic/Navidrome + local library support.

Go · SvelteMIT★ 1 Stern⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

dotjarden/pixeltui erreicht einen Gesundheitsindex von 39 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (65/100) ab, am schwächsten bei Community & Adoption (24/100). Zuletzt vor 9 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

39
gesamt / 100
Gefährdet

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

39
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende 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.

Eigentümerschaft

jardenPersönliches Konto
0 Follower1 öffentliches Reposeit Feb. 2026

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öffentlicht
Gogithub.com/dotjarden/pixeltuiv0.5.5-14vor 9 Tagen

Metriken nach Kategorie

Vitalität

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

65Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
28.8/36Push-Aktualität — letzter Push vor 9 Tagen
2.1/36Commit-Rhythmus — 3/52 Wochen mit Commits
16.9/18Commit-Volumen — 75 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year75
human_commit_share1
days_since_last_push9
active_weeks_last_year3
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 14 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 9 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count14
latest_release_tagv0.5.5
releases_from_tagsnein
days_since_latest_release9
mean_days_between_releases4,1

Community & Verbreitung

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

24Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 1 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars1
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
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

27Kritisch · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. 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
0/25Reichweite des Inhabers — 0 Follower von dotjarden
3.1/25Kontohistorie — 1 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers0
owner_typeUser
is_verified
owner_logindotjarden
public_repos1
account_age_days157
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 9 Tagen
20/20Versionshistorie — 14 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/dotjarden/pixeltui
ecosystemsgo
any_deprecatednein
min_days_since_publish9

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

48Gefährdet · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
0/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsnein
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 10 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsbubbletea, cli, go, music, music-player, navidrome, subsonic, terminal, tui, yt-dlp
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

25Kritisch · 16 % des Gesamtindex

Sicherheitslage

25Kritisch
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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
4.5/7.5Vulnerabilities — 4 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

55Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 74 von 75 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,987
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
0/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — clients/desktop/tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 12 der letzten 75 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsnein
lockfilesCargo.lock, go.sum, pnpm-lock.yaml
has_dockerfilenein
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
typecheck_configsclients/desktop/tsconfig.json
agent_commit_share0,16
toolchain_manifestsclients/desktop/src-tauri/Cargo.toml, go.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
54/55Handhabbare Dateigrößen — 2/112 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes136.790
source_files_sampled112
oversized_source_files2

Eckdaten

1GitHub-Sterne
1Mitwirkende
75Commits, letzte 12 Monate
9Tage seit letztem Push
14Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 2.5 / 10
2.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-25 22:12 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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
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
6Vulnerabilities4 existing vulnerabilities detected
Direkte Abhängigkeiten 13
RegistryPaketVersionsvorgabeManifest
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/huhv1.0.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/mattn/go-isattyv0.0.20go.mod
Gogithub.com/raitonoberu/ytmusicv0.0.0-20240324143733-0e5780514b1dgo.mod
Gogithub.com/sahilm/fuzzyv0.1.1go.mod
Gogithub.com/skip2/go-qrcodev0.0.0-20200617195104-da1b6568686ego.mod
Gogo.etcd.io/bboltv1.4.3go.mod
Gogolang.org/x/imagev0.42.0go.mod
Gogolang.org/x/syncv0.21.0go.mod
Goperiph.io/x/conn/v3v3.7.3go.mod
Goperiph.io/x/host/v3v3.8.5go.mod
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": [
        "bubbletea",
        "cli",
        "go",
        "music",
        "music-player",
        "navidrome",
        "subsonic",
        "terminal",
        "tui",
        "yt-dlp"
      ],
      "is_fork": false,
      "size_kb": 2585,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 731977,
        "CSS": 16701,
        "HTML": 331,
        "Rust": 29662,
        "Shell": 8805,
        "Svelte": 209619,
        "Makefile": 8241,
        "PowerShell": 4950,
        "TypeScript": 88454
      },
      "pushed_at": "2026-07-16T17:29:39Z",
      "created_at": "2026-06-07T05:01:10Z",
      "owner_type": "User",
      "updated_at": "2026-07-16T17:30:20Z",
      "description": "A fast, minimal, cross-platform terminal music player with a hybrid recommendation engine and Subsonic/Navidrome + local library support.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Svelte"
      ]
    },
    "owner": {
      "blog": null,
      "name": "jarden",
      "type": "User",
      "login": "dotjarden",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/262275347?v=4",
      "created_at": "2026-02-18T06:04:12Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 157
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-07-16T17:30:57Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-06-13T16:58:43Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-06-13T15:36:16Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-06-12T13:38:51Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-06-12T02:09:42Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-11T13:19:24Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-11T02:34:39Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-10T04:12:50Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-09T23:08:26Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-09T22:54:25Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-09T02:46:41Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-09T02:17:37Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-09T01:38:06Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-07T23:12:35Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cf0d839497496bc0f37e4c2a6500f1ea6b0c5780",
          "body": null,
          "is_bot": false,
          "headline": "release: prepare desktop 0.5.5",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-07-16T17:29:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a484c90222c929e5133a4261aeac09293eb42d5",
          "body": null,
          "is_bot": false,
          "headline": "feat: ship desktop client and unified server",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-07-16T17:23:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6af6de6964e83b5775c997d29ab41cdc7cac49fd",
          "body": "LRCLIB can be slow (seconds of TTFB); the sequential get->search doubled that on a miss (~16s). Run both lookups concurrently (the exact get wins on a hit and cancels the in-flight search) so the worst case is one timeout, and cache misses briefly server-side so a slow or absent song isn't re-fetched on every open.",
          "is_bot": false,
          "headline": "lyrics: concurrent LRCLIB lookup + short negative cache",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-13T16:56:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ffaf0ec7a4593815603ebc5b9cdba578fed6e0f",
          "body": "YouTube began returning bot/consent HTML for the stale ANDROID_VR 1.61.48 client (~9s hangs, then a slow yt-dlp fallback). Bump to the current 1.65.10 with matching UA/device context (hard cap <1.65.x — newer returns SABR-only streams with no usable URL), retry once with a fresh visitorData on any fast failure, and cut the per-call timeout 10s->4s (skipping the retry on a transport timeout) so a blocked client fails over fast instead of stalling playback.",
          "is_bot": false,
          "headline": "playback: update InnerTube client to 1.65.10, fail-fast resolution",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-13T16:56:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "053d704b4efe7bb002450af2c4f068cb413dc20d",
          "body": "Insert the preloaded next track into the running mpv instance over IPC so\nnatural track boundaries advance with no process respawn and no silence;\nthree-tier per-file title fallback for older mpv. README/GUIDE note gapless.",
          "is_bot": false,
          "headline": "playback: gapless via mpv playlist insertion",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-13T02:40:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9db2dd42055cf91838eac9edf8ea50cb6076c68",
          "body": "…SE hints\n\nFollow YTM continuation tokens to load complete discographies (sorted\nnewest-first, capped 200/section) so older releases surface; bundle Last.fm\nsimilar artists into /api/artist; the library file watcher now stamps\nhistory.jsonl separately and emits a scoped 'history' SSE hint so a client's\nown play report no longer triggers a full catalog refresh.",
          "is_bot": false,
          "headline": "server: full artist discography pagination, similar artists, scoped S…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-13T02:40:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26966b52c0b0d9a4c933fd7b8f62be45fc999124",
          "body": "Cloudflare/ngrok tunnels are now watched: if the child process dies the\nsupervisor restarts it with doubling backoff (1s-30s). A restart that comes\nback on a different URL (quick tunnels mint one per start) is re-advertised\nlive — fresh pairing QR, /api/sources serves the new endpoint first, and\nconnected clients get an SSE 'endpoints' event telling them to refresh\ntheir endpoint list. Paired phones keep working without re-pairing.",
          "is_bot": false,
          "headline": "server: supervised tunnels — auto-restart, live URL re-advertising",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-12T13:36:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0154935c19dc23738b4cbf012509f4fdbb30aec9",
          "body": "New tracked docs: ARCHITECTURE.md (components, source of truth, data flows,\nconcurrency, security model), API.md (full HTTP reference for every serve\nendpoint, from the handler code), GUIDE.md (extended user guide). README:\nyt-dlp now listed as optional, repo-layout package map, PixelPal companion\napp mention, fixed stale station keybinding and missing filter/theme entries.\nDrop the gitignore entry for the removed legacy Flutter dir.",
          "is_bot": false,
          "headline": "docs: architecture map, server API reference, user guide; README refresh",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-12T02:07:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f28cf51a1c0a77aa1bf70e99eca5de5fd61a2ee",
          "body": "Extract the server's InnerTube resolver into a shared tui/innertube package\nand make the TUI player use it first: cache -> innertube.Resolve (~0.2s,\nsingle HTTP call) -> yt-dlp fallback. Playback no longer requires yt-dlp\n(measured: 0.1-0.2s native vs 2.5s pip yt-dlp vs 20s standalone); it remains\nfor downloads and as the resolution fallback, and doctor now reports it as\noptional instead of failing.",
          "is_bot": false,
          "headline": "playback: resolve streams natively via InnerTube; yt-dlp now optional",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-12T02:07:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d47b097353fb033977f091ef43b8d6ca13904c1",
          "body": "…love\n\n- streaming: full-file (no-Range) requests for YouTube tracks are now\n  relayed as sequential 2 MiB upstream range chunks in one continuous\n  200 response — the CDN throttles un-ranged transfers to ~32 KB/s while\n  ranged chunks run at full speed; measured 0.3s for a 4 MB track that\n  previou\n[…]\n chart otherwise (1h cache)\n- pixeltui devices [revoke <id>]: list/revoke paired devices from the CLI\n- liking a track also submits Last.fm track.love (TUI and server), when\n  scrobbling is configured",
          "is_bot": false,
          "headline": "server: chunked download relay, genre stations; devices CLI, Last.fm …",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T13:08:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c79faa09db148ed41e8efaf90dfa60358ec82751",
          "body": "- /api/mixes: up to 4 engine-built mixes — top played/liked artists from\n  the last 90 days grouped by dominant Last.fm tag, each mix a 4-seed\n  RecommendMulti blend (affinity, discovery level, per-artist caps),\n  cached 24h\n- /api/recommend accepts repeated seed=Artist|Track params (max 4) so\n  cli\n[…]\nine blend\n- watchLibrary: poll the library files' mtimes and broadcast the SSE\n  library event when the TUI (or anything else) writes them — clients\n  live-sync on TUI edits, not just on client writes",
          "is_bot": false,
          "headline": "server: daily mixes, library file watcher, multi-seed recommendations",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T02:17:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b25dafc786f675429cd88c64e77da5c8b22d46e",
          "body": null,
          "is_bot": false,
          "headline": "serve: show public and LAN addresses separately in the startup banner",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:42:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e9e33ab86712646732fd4f9adca30670f948cc2",
          "body": "Quick tunnels mint a new URL on every start, stranding paired clients on\na stale address. /api/sources now returns every address the server\nanswers on (tunnel + LAN); the iOS app saves the list, walks it with its\nexisting token when the stored address stops responding, and offers\nSettings → Change Address for the cases fallback can't predict (tokens\naren't URL-bound, so pairing carries over).",
          "is_bot": false,
          "headline": "server: advertise endpoints so clients survive address changes",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb0151864a6eb0487a744c759093b4264e50f0de",
          "body": "normalize.go fired a YouTube Music search per track on the first read of\nLiked and every playlist after each server start, starving interactive\nrequests (charts, artist pages, stream resolution) behind dozens of\nupstream lookups. The one-time art/MV cleanup it performed has already\nbeen written back into the library files; new entries keep whatever id\nand art they arrive with (the M3U8 round-trip), same as the TUI.",
          "is_bot": false,
          "headline": "server: drop library normalization — it slowed every first read",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:26:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d495165312de544eea04362831adde27623dd89",
          "body": "The TUI never resolves artwork — covers travel with the track from the\nYouTube Music source and the library M3U8s round-trip them. Apply the\nsame idea to the one store that didn't: history.jsonl listens now carry\nthe cover URL (additional_info.art — free-form per the ListenBrainz\nspec), written by b\n[…]\n.go,\nlastfm.TrackAlbumArt, fill hooks). Library normalization still backfills\nofficial art into old M3U8 entries; pre-existing history lines fall back\nto the derivable thumbnail and age out naturally.",
          "is_bot": false,
          "headline": "art the TUI way: store it with the listen, drop the resolver service",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:14:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a8307526f0dcc3baaa28d497b31f83e504866be",
          "body": "- artresolve.go: background resolver — YouTube Music song result first\n  (square official cover), Last.fm track.getInfo album art as the\n  configured-API fallback; cached in memory, capped, misses remembered\n- liked/playlists/search responses and history/stats swap missing or\n  i.ytimg.com video-thu\n[…]\nalization now writes back art/album/duration-only upgrades too,\n  so likes and playlists keep official art permanently in the M3U8s\n- lastfm: TrackAlbumArt (track.getInfo album image, largest variant)",
          "is_bot": false,
          "headline": "server: resolve official album art (ytm + Last.fm) for art-less tracks",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:10:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b34318ac872f82c0f87573598df34cb37e40d96",
          "body": "…zation\n\n- toDTO: YouTube tracks with no stored art get the derivable ytimg\n  thumbnail — library M3U8 entries without art= rendered as client\n  fallback gradients everywhere (liked, playlists, search top results)\n- album pages: fall back to the first track's art when the header art is\n  missing\n- p\n[…]\nbum-song counterparts in the background (charts remap, exported as\n  ytm.RemapToSongs) and rewrite the M3U8 — MV cuts and 16:9 thumbs\n  converge to album audio and square covers; clients learn via SSE",
          "is_bot": false,
          "headline": "server: derivable art for library tracks, MV-to-song playlist normali…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T01:01:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86178a36950574b4a1250a91f889f224ad1d92bb",
          "body": "- /api/played, /api/nowplaying, /api/history, /api/stats: client plays\n  land in the shared history.jsonl and scrobble (Last.fm/ListenBrainz)\n  exactly like TUI plays; exclude= on /api/radio and /api/recommend for\n  mute-artist\n- serve --tunnel cloudflare|ngrok|tailscale: auto-publish with the publi\n[…]\ne build version\n- lyrics: only cache hits — a transient LRCLIB failure no longer blanks\n  a track's lyrics for the whole 24h TTL\n- update: optional tag arg (pixeltui update v0.2.4) to pin or roll back",
          "is_bot": false,
          "headline": "server: client parity, tunnels, versioned update",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-11T00:04:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5543fe0ab078ebd12ac33a899f582233165e69b2",
          "body": "Step-by-step tunnel setup (install, same tailnet, --url with the\nMagicDNS name), a warning against raw port-forwarding, and updated\nserve bullets: hashed tokens, native m4a streaming (no transcode),\nshared read/write library. Drop the stale Flutter client reference.",
          "is_bot": false,
          "headline": "README: Tailscale walkthrough for remote access; refresh serve section",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-10T04:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1438e85f4502e983b0b00e8c7e1b9edd574d32ec",
          "body": "…ions\n\n- GET /api/radio?id=yt:<vid>: YouTube Music's watch-playlist radio for a\n  track (seed dropped from results, 10m cache) — backs client stations\n  and autoplay queue fill.\n- GET /api/recommend: pixeltui's own engine over the same layered data\n  source the TUI uses (graph → bbolt cache → live L\n[…]\navior); results resolved to playable\n  YouTube songs concurrently. 30m cache; 503 when no Last.fm key.\n- cmdServe builds the Recommender alongside the existing cache/lastfm\n  wiring; Config gains Rec.",
          "is_bot": false,
          "headline": "server: discovery endpoints — stations (radio) and engine recommendat…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-10T04:08:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7df003563f9d9d4480c4d9b0b8fe9f71b71ea161",
          "body": "…hared library\n\nNew write endpoints (all device-token authed) operating on the same\n~/.pixeltui/library M3U8 files the TUI uses, so the TUI and every\npaired client share one library:\n- POST /api/like                 like/unlike with full track metadata\n- POST /api/playlist/create|rename|delete\n- POS\n[…]\ntent (last write wins\nper playlist file).\n\nlibrary: the #PIXELTUI M3U8 comment now round-trips the album field\n(was silently dropped), so tracks keep album metadata across\nclient→library→client trips.",
          "is_bot": false,
          "headline": "server: two-way library sync — clients write likes/playlists to the s…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-10T03:51:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "685309a0d1ad36f3213c3213031f997881c07197",
          "body": "The only no-auth chart YouTube exposes is the \"Top Music Videos\"\nplaylist, so chart rows carried music-video ids — MV audio cuts and\n16:9 video thumbnails — while search returned proper album songs.\nCharts() now resolves each entry to its song counterpart (concurrent,\n8-way; artist-overlap guard against covers), falling back to the\noriginal id when no confident match exists. ~1s extra per chart fetch,\namortized by the server's 30m chart cache.",
          "is_bot": false,
          "headline": "ytm: remap chart entries to album songs (not music videos)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-10T03:33:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc5a9f189f75c77900bee45571fd878fd535a458",
          "body": "…dened pairing\n\nStreaming speed (cold start ~5s → <1s on device):\n- innertube.go: resolve pre-signed AAC/m4a CDN URLs via the ANDROID_VR\n  InnerTube client (~0.2s, no yt-dlp) with a visitorData token to clear\n  bot checks (refreshed on LOGIN_REQUIRED). Pins itag 140; never 139\n  (HE-AAC misreports 2\n[…]\n tokens stored SHA-256 hashed (legacy plaintext auto-migrated),\n  single-use pairing codes with per-attempt delay + rotation after 5\n  failures, device list/revoke endpoints, CORS for browser clients.",
          "is_bot": false,
          "headline": "server: native InnerTube resolution, companion-app API expansion, har…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-10T03:28:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50dcdf9764cc1bb44eaafcfe7d8696a3fd56ba02",
          "body": "- ytm: unify chart row parsing on the shared rich parser — chart tracks now\n  carry video id, duration, and art (instant playback, no search at play\n  time); drop the dead AlbumTracks wrapper\n- tui: remove unused cFaint/stHelpKey style vars; stations snapshot the\n  queue before clearing so `u` can r\n[…]\ntup-go@v6 (Node 20 deprecation)\n\ndeadcode clean; staticcheck clean except two intentionally-capitalized\n\"Last.fm\" form messages; all tests pass.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: cleanup + consolidation pass",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T22:58:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7efede0ffa6b510d1a8a870777fc8b114000706c",
          "body": "Scrobbling (Last.fm + ListenBrainz):\n- new scrobble/ package: signed Last.fm write API (desktop auth flow),\n  ListenBrainz submit-listens, async orchestrator with an offline spool\n  (~/.pixeltui/library/scrobble-spool.jsonl, retried on launch)\n- submits at the standard 50% / 4-minute mark + now-play\n[…]\n updated; tests for signing, spool,\nscrobble timing, YTM parsers, multi-seed merge, and an overlay render smoke\ntest. All tests pass with -race.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: scrobbling, artist/album pages, QoL batch, recommender upgrades",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T22:52:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c47be82cab94488214cd29434f71d664ee3686bb",
          "body": "Onboarding\n- first launch with no config (real terminal, no seed args) offers guided\n  setup, then continues into the player\n\nsetup (huh)\n- refactored into reusable runSetup (shared with onboarding)\n- country chart picker (select), discovery level + autoplay now in the form\n- validation: Last.fm key\n[…]\nharts\n- up/down move, left/right change, ,/esc saves to config.json (merged) and\n  applies live (theme, recommender weights, charts)\n- carry Explore through tui.Config; ? page documents the , shortcut",
          "is_bot": false,
          "headline": "tui: first-run onboarding, polished setup, in-app settings overlay",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T02:43:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b824ca6625ffaf812bd1fbc47fb06e027aaa03c8",
          "body": "- e enqueues every track in the active Discover list (playlist, album,\n  artist, charts, search, For You); skips section/album-chooser rows,\n  dedupes against now-playing + existing queue, warms the head if empty\n- help page (?) + footer hints updated",
          "is_bot": false,
          "headline": "tui: add \"e\" to queue the whole current list",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T02:12:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "095d55221f357be66e0493408fcbcb4df737190c",
          "body": "A multibyte glyph immediately after $ver (\"$ver…\") could be partially\nabsorbed into the variable name under some locales' isalnum, tripping set -u.\nUse plain ASCII and braced ${ver}.",
          "is_bot": false,
          "headline": "scripts/release.sh: ASCII-only output (fix locale-dependent unbound-var)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T01:35:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd50b24e8ca7ecb83fa207aad22e7331d72faedd",
          "body": "- .github/workflows/release.yml: push a v* tag → cross-build all platforms,\n  write SHA256SUMS, publish the GitHub release (gh --generate-notes);\n  -suffix tags publish as pre-releases\n- scripts/release.sh: validates + tags + pushes to trigger the workflow\n- embed build version via -ldflags -X main.version; add `pixeltui version`\n  (Makefile derives it from git describe; releases pass VERSION=<tag>)\n- README: Releasing (maintainers) section",
          "is_bot": false,
          "headline": "ci: autobuild releases on tag push + embedded version",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T01:28:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef581499866e2e5360c45e68e4883cd2c078b53a",
          "body": "Search bangs (YouTube)\n- !a / !artist <q>  -> top artist's songs (direct)\n- !al / !album <q>  -> album chooser; Enter drills into the album's tracks,\n  esc backs out to the chooser (one-level back stack)\n- reuses the InnerTube browse()/parser; new ytm/search.go\n- hint in the search placeholder\n\nMore\n[…]\nrowse,\n  responsive 1-3 columns, with a notes block (browse contents, search model, bangs)\n- fix: delete is del/backspace (not d); corrected in the help page and the\n  browse header (d stays download)",
          "is_bot": false,
          "headline": "tui: typed \"bang\" search, album column, redesigned help page",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T00:58:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bde90eb991d81a4c417b9e67d13f1e0c11d95313",
          "body": "Discover list\n- replace bubbles/list (paged a full screen at a time) with a custom\n  smooth-scrolling tracklist: line-by-line scroll, no pagination/filter\n  overhead, pure-string render; section headers skipped in nav\n\nSearch (\"/\")\n- arrows scroll results while the input stays open\n- active-state mo\n[…]\n playing\n- budget the title to the real info width so long titles truncate on one\n  line instead of wrapping\n\nListening stats\n- new Browse entry: total plays/tracks/artists/time + top artists & tracks",
          "is_bot": false,
          "headline": "tui: smooth-scroll list, search selection model, stats, chart polish",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-09T00:24:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81d81952fcd13528cc9a6c7a4f6fbaacfa1d5fd3",
          "body": "…ering\n\nFor You landing\n- sectioned discover: Your Music / Recommended for You / Top Charts (10 each)\n- engine recommendations blended in async (best-effort, never blocks launch)\n\nCharts (live, no API key)\n- YouTube Music current charts via FEmusic_charts -> Trending playlist\n- per-country (name or \n[…]\n width; new cell() pads columns to exact width;\n  sanitize strips control/format runes (also cleaned at the chart source)\n\nHousekeeping\n- untrack stray legacy app/ Xcode files (kept local, gitignored)",
          "is_bot": false,
          "headline": "tui: current charts + sectioned For You; fix wide/zero-width row rend…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-08T01:34:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f361eff86df9a8f31e36afcc89fc8d5ad5833d56",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore .release-backup (local-only)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T23:11:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbfd63f7792d2fae4267b2d0101ef7f9e1e1874a",
          "body": "- `/` (find): live fuzzy-filters the current view across the board (YouTube /\n  Subsonic results, Liked, playlists, Local, Subsonic starred). On a catalog\n  source Enter fetches; Tab cycles source (and escapes a fixed list into a\n  search). On a fixed list it filters only.\n- `'` (filter): same live \n[…]\nfind a playlist fast); kept in\n  sync with async Subsonic playlists and deletes.\nShared sahilm/fuzzy engine; a staticList flag decides Enter behavior. Help text\nupdated. build/vet/test/deadcode clean.",
          "is_bot": false,
          "headline": "tui: unify / and ' into one fuzzy engine; add fuzzy filter in browse",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T23:08:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "759262649027b288893f10acc11c3b22904c101d",
          "body": "…al tab\n\n`/` on the Local source now matches the offline index fuzzily (subsequence,\ntypo-tolerant, ranked by score) instead of plain substring, and filters live on\nevery keystroke — no Enter needed. Opening `/` on Local (or Tab-ing to it) shows\nthe whole local library, then narrows as you type. YouTube/Subsonic stay\nEnter-to-search (their services match server-side).",
          "is_bot": false,
          "headline": "tui: fuzzy local search — live as-you-type fuzzy filtering on the Loc…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T21:23:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e5dab05013007adda227f205f49662f30116e48",
          "body": null,
          "is_bot": false,
          "headline": "chore: untrack docs/superpowers/uninstall-command-design.md (local-only)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T20:46:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c3c912ccb2c545298653a873f17c9a333ad8e0c",
          "body": "Remove the design spec / implementation plan from git and ignore\ndocs/superpowers/; they stay on disk locally.",
          "is_bot": false,
          "headline": "chore: stop tracking docs/superpowers (local-only working docs)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T20:45:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fda8f8529493bdb8299eea387d274b2e4b5db4ec",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pixeltui uninstall command (full clean, --keep-data, -y)",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T20:19:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "66861e9625a4354d0e771af810426030cdb66156",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document pixeltui uninstall command",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T20:12:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f704c4cc8502434436f6cfa57f1642352485e044",
          "body": "Removes the data dir + bundled tools + binary; on Windows strips the installer\nPATH entry and self-deletes via .old rename. Leaves system-package mpv alone.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: pixeltui uninstall command (full clean, --keep-data, -y)",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T20:11:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "21c9fd77c290860e869259dfcb026e50c8171848",
          "body": "- doctor --fix installs self-contained yt-dlp (no Python) + mpv (no forced sudo on Linux)\n- ~/.pixeltui/bin resolution, mpv runnability check\n- install scripts: gated single doctor --fix pass, --nodoctor opt-out, launch-ready\n- docs updated; unit tests for the pure helpers\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Robust cross-platform doctor + improved install flow",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:46:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb4dc9640989d495c011bf98b451baba4dbe493e",
          "body": "… tip\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "polish(doctor): label bundled yt-dlp accurately, drop stale pip-speed…",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:45:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9be2ba5faca2491c6f7af8ea5416626933802ed4",
          "body": "…unch-ready; docs\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(install): gated single doctor --fix pass, --nodoctor opt-out, la…",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:34:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b916bad3bb7a3b9b8c475abb2c8a8111b6a8922f",
          "body": "…sudo linux mpv, ~/.pixeltui/bin resolution, mpv runnability check\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(doctor): robust cross-platform deps — self-contained yt-dlp, no-…",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:33:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88d8cd91edf1f1fe5e1894b08714ce14a836f6e3",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deps): platform helpers + atomic downloadBinary",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:31:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2409b42fe31c6b78f552433fc192f6193331328",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: implementation plan for robust doctor + install flow",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:26:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1f9e819fb6a1f6b779b7dc9b81385cbb51b093a7",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: design spec for robust cross-platform doctor + install flow",
          "author_name": "magician_jordan",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T19:21:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4d7b2c0d44c8efe4a4ac52022b0ea062f75c299",
          "body": "…t padding\n\nmacOS routes lock-screen buttons through mpv's input layer (caught by the\nkeybind bridge), but Windows SMTC calls mpv's playlist-next/prev directly and\ndisables them on a 1-item playlist — so the on-screen skip buttons were dead.\n\nPad each mpv instance with tiny finite silent neighbours \n[…]\n-skips, and the gen guard dedupes any overlap.\n\nVerified headlessly (TestSkipPlaylistPadding): padding yields a 3-item playlist\nwith current at index 1, and playlist-next (SMTC's Next) makes mpv exit.",
          "is_bot": false,
          "headline": "tui: make on-screen OS transport (Windows SMTC) skip work via playlis…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T17:32:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bdc43f5c207f630e8d6a5939ed25e6ae7cf3c41",
          "body": "…y-pause)\n\nPreviously only seek + play/pause worked from the OS Now Playing widget; the\nskip buttons hit mpv's 1-item playlist and did nothing, and the IPC layer was\nrequest/response only (no event listener).\n\nAdd a persistent media reader (mpvevents.go) that binds mpv's transport keys\n(NEXT/PREV/PL\n[…]\n.\n\nVerified headlessly (TestMediaReaderDeliversCommands): mpv broadcasts the\ntransport script-messages as client-messages and the reader classifies\nnext/prev/play-pause. Build/vet/test/deadcode clean.",
          "is_bot": false,
          "headline": "tui: drive the queue from OS / hardware media controls (next/prev/pla…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T17:20:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c8bf02d16813bd96599ef328eeeab4766562e797",
          "body": "The Flutter companion isn't ready; remove it from git and ignore /clients/ so it\nstays on-disk locally. The tui/ Go app is unaffected and builds standalone.",
          "is_bot": false,
          "headline": "chore: stop tracking clients/flutter (local-only, in development)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T17:06:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57dcdac643666a55db74f4d87a3ec198ed4589c5",
          "body": "Separate the two projects so the Flutter client can be removed independently and\nthe terminal player keeps working on its own:\n\n- Move all Go code (main.go + packages) under tui/; go.mod stays at the repo\n  root so it's still one module (`go build ./...` works). Import paths gain the\n  /tui segment \n[…]\n` binary to `pixeltui`.\n- README documents the new layout; .gitignore + flutter README paths updated.\n\nVerified: go build/vet/test/deadcode clean, binary runs, cross-compiles for\ndarwin/linux/windows.",
          "is_bot": false,
          "headline": "refactor: reorganize into tui/ (Go app) + clients/flutter/ (companion)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T17:01:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1e7fe8597712678ec010b36049550440ca635a4",
          "body": "Collapse the two glass pills into a single full-width Liquid-Glass capsule sized\nvia its child (the native glass button hugs content, so it was tiny). Tap opens\nthe full player where transport lives; the trailing icon shows play state.",
          "is_bot": false,
          "headline": "app: mini-player is one full-width glass capsule (not two pills)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T16:49:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfff5deb2bc4463dbc0a79912864941ae6315c62",
          "body": "Replace the BackdropFilter \"frosted\" mini-player with native Liquid Glass via\nadaptive_platform_ui AdaptiveButton.child(style: AdaptiveButtonStyle.glass) —\nreal UIGlassEffect rendered by UIKit. Grouped as two glass pills (wide capsule\n→ opens full player, + play/pause) since a native glass surface can't host a\nnested Flutter tap target. Removed dart:ui blur.",
          "is_bot": false,
          "headline": "app: mini-player uses native iOS 26 Liquid Glass (not a Flutter blur)",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T16:43:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f04f1bd11831856296644af789a42de1e18f5bb",
          "body": "… top spacing\n\n- Mini-player is now a floating Liquid-Glass capsule (BackdropFilter frost +\n  hairline border + shadow, art/title/play-pause/skip) overlaid ABOVE the native\n  tab bar instead of at the body bottom — fixes it rendering under the nav and\n  matches the iOS 26 Apple Music bottom-accessor\n[…]\noSearchTextField + sliding segmented control with\n  AdaptiveTextField + AdaptiveSegmentedControl; live debounced results.\n- Home: align top spacing with Search (no more oversized gap from the header).",
          "is_bot": false,
          "headline": "app: iOS 26-style floating glass mini-player, modern search, fix home…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T16:23:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5489a6b0ed3c34b2edb8e42d424b5d6992a012d2",
          "body": "…rtino chrome\n\n- main.dart: AdaptiveApp (was CupertinoApp).\n- RootShell: one AdaptiveScaffold with native liquid-glass AdaptiveAppBar +\n  AdaptiveBottomNavigationBar (useNativeToolbar/useNativeBottomBar). Removed the\n  hand-rolled _GlassHeader/_GlassTabBar BackdropFilter chrome.\n- extendBodyBehindAp\n[…]\nthe player; native tab bar is hidden (tabBarHidden) while the\n  full-screen player is up to avoid platform-view bleed.\n- Per-tab in-app nav stack retained so header/tab bar/mini persist on every page.",
          "is_bot": false,
          "headline": "app: go fully adaptive (native iOS 26 liquid glass), drop custom Cupe…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T16:13:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "708da26b53050ad2d64acbc153b058e4c6ffdb34",
          "body": "…behind-nav)\n\nThe native adaptive platform views (useNativeToolbar/useNativeBottomBar) render\nON TOP of the Flutter body, so lists rendered behind the header and the\nmini-player sat behind the tab bar. Replace them with custom Flutter chrome we\nfully control:\n- CupertinoApp root (dropped AdaptiveApp\n[…]\n (top/bottom padding threaded into every tab + TrackListBody)\n  so it scrolls UNDER the translucent bars instead of behind them.\n- Keeps the in-app per-tab navigation stack (nav + mini on every page).",
          "is_bot": false,
          "headline": "app: custom Flutter glass chrome (fixes content-behind-header / mini-…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T16:06:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "61f2be10186dab6e50686591b4d210296b0afd12",
          "body": "- One AdaptiveScaffold owns the liquid-glass header, native iOS 26 tab bar, and\n  a per-tab in-app navigation stack — so opening a playlist/source no longer\n  pushes a full-screen route; the tab bar + mini-player now stay on every page\n  (Apple-Music behavior). Re-tapping the active tab pops to its \n[…]\np the tab body in SafeArea; detail screens are\n  content-only (TrackListBody) so the scaffold provides the inset/header.\n- Mini-player restyled as a floating capsule (shadow) docked above the tab bar.",
          "is_bot": false,
          "headline": "app: persistent tab bar + mini-player on all pages, fix content insets",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T15:57:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ceb0a266905aa3db455cf95a1fbb82148f83cbe",
          "body": "… UI, player polish\n\nServer:\n- Add CORS (Allow-Origin/Methods/Headers + OPTIONS preflight) so Flutter web /\n  browser / PWA clients can reach the API (native iOS unaffected). Fixes the\n  \"times out connecting\" seen when running on Chrome/web.\n\nApp:\n- API client: 12s timeouts + clear \"server unreacha\n[…]\neb perf win) and the duplicate in-content\n  page titles.\n- Now Playing redesigned: MediaQuery-sized artwork with shadow, clean vertical\n  rhythm, scrubber with remaining-time, evenly-spaced transport.",
          "is_bot": false,
          "headline": "fix(server+app): CORS for web clients, request timeouts, liquid-glass…",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T15:46:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f24cabfe66946d83828a993176850e7c859f8498",
          "body": "Full UI overhaul into a real music-app frame:\n- Bottom tab bar (Home / Search / Library) with a blurred translucent bar and a\n  persistent mini-player docked above it.\n- Premium full-screen Now Playing: blurred album-art backdrop + gradient,\n  large artwork, scrubber, transport — opens as a slide-up\n[…]\nnt header and Play / Shuffle.\n- Dark theme throughout; cached cover art (cached_network_image) for speed.\nAll data comes from `pixeltui serve`. Built with Cupertino widgets under the\nAdaptiveApp root.",
          "is_bot": false,
          "headline": "app: Apple-Music / Spotify-style redesign",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T15:31:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c036f407f0a910ca292a67e33276a72dffe6dd75",
          "body": "- Rewrite the UI with adaptive_platform_ui (AdaptiveApp/Scaffold/AppBar with the\n  iOS 26 native toolbar, AdaptiveSegmentedControl source picker, AdaptiveListTile,\n  AdaptiveTextField, AdaptiveSlider) + Cupertino transport controls.\n- Faster: cached_network_image for cover art (shared trackArt widge\n[…]\nwhite-screen the app.\n- Remove the stray desktop/web platform folders (keep ios/android); gitignore\n  generated platform dirs. README: troubleshooting (CocoaPods SSL, wireless\n  device, white-screen).",
          "is_bot": false,
          "headline": "app: native iOS adaptive UI + cached art; clean up platform folders",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T15:22:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39cfb4f67a607b4f747d6e7f1abadb6b3ada2ceb",
          "body": "Server: `/api/stream?id=yt:<videoid>` now transcodes on the fly (yt-dlp →\nffmpeg → AAC) so phones can play YouTube tracks (opus/webm aren't iOS-native).\nBound to the request context so a disconnect kills the pipeline. Verified live\n(valid ADTS/AAC).\n\nApp: scaffold the Flutter companion under app/ — \n[…]\nplayback with\nlock-screen controls via just_audio + just_audio_background. Mirrors the server\nAPI. Build it with the Flutter SDK (see app/README.md); platform projects and\nbuild output are gitignored.",
          "is_bot": false,
          "headline": "feat(server+app): YouTube streaming + Flutter companion app",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T14:30:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d7717d6d83389ca9f404ab72cd51376fe5c1b862",
          "body": "New `server` package + `pixeltui serve` command: browse/search your sources and\nstream your library over HTTP, for a phone client \"from anywhere\" via a BYO\ntunnel. Foundation (Phase 1):\n\n- Pairing: prints a QR + session code; devices exchange it for a saved bearer\n  token (devices.json, revocable). \n[…]\nuTube transcoding\n  is a later phase. Track payloads use opaque stream ids (no cred leak).\n- BYO tunnel (Tailscale suggested); --addr/--url flags.\n\nAdds one dep (skip2/go-qrcode). README documents it.",
          "is_bot": false,
          "headline": "feat(server): `pixeltui serve` — HTTP backend for the companion app",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T14:19:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d191202496e2328175636fdb87e6ed3ded4e7d12",
          "body": "- Transport controls (space, seek, next, volume) now work while the lyrics\n  overlay is open; synced lyrics auto-follow, plain lyrics still scroll.\n- Synced highlight no longer lags: a 200ms ticker re-renders the overlay and\n  the position is interpolated between the 500ms polls, so the active line\n  tracks the audio smoothly.\n- Faster load: lyrics are prefetched in the background when a track starts and\n  cached per track, so pressing `y` is usually instant.",
          "is_bot": false,
          "headline": "fix(lyrics): controls + smooth sync + faster load",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T13:21:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e24022cf76d5894f0b5e40d64d67aa68aadd440",
          "body": "Add a stdlib LRCLIB client (lyrics package) — free, no auth. Lyrics now prefer\nLRCLIB (synced + plain), falling back to YouTube Music. Synced lyrics render\nkaraoke-style: the active line is highlighted and auto-scrolls with playback.\nBecause LRCLIB matches on artist/track, lyrics now work for Subsonic and local\ntracks too (no YouTube id needed). Help + README updated.",
          "is_bot": false,
          "headline": "feat(lyrics): synced lyrics via LRCLIB",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T13:11:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b30c66497e8d68e77fafd79a7dcb722fa1ef6751",
          "body": "`/` no longer silently changes meaning per page. The prompt now shows the\nsource it will search (⌕ YouTube ▸ / Subsonic / Local), defaulting to the\npage you're on, and Tab cycles between the configured sources. `'` still\nalways filters the visible list. Help and --help updated.",
          "is_bot": false,
          "headline": "ux: make `/` search source visible + switchable",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T10:35:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7875b39bf652f77e3f113847c43dcd87434c7520",
          "body": "Local no longer full-rescans (with per-file ffprobe) every time you open it.\nA metadata index is persisted at ~/.pixeltui/local-index.json; opening Local\nshows it instantly and refreshes in the background. Re-scans reuse cached\nmetadata for files whose mtime is unchanged, so they skip ffprobe and stay\nfast even for large libraries. `/` filter on local also uses the cache.",
          "is_bot": false,
          "headline": "perf(local): instant library via cached, mtime-incremental index",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T07:08:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2820715292e2868b3909edac42a5052fb53f07b9",
          "body": "Package managers proved unreliable on Windows (winget source may lack\nmpv.mpv; choco needs admin and currently has a broken python dep). Primary\npath is now a self-contained download: fetch the latest standalone mpv build\n(shinchiro x86_64 .7z) and extract it to ~/.pixeltui/mpv with the built-in\n`ta\n[…]\nive, which reads .7z) — no admin, no package\nmanager. The mpv resolver already checks that path. Package managers remain a\nfallback, then manual guidance. Verified extraction + flat layout via bsdtar.",
          "is_bot": false,
          "headline": "fix(windows): self-contained mpv install in doctor --fix",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T06:54:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e830ddc96fd1e828b0e9b98ffb4b4385520bc0f0",
          "body": "- Rename module to github.com/dotjarden/pixeltui so `go install\n  github.com/dotjarden/pixeltui@latest` actually works (module path now\n  matches the import path); fix the source-build fallback in both installers\n- doctor --fix: also try the `py` launcher when resolving Python on Windows\n  (python3/\n[…]\nWindows named pipe); notify, playback fallback (mpv → ffplay → afplay), and\ninstall hints all branch per-OS; doctor's mpv/yt-dlp install paths cover\nmacOS/Linux/Windows; paths use filepath throughout.",
          "is_bot": false,
          "headline": "fix: cross-platform correctness pass",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T06:49:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e258a997e6f64288c55c46a8360e5ad14fab50c8",
          "body": "`doctor --fix` previously reported \"auto-install unsupported\" on Windows.\nIt now installs mpv through a native package manager (winget, then scoop,\nthen choco), and the mpv resolver also checks the winget Links shim and\n~/.pixeltui/mpv so a freshly installed mpv is found.",
          "is_bot": false,
          "headline": "fix(windows): auto-install mpv via winget/scoop/choco in doctor --fix",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T06:42:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "57f3d9d344c6d1b15f44b185f02ddfac003666c1",
          "body": "- Station: replace the unreliable Shift+Enter with o (from selection) and\n  O (from now-playing), matching the lowercase/Shift target pattern; updated\n  the ? page and --help\n- update: new `pixeltui update` command downloads the latest release build for\n  this OS/arch, verifies its checksum, and swaps the binary in place (same\n  release URL as the installer); documented in README and usage",
          "is_bot": false,
          "headline": "feat: station on o/O, add `pixeltui update` self-updater",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:57:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "599ea9ed3870fba81deee3dd34d67a8f11c8dd16",
          "body": "- Themes: 6 accent presets (default/ocean/matrix/amber/rose/mono) via\n  `theme` config / PIXELTUI_THEME; themed seek-bar gradient\n- Filter: ' narrows the current Discover list in place (live fuzzy)\n- Tables: doctor and the ? help page rendered with lipgloss/table\n- Setup: `pixeltui setup` is now an interactive huh form (incl. theme select)\n- Demo: demo.tape + `make demo` → docs/demo.gif, embedded in the README",
          "is_bot": false,
          "headline": "ui: themes, in-list filter, table layouts, form-based setup, demo",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:44:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff34fc7e01f3a8d866c651249e638c935e34da0e",
          "body": "Rewrite install.sh / install.ps1 to detect OS+CPU, download the matching\nprebuilt binary from the latest release, verify its checksum, clear the macOS\nquarantine flag, put it on PATH, and run `doctor --fix` for yt-dlp/mpv. Falls\nback to a Go source build only if no release can be downloaded. README updated\nwith the one-line install.",
          "is_bot": false,
          "headline": "install: download prebuilt binary by default",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:21:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8cfa21b8c3b2ced468a2e58c4ea92568f2ec1e7",
          "body": "- LICENSE: MIT\n- THIRD_PARTY_NOTICES.md: attribution for bundled Go libraries (MIT/BSD-3-Clause)\n  and the external tools invoked at runtime (yt-dlp, mpv, ffmpeg)\n- README: License section",
          "is_bot": false,
          "headline": "docs: add MIT license and third-party notices",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:08:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc6cc0e8e26822900eade0e85a95cd27ac755f57",
          "body": "Project overview, install, controls, commands, configuration, sources,\ndownloads, library/interop, data layout, and build instructions.",
          "is_bot": false,
          "headline": "docs: add README",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:03:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3298925b8d98195d51c5bf8a6b1915c1f351b88e",
          "body": "A fast, minimal, cross-platform terminal music player.\n\n- Hybrid recommendation engine (static artist graph + Last.fm + on-disk cache)\n- YouTube Music search/radio/lyrics; optional Subsonic/Navidrome and local sources\n- mpv playback with pause/seek/volume + OS Now Playing; ffplay/afplay fallback\n- L\n[…]\n (M3U8 + XSPF export), ListenBrainz-style history, resume\n- Downloads to a tagged Artist/Album/Title layout for Subsonic/Navidrome\n- setup / doctor (with self-resolving deps) / reset / export commands",
          "is_bot": false,
          "headline": "Initial commit: pixeltui",
          "author_name": "magicianjarden",
          "author_login": "magicianjarden",
          "committed_at": "2026-06-07T05:00:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 14,
      "commits_last_year": 75,
      "latest_release_at": "2026-07-16T17:30:57Z",
      "latest_release_tag": "v0.5.5",
      "releases_from_tags": false,
      "days_since_last_push": 9,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 4.1
    },
    "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": "github.com/dotjarden/pixeltui",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dotjarden/pixeltui",
          "is_deprecated": false,
          "latest_version": "v0.5.5",
          "repository_url": "https://github.com/dotjarden/pixeltui",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-16T17:29:36Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "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": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "clients/desktop/tsconfig.json"
      ],
      "toolchain_manifests": [
        "clients/desktop/src-tauri/Cargo.toml",
        "go.mod"
      ],
      "largest_source_bytes": 136790,
      "source_files_sampled": 112,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/huh",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/mattn/go-isatty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.20"
        },
        {
          "name": "github.com/raitonoberu/ytmusic",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20240324143733-0e5780514b1d"
        },
        {
          "name": "github.com/sahilm/fuzzy",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.1.1"
        },
        {
          "name": "github.com/skip2/go-qrcode",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20200617195104-da1b6568686e"
        },
        {
          "name": "go.etcd.io/bbolt",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.3"
        },
        {
          "name": "golang.org/x/image",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.42.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.21.0"
        },
        {
          "name": "periph.io/x/conn/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.7.3"
        },
        {
          "name": "periph.io/x/host/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.8.5"
        }
      ],
      "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": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "magicianjarden",
          "commits": 75,
          "avatar_url": "https://avatars.githubusercontent.com/u/116777564?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": false,
      "ci_workflows": [
        "release-desktop.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "go.sum",
        "pnpm-lock.yaml"
      ],
      "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "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": 6,
            "reason": "4 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cf0d839497496bc0f37e4c2a6500f1ea6b0c5780",
        "ran_at": "2026-07-25T22:12:28Z",
        "aggregate_score": 2.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T17:29:44Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dotjarden/pixeltui",
    "host": "github.com",
    "name": "pixeltui",
    "owner": "dotjarden"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 39,
      "inputs": {
        "security": 25,
        "vitality": 65,
        "community": 24,
        "governance": 27,
        "engineering": 48
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "commits_last_year": 75,
              "human_commit_share": 1,
              "days_since_last_push": 9,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 9 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "75 commits in the last year",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 75
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 14,
              "latest_release_tag": "v0.5.5",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 4.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "14 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.1
                    }
                  }
                ],
                "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": "excellent",
            "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "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": "critical",
        "name": "Sustainability & Governance",
        "value": 27,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "critical",
            "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": 16,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dotjarden",
              "public_repos": 1,
              "account_age_days": 157
            },
            "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": "0 followers of dotjarden",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "dotjarden"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~0 yr old",
                "points": 3.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dotjarden/pixeltui"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 48,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": true,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "bubbletea",
                "cli",
                "go",
                "music",
                "music-player",
                "navidrome",
                "subsonic",
                "terminal",
                "tui",
                "yt-dlp"
              ],
              "has_wiki": false,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 25,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 25,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "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": "4 existing vulnerabilities detected",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 55,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.987,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "74 of 75 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 74,
                      "sampled": 75
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "Cargo.lock",
                "go.sum",
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "clients/desktop/tsconfig.json"
              ],
              "agent_commit_share": 0.16,
              "toolchain_manifests": [
                "clients/desktop/src-tauri/Cargo.toml",
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "clients/desktop/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "clients/desktop/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": "12 of the last 75 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 12,
                      "sampled": 75
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 136790,
              "source_files_sampled": 112,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/112 source files over 60KB",
                "points": 54,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 112,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T22:12:32.352691Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dotjarden/pixeltui.svg",
  "full_name": "dotjarden/pixeltui",
  "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 v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.