Звіт у форматі JSON машиночитний
{
"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"
}