Releases: rianvdm/listentomore
v1.4.3
v1.4.2 — Fix Apple Music Album Matching
Changes
- fix: don't return wrong album when Spotify search finds no name match — When resolving Apple Music URLs to Spotify, the search would silently fall back to the artist's most popular album (e.g., "Who's Next" instead of "Face Dances"). Now strips parenthetical edition suffixes like "(Bonus Track Version)" and retries, and returns null instead of a wrong result when no match exists.
- Replace Rick Rubin persona with generic friendly assistant for /ask prompt — The /ask command now uses a generic music-knowledgeable assistant instead of the Rick Rubin persona.
v1.4.1 — User Artist Playcount
Show the logged-in user's personal Last.fm playcount on artist pages.
- When logged in, artist pages now display "Your plays: N" in the metadata section alongside genres
- Piggybacks on the existing
artist.getInfoAPI call — no additional network requests - Logged-out users see no change
Closes #25
v1.4.0 — Migrate to GPT-5.4, Remove Citations
What's Changed
- Consolidated all AI tasks on
gpt-5.4, replacing the split acrossgpt-5-search-api,gpt-5.2, andgpt-5.1 - Removed citation handling entirely — extraction logic, inline display, CSS styles, and public API
citationsfields - Web search stays enabled via the OpenAI Responses API; prompts updated to encourage searches for recent/unknown content
- Simplified OpenAI client (~190 lines of citation parsing removed)
Full Changelog
v1.3.0 — Spotify Feb 2026 Migration (MusicBrainz)
What Changed
Spotify is removing external_ids (ISRC/UPC), popularity, followers, and label fields from Development Mode API responses on March 9, 2026. This release adds MusicBrainz as an alternative source for UPC/ISRC codes used in Apple Music cross-platform matching, and cuts over to it immediately to validate the pipeline before the deadline.
MusicBrainz Service
New @listentomore/musicbrainz package with:
- Album UPC lookup via release search — Lucene queries, score filtering (>=80), Album-type preference, MBID follow-up for missing barcodes
- Track ISRC lookup via recording search — tries up to 3 recordings (MusicBrainz ISRC coverage is spotty; not all recordings have ISRCs)
- Rate-limited fetch — 1.1s between requests via KV-backed distributed state (MusicBrainz blocks IPs that exceed 1 req/sec)
- 30-day cache for results (ISRCs/UPCs never change once assigned)
- 11 unit tests
Pipeline Integration
- MusicBrainz enrichment integrated into
StreamingLinksService— called before Apple Music lookup - Match-method logging in Apple Music provider (
Album matched via UPCvsfalling back to text search) - Spotify UPC/ISRC intentionally zeroed out to force MusicBrainz path — validates the pipeline in production ahead of March 9
Spotify Type Cleanup
label,popularitymade optional inAlbumDetails/SpotifyAlbumResponsefollowers,popularitymade optional inArtistDetails/SpotifyArtistResponse- No UI impact (these fields were stored but never rendered)
Bug Fix
- Fixed MusicBrainz rate limit KV TTL — was 10s, Cloudflare KV minimum is 60s. Caused all MusicBrainz calls to silently fail. Caught via production tail logs.
Other Changes (since v1.2.1)
- Fix CSRF on account deletion — changed GET to POST with server-side confirmation
- Fix citation extraction priority — annotations first, markdown links as fallback
- Fix citation markers in artistSentence output
v1.2.1 — Migrate AI from Perplexity to OpenAI
What Changed
Perplexity has been fully removed as an AI provider. All AI tasks now run on OpenAI.
Web Search Tasks → gpt-5-search-api
The 5 web-grounded tasks (artist summaries, album details, genre summaries, artist sentences, album recommendations) now use gpt-5-search-api via the Chat Completions API. This dedicated search model reliably returns url_citation annotations, enabling clickable source links on all AI-generated content.
Why not GPT-5.2 Responses API?
GPT-5.2 with the web_search tool returns empty citation annotations when reasoning is enabled (agentic search behavior). Even with reasoning: 'none', annotations were unreliable. gpt-5-search-api via Chat Completions is the reliable path.
Changes
- Deleted
packages/services/ai/src/perplexity.ts(PerplexityClient removed) - Switched 5 web search tasks from Perplexity
sonartogpt-5-search-api - Added
web_search_optionssupport in Chat Completions path - Added citation link-to-number replacement in Responses API parser
- Removed
PERPLEXITY_API_KEYfrom all bindings, env types, and wrangler configs - Removed
perplexityfrom AIProvider type, rate limits, and DB schema - Simplified AIService to OpenAI-only (no more provider routing)
- Increased OpenAI rate limit from 60 to 90 req/min
- Updated docs: CLAUDE.md, README.md, ai-models.md, migration doc, about page
- Updated tests: removed Perplexity tests, updated mocks for Chat Completions
24 files changed, 219 insertions(+), 462 deletions(-)
v1.2.0 - StreamingLinksService & Rate Limiting
🚀 New Features
Discord Bot: StreamingLinksService
- Replace rate-limited Songlink API with custom StreamingLinksService
/listenurlnow accepts both Spotify AND Apple Music URLs- URL parser for detecting and extracting IDs from streaming URLs
- Apple Music reverse lookup (find Spotify match from Apple Music URL)
Distributed Rate Limiting
- Implement distributed rate limiting for Spotify and AI APIs
- Improved Spotify rate limiting and optimized cron job
- Secondary Spotify app support for rate limit isolation
User Profiles
- Add private profile handling to user pages
- Discord webhook messages now include profile links
🧹 Improvements
- Remove unused SonglinkService from web app production code
- Remove unused search history tables and code
- Add URL parser unit tests (24 tests)
- Updated documentation (README, CLAUDE.md)
📦 Dependencies
- Both web app and discord-bot now use StreamingLinksService
- Songlink package kept for potential future use (devDependency only)
Full Changelog: v1.1.1...v1.2.0
v1.1.1 - Homepage Redesign
🏠 Homepage Redesign
This release introduces a conversion-focused homepage redesign to better communicate the value of ListenToMore to new visitors.
What's New
- Hero Section - New above-the-fold hero with clear value proposition: "Discover your music story"
- Feature Highlights - Cards showcasing Stats, Insights, Album Discovery, and Discord Bot features
- Album Search - Prominent search section for exploring any album
- Community Feed - Renamed "What the community is listening to" with improved CTA
- Final CTA - Closing call-to-action for visitors who scroll through
For Logged-In Users
- Personalized greeting with username
- Quick-access links to Stats, Insights, and Recommendations
- Signup CTAs are hidden for authenticated users
Other Changes
- Added "Release notes" link to footer
v1.1.0 - Insights Page
What's New
Insights Page
A new AI-powered Insights page at /u/{username}/insights that analyzes your 7-day listening patterns:
- Your Week in Music - GPT-5.2 generates a personalized summary of your listening habits, noting patterns, genre shifts, and artist deep-dives
- Album Recommendations - 4 AI-curated album suggestions based on your recent listening, with Spotify-enriched album cards (cover art, direct links)
- Refresh Button - Force regenerate insights with a 5-minute cooldown (server-side enforced, persists across page reloads)
- 24-Hour Cache - Results are cached for 24 hours to reduce API costs
- Privacy Aware - Private profiles only show insights to the profile owner
- Sparse Data Handling - Fun message shown when listening data is insufficient (<5 plays)
Technical Details
- New internal API endpoints:
/user-insights-summary,/user-insights-recommendations,/user-insights-cooldown - Uses GPT-5.2 for summary generation
- Uses GPT-5.2 with
reasoning: noneandverbosity: lowfor faster recommendations - Album and artist links enriched with Spotify IDs for direct navigation
v1.0.1 - User Profile Visual Hierarchy
User Profile Improvements
Visual Hierarchy Enhancement
- Created static UserProfileHeader component for consistent identity across profile pages
- Replaced changing page headlines with single static header above tabs
- Centered subnavigation and removed horizontal border for cleaner look
- Matched spacing and font size with home page for consistency
- Profile picture temporarily removed (code preserved for future use)
Time Range Toggle
- Added interactive time range selector to user stats page (7 days / 1 month / 1 year)
- Dynamic content updates without page reload when switching time periods
- Smooth transitions and loading states for better UX
- URL state preservation (period parameter in query string)
Design Pattern
Implements industry standard profile page hierarchy (used by GitHub, Spotify, Last.fm):
Static Header → Tabs → Content (no redundant changing headlines)
Technical Details
- New component:
UserProfileHeader.tsx - Updated pages: stats.tsx, recommendations.tsx
- CSS improvements for consistent spacing and centered navigation
- Client-side time range switching with state management
🤖 Built with Claude Code