# Muzick — Progress ## Stack React/Vite + TanStack Router frontend, Fastify backend, BullMQ workers, PostgreSQL, Redis, Typesense. Docker Compose stack. ## What's working - Full 3-pane UI: NavRail + TopBar + main + NowPlayingPanel (queue/lyrics tabs) + PlaybackBar - Audio playback: play/pause/next/prev, seek, volume, shuffle, repeat (none/all/one) - Lyrics button in PlaybackBar → opens panel to lyrics tab - All pages themed with semantic design tokens; 5 presets (Purple default) - Enrichment pipeline: MusicBrainz, Last.fm, Discogs, LRCLib, Cover Art Archive — best-effort, per-toggle - Real Essentia WASM audio analysis: BPM, key, energy, danceability, dynamic complexity - Real MD5 content hash; track deduplication UI in Settings - Multi-signal Vibe engine: genre + artist similarity + feedback + audio features + jitter; diversity caps; shuffle-aware - Artist feat. dedup via `normalize_artist()` PostgreSQL function - `track_artists` junction table (role: main/featured); scanner parses feat from tags/titles - Clickable artist links in TrackRow (main + featured, navigate to artist page) - Schema migration system: `schema_migrations` table, runs pending migrations on every boot - Typesense auto-reindex after every scan (v3 API) - Play history, feedback, Quarantine (dislike → delayed deletion) with frontend page - Periodic integrity sweep worker (corrupt metadata, missing files) - Genres page: hierarchical parent → sub-genre display ## Next 1. **Redeploy** — `docker compose down && docker compose up --build -d`; migrations will run on boot (track_artists backfill + clear Last.fm placeholder images) 2. **Rescan library** — Settings → Scan library; populates `track_artists` with real feat splits for all tracks 3. **Enrichment** — enable toggles, scan again; leave audio analysis off until initial enrichment finishes (~3.9k tracks will be slow) 4. **Artist avatars** — after enrichment re-runs, Last.fm placeholder URLs are cleared; artists without a real image show the gradient fallback 5. **External track acquisition** — yt-dlp download worker for Last.fm similar tracks into the probation pool (infrastructure ready, worker not built) 6. **Multi-user / auth** — currently single-user, no `x-user-id` per-user isolation 7. **Runtime smoke-test gate** — `node dist/server.js` fail-fast check in CI/deploy; ESM extension errors not caught by `tsc` ## Known issues - Recommendation quality depends on enrichment having run (genres, artist similarity, audio features) - `cleanup_sweep` worker (grace-period transitions, ntfy notifications) implemented but untested against live stack - Frontend built and typechecked but not fully verified against live stack end-to-end