23 Commits

Author SHA1 Message Date
root
f2b8dadbf8 Add API cost tracking to admin dashboard
Track estimated Anthropic API costs per request across all Claude API
call sites (recommender, analyze, artist-dive, generate-playlist, crate,
rabbit-hole, playlist-fix, timeline, compatibility). Log token usage and
estimated cost to the app logger. Aggregate costs in admin stats endpoint
and display total/today costs and token usage in the admin dashboard.
2026-03-31 20:51:51 -05:00
root
2cb6f4d6b2 Switch to Sonnet for better accuracy, stronger anti-hallucination prompt 2026-03-31 19:41:13 -05:00
root
5773870c91 Exclude all previously recommended songs from new discoveries - no more repeats 2026-03-31 19:29:52 -05:00
root
88e7bc9c30 Add inline YouTube player on recommendation cards, fetch real video IDs via ytmusicapi 2026-03-31 19:09:12 -05:00
root
0b82149b97 Add mood scanner and surprise me features to discover page
Add mood_energy and mood_valence sliders that inject mood context into
AI recommendation prompts. Add "Surprise Me" button that generates
recommendations from a creative, unexpected angle without requiring
any user input. Includes backend endpoints, schema updates, and
full frontend UI integration.
2026-03-31 18:31:35 -05:00
root
99ca2ff7cc Remove MusicBrainz/YT verification (async greenlet conflict), use direct YouTube Music search links 2026-03-31 16:14:42 -05:00
root
fcca23e3ca Exclude queried artists from recommendations - only suggest new artists 2026-03-31 10:41:28 -05:00
root
85d4210a21 Switch to MusicBrainz for song verification, YouTube Music for playback links 2026-03-31 10:15:32 -05:00
root
9f9f9581d6 Verify all recommendations against YouTube Music - no more hallucinated songs, direct YT Music links 2026-03-31 10:12:37 -05:00
root
152f217675 Add Bandcamp discovery via public API (no scraping) - browse new releases by genre tag 2026-03-31 09:58:28 -05:00
root
be30a47bbb Remove Bandcamp scraping (TOS violation), use YouTube links for all recommendations 2026-03-31 09:51:20 -05:00
root
240032d972 Add Bandcamp/YouTube links on all recs, Fix My Playlist, configurable rec count
- Bandcamp: match artist+song, fall back to artist-only page
- YouTube fallback: if not on Bandcamp, link to YouTube music video search
- Fix My Playlist: AI analyzes playlist, finds outliers, suggests replacements
- User chooses recommendation count (5, 10, 15, 20)
2026-03-31 08:45:02 -05:00
root
1eea237c08 Add discovery modes, personalization controls, taste profile page, updated pricing
- Discovery modes: Sonic Twin, Era Bridge, Deep Cuts, Rising Artists
- Discovery dial (Safe to Adventurous slider)
- Block genres/moods exclusion
- Thumbs down/dislike on recommendations
- My Taste page with Genre DNA breakdown, audio feature meters, listening personality
- Updated pricing: Free (5/week), Premium ($6.99/mo), Family ($12.99/mo coming soon)
- Weekly rate limiting instead of daily
- Alembic migration for new fields
2026-03-31 00:21:58 -05:00
root
789de25c1a Remove Listen page, tighten Bandcamp matching to 75%+ artist similarity 2026-03-31 00:10:15 -05:00
root
1efa5cd628 Verify Bandcamp results match the actual artist/track before including 2026-03-30 23:56:17 -05:00
root
c6a82cf9d9 Bandcamp mode: only return artists verified on Bandcamp, request 15 and filter to 5 2026-03-30 23:50:02 -05:00
root
44eab20614 Make Bandcamp mode opt-in toggle on Discover page 2026-03-30 23:44:04 -05:00
root
37fccc6eef Wire Bandcamp into AI recommendations - prioritize indie artists, attach Bandcamp links to results 2026-03-30 23:42:03 -05:00
root
dd4df6a070 Add Bandcamp search and Listening Room page
Implement Bandcamp search service with autocomplete API and HTML
scraping fallback. Add /api/bandcamp/search and /api/bandcamp/embed
endpoints. Create Listening Room page with search, embedded player,
and queue management. Add navigation entry and Bandcamp link on
recommendation cards.
2026-03-30 23:38:14 -05:00
root
90945932ad Add Last.fm import support
Users can import their top tracks from Last.fm by entering their username.
No OAuth required - uses the public Last.fm API with user.getTopTracks and
user.getInfo endpoints. Includes a preview feature to verify the username
and see sample tracks before importing. Supports configurable time periods
(all time, 7 days, 1/3/6/12 months). Free tier playlist limit enforced.
2026-03-30 22:49:13 -05:00
root
cef7d576d4 Add production deployment config, Alembic migration, switch to Haiku
- Production Docker Compose with Caddy reverse proxy, Gunicorn, Nginx
- Multi-stage frontend build for production
- Deploy script and automated database backup script
- Initial Alembic migration with all tables
- Switch recommendation model from Sonnet to Haiku for cost efficiency
2026-03-30 21:40:16 -05:00
root
58c17498be Add YouTube Music playlist import support
- Add ytmusicapi dependency for fetching public YouTube Music playlists
- Create youtube_music service with playlist fetching and track search
- Add /api/youtube-music/import and /api/youtube-music/search endpoints
- Add importYouTubePlaylist and searchYouTubeMusic API client functions
- Update Playlists page with YouTube Music import button and URL input modal
2026-03-30 21:33:27 -05:00
root
155cbd1bbf Initial MVP: full-stack music discovery app
Backend (FastAPI):
- User auth with email/password and Spotify OAuth
- Spotify playlist import with audio feature extraction
- AI recommendation engine using Claude API with taste profiling
- Save/bookmark recommendations
- Rate limiting for free tier (10 recs/day, 1 playlist)
- PostgreSQL models with Alembic migrations
- Redis-ready configuration

Frontend (React 19 + TypeScript + Vite + Tailwind):
- Landing page, auth flows (email + Spotify OAuth)
- Dashboard with stats and quick discover
- Playlist management and import from Spotify
- Discover page with custom query support
- Recommendation cards with explanations and save toggle
- Taste profile visualization
- Responsive layout with mobile navigation
- PWA-ready configuration

Infrastructure:
- Docker Compose with PostgreSQL, Redis, backend, frontend
- Environment-based configuration
2026-03-30 15:53:39 -05:00