16 KiB
Project Progress
Active package — rich control dashboard and provider parity
Outcome
Turn the existing administrator WebUI into one coherent, data-rich music control dashboard while preserving native Jellyfin/Subsonic fidelity and the existing provider-neutral backend owners.
This is a replacement and consolidation package. Do not create parallel matching, routing, scrobbling, caching, scheduling, or recommendation systems. Delete each old UI surface after its replacement passes.
Verified delivery state
- Application revision
218a703fe74180d835c7c2398b554891edcc13e4is pushed and deployed to both Jellyfin and Subsonic stacks. - Both server checkouts are clean at that revision. Both app containers use image
sha256:d717f94c2a15c97befff49f4c4d2ba46162bde1ba0945b4ef64d3915edbea127and are healthy; both readiness responses report PostgreSQL ready, both trusted-LAN WebUIs return HTTP 200, and startup logs contain no error- or critical-level entries. - GitHub Actions run
32323295754is green across build/test, release-critical, Apple, WebUI, format, Compose, and release-manifest jobs. - Current WebUI baseline is 47.3 KiB initial JavaScript and 23.8 KiB CSS; unit is 46/46. The import, retention, disclosure, audio-quality, and extension-permission browser slice is 5/5.
- Completed listening-history imports can be undone by exact import provenance; this removes only their stored listens, checkpoints, saved record, and temporary artifact. Spotify
Streaming_History_Video_*exports are rejected before staging. - Canvas UI remains blocked by MIT plus Commons Clause redistribution terms. A focused replacement review found no permissive renderer that would delete more code than it adds, so use Svelte 5, shadcn-svelte, Bits UI, Lucide, CSS, SVG, and native Web Animations.
- Koito
a079fa693569d21e03c00df163f20ac5e137c490, Explo4fc75874de691ff1e26b10d88b859cfac8ee2992, and Multi-Scrobblerbc28de66b14db1c99eb79ad75d1cdf4c9dfff7ccare MIT reference inputs. Adapt useful behavior and presentation into existing owners; do not import their application architectures. - LAN/VPN access was enabled only after the local release gates passed, then used for exact-revision deployment and qualification.
Product rules
- Show every useful supported fact, using overview → expansion → detail so primary screens remain scannable.
- Never display invented popularity, media, listening, readiness, latency, or provider facts.
- Work only from observed production behavior, captured client shapes, public protocol contracts, and donor workflows deliberately adopted here. Do not build speculative edge cases.
- Preserve authentication, authorization, secret redaction, destructive-operation, migration, data-loss, and protocol safety coverage.
- Matched native items relay the complete backend object unchanged. Virtual objects expose every available field with stable, internally consistent relationships.
Phase 0 — package and donor baseline
- Record exact donor UI paths, adaptation boundaries, licenses, and destination owners in the reference ledger.
- Capture current route request counts, response sizes, render timings, long tasks, bundle sizes, and table geometry.
- Record the old Signal Boot implementation and current shared UI owners before editing.
Acceptance: reproducible before-state evidence exists and no donor code enters production without provenance.
Phase 1 — shared shell, tables, motion, and visual language
- Restore Signal Boot for real authentication/bootstrap work with no artificial delay, reduced motion, and retryable failure state.
- Standardize desktop rows, artwork, numeric columns, actions, gutters, and mobile cards across playlists, Integrations, Activity, Mappings, Cached, Kept, and Intelligence history.
- Centralize provider colors/icons so Jellyfin, Deezer, Apple, Spotify, YouTube, and extensions remain distinguishable.
- Add restrained native motion for focused artwork, mapping decisions, delivered scrobbles, and expanding detail; never reorder content under the pointer.
- Delete superseded per-page table, loading, icon, and animation CSS.
Acceptance: geometry is aligned at desktop/tablet/mobile, keyboard and reduced-motion behavior pass, and no renderer dependency is added.
Phase 2 — unified Integrations hub
- Rename Sources to Integrations with Services, Accounts, Extensions, and Routing tabs.
- Group logical services with their built-in, extension, sidecar, backend, and account implementations.
- Put configuration beside the exact implementation; keep lifecycle/permissions in Extensions and secrets/audience in Accounts.
- Move quality, provider ordering, local preference, and extension penalty to Routing; leave only app-wide system/maintenance controls in Settings.
- Add stable service/implementation projection facts and deep links; redirect old Sources/Accounts/Extensions routes.
- Show capability coverage, readiness, latest probe, CTS, managed p95, last failure, account scope, version, and routing priority without ambiguous blanks.
- Delete duplicate provider/account/extension/settings forms after the replacement passes.
Acceptance: one route owns discovery, setup, health, accounts, configuration, extensions, and routing without duplicating durable state.
Phase 3 — Intelligence and imports
- Replace the five equal tabs with Overview, History & Imports, Discover, and Automation.
- Adapt Koito period controls, heatmap, totals, streaks, top music, history density, and recap presentation.
- Adapt Explo recommendation, generated-playlist, schedule, run-now, next-run, and prior-run presentation.
- Redesign imports as multi-file drag/drop with automatic previews, valid files selected by default, one batch summary, per-file detail, and Add all ready files.
- Add bounded grouped daily/monthly and source/provider/client aggregates using the existing listening-occurrence authority.
- Refresh Overview, History, and Discover after imports and replace generic prerequisites with exact Integrations deep links.
Acceptance: imported and live history agree, recommendations use saved data, and rich analytics require no second database.
Phase 4 — Home and Activity
- Add one aggregate Home read endpoint composed from existing owners while retaining individual endpoints for compatibility.
- Show active listeners, playlist/playable/unresolved totals, cache/kept usage, playable-source health, jobs, scrobbles, recent trend, top music, and actionable setup problems.
- Expand now playing with user/client/device, actual implementation, cache route, progress, scrobble threshold, and per-target delivery state.
- Reuse existing delivery checkpoints/activity state; add no second persistence or realtime channel.
- Adapt Multi-Scrobbler status, now-playing, retry, and per-target outcome patterns.
- Redesign Activity with colored icons, provider accents, rich filters, concise summaries, retry/auth state, and expandable redacted details.
Acceptance: Home loads through the aggregate plus now-playing update, and every stat and scrobble mark reflects durable state.
Phase 5 — Mappings, Cached, and Kept
- Search verified identities first, then run title+artist, title+album, title, artist, and album queries and score the deduplicated union.
- Prevent weak artist mismatches from becoming automatic suggestions and keep every credible candidate accessible with complete scoring evidence.
- Bump the matcher revision and use the existing preview/rematch job for unresolved, suggested, ambiguous, and stale decisions only.
- Add the Selena Gomez
Crushregression and protect accepted, pinned, rejected, and manual decisions. - Present Mappings as All, Review, Unresolved, and History with full score/identity/route details on expansion; accepted rows leave Review immediately.
- Add cache/kept totals, provider/lifecycle facts, last access, expiry, quality, publication, references, filters, and previewed bulk actions.
- Reindex only completed files with valid Allstarr ownership metadata; show unknown files as diagnostics and never adopt/delete them automatically.
Acceptance: automatic suggestions are credible, manual decisions remain authoritative, and Cached/Kept agree with managed-file owners.
Phase 6 — external object, streaming, and lyrics parity
- Use one provider-neutral external relationship projection for primary albums, credited tracks, and Appears On in Jellyfin and Subsonic.
- Keep external IDs, artwork, relationships, pagination, and traversal stable and internally consistent.
- Discover and qualify every ready streaming or download-backed implementation dynamically.
- Verify metadata → PlaybackInfo → bounded audio → range/cancellation → artwork → lyrics while recording the selected implementation/account.
- Preserve configured quality and return a truthful failure instead of silently substituting another track.
- Run source-native lyrics first, then Odesli identity translation and distinct configured fallbacks without downloading media merely to find lyrics.
Acceptance: native objects remain exact, virtual objects satisfy the full client contract, unrelated Appears On albums fail, and real external playback failures are classified.
Phase 7 — performance, release, and live delivery
- Keep initial JS/CSS within existing budgets and reject unexplained growth above 10%; keep route chunks under 100 KiB gzip.
- Use grouped queries, lazy routes/artwork, keyed row updates, and off-screen content visibility; add no charting/rendering/virtualization framework.
- Expand the Jellyfin kit to union-key native comparison, native artwork/count parity, dynamic external traversal, every ready playable provider, and checked Finer/Feishin/Musiver request shapes.
- Run focused owner tests, WebUI check/unit/build/budget/E2E, both PostgreSQL lanes, format, Apple gateway, Compose, shell, and deterministic protocol kits.
- Ask the user to enable LAN/VPN only after the exact final SHA is locally green.
- After exact-revision authorization, push, deploy, run bounded browser/provider/client qualification, and record the deployed SHA.
Acceptance: local release evidence is complete before LAN access, no unrun gate is called passing, and live failures are separated into provider/configuration versus Allstarr defects.
Local release evidence
- WebUI: check clean, unit 46/46, build and budgets green at 46.2 KiB initial JavaScript and 22.7 KiB CSS, browser 92/92 without retries.
- Backend: PostgreSQL fast lane 2,213/2,213 and release-critical lane 104/104; the slow release-critical tests remain protected migration, lineage, state-transfer, backup, clone-pool, and 10,000-track contracts.
- Supporting gates: format clean, Apple gateway 20/20, all three Compose profiles valid, deterministic Subsonic 5/5, release-manifest self-tests 2/2, shell syntax clean.
- The live Jellyfin kit now exact-compares native music counts in addition to existing full native objects, artwork bytes, dynamic external traversal, playback, Finer, Feishin, Musiver, and WebSocket contracts.
Live release evidence
- Jellyfin provider/client qualification: 181 checks, zero failures; Apple GAMDL, Deezer, and YouTube Music delivered bounded audio. Metadata/lyrics-only extensions are no longer advertised as playable tracks.
- Actor-bound Jellyfin qualification: 194 checks, zero failures; the exact private throwaway playlist passed create, rename, add, reorder, remove, share, unshare, mix, delete, and direct 404 cleanup verification.
- Jellyfin WebSocket qualification: 5/5 for header authentication, bidirectional frames, Sessions delivery, and invalid-token rejection.
- OpenSubsonic/Navidrome qualification: 67 checks, zero failures across password/token auth, XML/JSON, playlists, browse/search, artwork, lyrics, exact range bytes, concurrency, cancellation, and direct-vs-Allstarr shape parity.
- Browser-only responsive qualification: 27/27 route/viewport checks across desktop, tablet, and mobile with no overflow, crash state, missing main heading, or console error.
- External sources without range support were retained as truthful bounded progressive delivery rather than falsely advertising seek support.
Post-delivery WebUI refinement — delivered
- Application revision
f951adef2d45ca1d2582ccf1a0e3f8d1b9940649includes the Material control-room visual system, clearer Intelligence import controls, denser Home/review/storage workflows, truthful empty-value filter labels, horizontal-only segmented-tab activation, and truthful managed-audio totals that ignore missing mapped files. - The segmented-tab fix prevents nested mobile tabs from moving the document vertically. The browser regression waits for mounted content and settled layout, then proves zero document scroll and a fully visible page heading.
- Exact-revision WebUI evidence: Svelte diagnostics clean, unit 46/46, production build and budgets green at 47.2 KiB initial JavaScript and 23.5 KiB CSS, browser 93/93 without retries, design detector clean, and responsive light-theme screenshots reviewed at 390×844 and 1280×800.
- Two proposed shared-control/artwork changes were measured and discarded before commit: loading a Bits UI checkbox into the root shell raised initial JavaScript to 69.6 KiB, and blank provider logos were traced to the test fixture's intentionally empty SVG rather than production assets.
- Live browser qualification covered 12 desktop routes and 8 mobile routes with no document overflow, console error, or heading displacement. Home now reports
0 cached · 0 kept, matching the live Cached and Kept inventories.
Post-delivery AudioMuse setup placement — built-in correction deployed
- Register AudioMuse as a built-in Intelligence and health capability; it is not an extension package.
- Keep its self-hosted server URL, optional API token, and optional multi-server selector in Intelligence → Automation.
- Reuse the encrypted Source account dialog and durable account store; add no second credential store.
- Perform real account-bound
/api/healthchecks and route recommendation, search, path, blend, map, clustering-playlist, and analysis calls through the typed built-in adapter. - Keep Services available for shared account audience and diagnostics without making Extensions a prerequisite.
- Verify the correction locally: affected non-database .NET 68/68, Svelte diagnostics clean, WebUI unit 46/46, production build and budgets green, and focused mobile/desktop browser checks 3/3.
- Commit and push revision
1edd625e6ae20c3eff5e29175a6a870b67fa731f, deploy it to both Allstarr stacks, and verify both application containers healthy on imagesha256:dfa13b6d908101fb7e0325ebd8c5f3b299948fa8d7898f4aad07def3f47a45ac. - Verify live in the signed-in browser that Intelligence → Automation exposes Connect AudioMuse, its form contains the server URL, optional token, and optional music-server selector, and no extension prerequisite or link remains.
- Verify live import truthfulness: 20 completed receipts use “added when imported,” no disabled include checkboxes remain, and the zero-retained state directs the user to re-import the original files. The browser console contains no errors.
Post-delivery unlimited history range — deployed
- Default Overview and History reporting to All time, with no
from/tobounds sent until the user chooses a finite or custom range. - Remove the artificial ten-year reporting-window rejection while retaining ordered-date validation.
- Keep listening retention defaulted to
0(unlimited); do not migrate saved user choices or delete retained history. - Preserve finite 30-day, 90-day, one-year, and custom reporting choices.
- Verify the default/unbounded contracts: focused .NET 2/2, Svelte diagnostics clean, unit 46/46, production build and budgets green, and focused responsive browser checks 2/2.
- Commit the implementation as
218a703f. - Push and deploy the exact revision after authorization.
Next action
Continue the remaining active checklist from the next open implementation gate; the AudioMuse placement and truthful import-receipt correction are deployed and live-verified.