{"id":41644930,"url":"https://github.com/rianvdm/listentomore","last_synced_at":"2026-04-01T19:54:55.318Z","repository":{"id":327300831,"uuid":"1106774961","full_name":"rianvdm/listentomore","owner":"rianvdm","description":"Music discovery web app with AI-powered summaries. Built with Hono on Cloudflare Workers.","archived":false,"fork":false,"pushed_at":"2026-02-26T21:43:37.000Z","size":1461,"stargazers_count":5,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-27T03:41:57.284Z","etag":null,"topics":["lastfm","lastfm-api","music","openai-api","perplexity-api","spotify-api"],"latest_commit_sha":null,"homepage":"https://listentomore.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rianvdm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-29T23:06:30.000Z","updated_at":"2026-02-26T21:43:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rianvdm/listentomore","commit_stats":null,"previous_names":["rianvdm/listentomore"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/rianvdm/listentomore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rianvdm%2Flistentomore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rianvdm%2Flistentomore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rianvdm%2Flistentomore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rianvdm%2Flistentomore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rianvdm","download_url":"https://codeload.github.com/rianvdm/listentomore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rianvdm%2Flistentomore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29914292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"ssl_error","status_checked_at":"2026-02-27T19:37:41.463Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lastfm","lastfm-api","music","openai-api","perplexity-api","spotify-api"],"created_at":"2026-01-24T15:17:35.753Z","updated_at":"2026-04-01T19:54:55.291Z","avatar_url":"https://github.com/rianvdm.png","language":"TypeScript","readme":"# Listen To More\n\nA music discovery platform that combines real-time listening data with AI-powered insights. Built with Hono on Cloudflare Workers.\n\n**Live site:** [listentomore.com](https://listentomore.com)\n\n## Features\n\n### User Accounts\n- **Sign in with Last.fm** - One-click authentication using your Last.fm account\n- **Personal Profile** - Your own profile page at `/u/your-username` with listening stats\n- **Privacy Controls** - Choose to make your profile public or private\n- **Account Settings** - Manage your display name, bio, and privacy preferences\n\n### Music Discovery\n- **Album \u0026 Artist Search** - Search the Spotify catalog with instant results\n- **Album Detail Pages** - Rich album pages with release info, track listings, genres, and AI-generated summaries\n- **Artist Detail Pages** - Artist profiles with biography, top albums, similar artists, and genre connections\n- **AI-Powered Summaries** - Get rich, contextual information about any artist, album, or genre powered by OpenAI GPT-5.4 with web search\n- **Genre Exploration** - Discover music by genre with AI-generated descriptions, history, and key artists\n- **Cross-Platform Streaming Links** - Every album includes direct links to Spotify, Apple Music, and Songlink (for all other services)\n- **Album Recommendations** - AI-generated \"if you like this, try these\" recommendations on album pages\n\n### Personal Stats\n- **Real-time Listening Stats** - See your recent listening activity from Last.fm\n- **Top Artists \u0026 Albums** - View your most-played music over different time periods (7 days, 30 days, etc.)\n- **Personalized Recommendations** - Discover new artists based on your listening habits and similar artist connections\n- **Loved Tracks** - See your favorite tracks with AI-generated artist insights\n- **Weekly Insights** - AI-powered analysis of your 7-day listening patterns with personalized album recommendations\n\n### Home Feed\n- **Community Listening** - See what registered users are listening to in real-time (updates every 5 minutes)\n- **Daily Music Facts** - A new AI-generated music fact every hour\n\n### Tools \u0026 Integrations\n- **Discord Bot** - Share album details and streaming links in your Discord server ([learn more](/discord))\n- **Last.fm MCP Server** - Connect AI assistants like Claude to your Last.fm data ([lastfm-mcp.com](https://lastfm-mcp.com))\n\n### Discord Bot Commands\n- `/listento artist:X album:Y` - Get album details with streaming links and AI summary\n- `/listenlast lastfm_user:X` - See what someone is listening to on Last.fm\n- `/listenurl url:X` - Get cross-platform links from a Spotify or Apple Music URL\n- `/whois artist:X` - Quick AI summary of any artist\n- `/whatis genre:X` - AI explanation of a music genre\n- `/ask question:X` - Chat with the Rick Rubin AI personality\n\n### REST API\nFull programmatic access to music discovery features. Rate-limited with tiered access (standard: 60 req/min, premium: 300 req/min). See [API Documentation](docs/API.md) for details or [contact me](https://elezea.com/contact) to request an API key.\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| **Framework** | [Hono](https://hono.dev) |\n| **Runtime** | [Cloudflare Workers](https://workers.cloudflare.com) |\n| **Database** | [Cloudflare D1](https://developers.cloudflare.com/d1/) (SQLite) |\n| **Caching** | [Cloudflare KV](https://developers.cloudflare.com/kv/) |\n| **Language** | TypeScript |\n| **Monorepo** | [Turborepo](https://turbo.build) + pnpm |\n| **Testing** | Vitest |\n\n## Architecture\n\nThe application follows a **progressive loading** pattern:\n1. Pages render instantly with basic data from Spotify (~300ms)\n2. AI summaries and additional data stream in via client-side JavaScript\n3. Links are progressively enriched with direct Spotify IDs\n\nAll pages are **server-side rendered** - no client-side frameworks, just vanilla JS for progressive enhancement.\n\n## Project Structure\n\n```\nlistentomore/\n├── apps/\n│   ├── web/                    # Main Hono web app (Cloudflare Worker)\n│   └── discord-bot/            # Discord bot for music commands\n├── packages/\n│   ├── services/               # Backend service modules\n│   │   ├── spotify/            # Spotify Web API client\n│   │   ├── lastfm/             # Last.fm API client\n│   │   ├── ai/                # OpenAI client\n│   │   ├── songlink/           # Odesli/Songlink API client\n│   │   └── streaming-links/    # Cross-platform link service (Apple Music, URL parsing)\n│   ├── db/                     # D1 schema, migrations, queries\n│   ├── config/                 # Centralized config (cache TTLs, AI prompts)\n│   └── shared/                 # Shared types and utilities\n└── docs/                       # Technical documentation\n```\n\n## Getting Started\n\n### Prerequisites\n- Node.js 18+\n- pnpm 9+\n- Cloudflare account (for D1 and KV)\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/rianvdm/listentomore.git\ncd listentomore\n\n# Install dependencies\npnpm install\n\n# Set up environment variables (see Environment Variables section below)\ntouch apps/web/.dev.vars\n# Edit .dev.vars with your API keys\n```\n\n### Environment Variables\n\nCreate `apps/web/.dev.vars`:\n\n```bash\n# Required\nSPOTIFY_CLIENT_ID=your_spotify_client_id\nSPOTIFY_CLIENT_SECRET=your_spotify_client_secret\nSPOTIFY_REFRESH_TOKEN=your_spotify_refresh_token\nLASTFM_API_KEY=your_lastfm_api_key\nLASTFM_USERNAME=your_lastfm_username\nOPENAI_API_KEY=your_openai_api_key\nINTERNAL_API_SECRET=your_random_secret_for_internal_apis\n\n# Optional - for admin features\nADMIN_SECRET=your_admin_secret\n\n# Optional - for Apple Music direct links\nAPPLE_TEAM_ID=your_apple_team_id\nAPPLE_KEY_ID=your_apple_key_id\nAPPLE_PRIVATE_KEY=your_apple_private_key\n```\n\n### Development\n\n```bash\n# Run development server\npnpm dev\n\n# Build all packages\npnpm build\n\n# Run tests\npnpm test\n\n# Type check\npnpm typecheck\n\n# Deploy to Cloudflare\npnpm deploy\n```\n\n## External Services\n\n- **[Spotify Web API](https://developer.spotify.com/documentation/web-api)** - Music catalog data\n- **[Last.fm API](https://www.last.fm/api)** - Listening history and scrobbles\n- **[OpenAI API](https://platform.openai.com)** - GPT-5.4 for AI summaries, web search, chatbot, and fact generation\n- **[Apple MusicKit API](https://developer.apple.com/musickit/)** - Cross-platform streaming links via UPC matching\n- **[Songlink/Odesli](https://odesli.co)** - Cross-platform streaming links for all services\n\n## Get Started\n\n1. **Visit [listentomore.com](https://listentomore.com)**\n2. **Click \"Sign In\"** and connect your Last.fm account\n3. **That's it!** Your profile is live at `listentomore.com/u/your-lastfm-username`\n\nDon't have a Last.fm account? [Create one for free](https://www.last.fm/join) and connect a scrobbler to track your listening from Spotify, Apple Music, or any other service.\n\n## License\n\nPrivate - All rights reserved.\n\n## Author\n\nBuilt by [Rian van der Merwe](https://elezea.com)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frianvdm%2Flistentomore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frianvdm%2Flistentomore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frianvdm%2Flistentomore/lists"}