Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrella⑂ 0 forksdesde jun 2026Ver en GitHub ↗

dotjarden/pixeltui tiene un índice de salud de 39 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (65/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hace 9 días. Una sola persona concentra la mayor parte del trabajo reciente.

39
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

39
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

jardenCuenta personal
0 seguidores1 repositorio públicodesde feb 2026

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/dotjarden/pixeltuiv0.5.5-14hace 9 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

65Moderado · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 9 días
2.1/36Cadencia de commits — 3/52 semanas con commits
16.9/18Volumen de commits — 75 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year75
human_commit_share1
days_since_last_push9
active_weeks_last_year3
Cómo se puntúa
27/27Publica versiones — 14 versiones publicadas
36/36Recencia de las versiones — última versión hace 9 días
27/27Cadencia de publicación — una versión cada ~4,1 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count14
latest_release_tagv0.5.5
releases_from_tagsno
days_since_latest_release9
mean_days_between_releases4,1

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

27Crítico · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de dotjarden
3.1/25Trayectoria — 1 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_logindotjarden
public_repos1
account_age_days157
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 9 días
20/20Historial de versiones — 14 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/dotjarden/pixeltui
ecosystemsgo
any_deprecatedno
min_days_since_publish9

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

48En riesgo · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
0/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_testsno
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 10 topics
0/10Wiki
Datos de entrada utilizados
topicsbubbletea, cli, go, music, music-player, navidrome, subsonic, terminal, tui, yt-dlp
has_wikino
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

25Crítico · 16% del índice global
Cómo se puntúa
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 — sin datos
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.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,5
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

55Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 74 de 75 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,987
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — clients/desktop/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 12 de los últimos 75 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_testsno
lockfilesCargo.lock, go.sum, pnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configsclients/desktop/tsconfig.json
agent_commit_share0,16
toolchain_manifestsclients/desktop/src-tauri/Cargo.toml, go.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54/55Tamaños de archivo manejables — 2/112 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes136.790
source_files_sampled112
oversized_source_files2

Datos clave

1estrellas de GitHub
1contribuidores
75commits en los últimos 12 meses
9días desde el último push
14versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 2.5 / 10
2.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dPackagingpackaging 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
Dependencias directas 13
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.