Everyone knows Spotify DJ sucks. We wanted an alternative that was both dynamic (agentic) and incorporated user feedback + listening history to drive the recommendations. ClaudeDJ reads lightweight reaction signals, chooses the next track, and keeps the set moving so the listener does not have to hunt for playlists or manage a queue.
ClaudeDJ is an autonomous DJ system. The Claude Code SDK connects to a local MCP server, where Claude can search for tracks, replace the Spotify app-owned queue, start playback, and prepare narration. Spotify plays the music. Redis vector search finds similar songs or a different lane. Deepgram creates short spoken transitions. A small Electron mascot sits near the macOS Dock, so the demo feels more like a desktop companion than a dashboard.
The hard part is timing. Claude can think while a song is playing, but a track change cannot wait on the model. When reactions or cluster rules say the set should shift, Claude prepares the next one or two tracks and renders the bridge narration in advance. At the boundary, the executor fades the volume, starts the next song, plays the narration, and restores playback. If the plan is not ready, the queue keeps going.
The backend is Python and wraps the Claude Code SDK. It exposes DJ tools through MCP and coordinates Spotify, Deepgram, Redis, and the camera reaction pipeline. Recommendations combine Spotify playlist context, Deezer enrichment, CLAP audio embeddings, and Redis vector search. The frontend uses Next.js and Electron for the mascot, with Sentry wired into both frontend and backend.
The biggest challenge was separating agent decisions from real-time playback. Music should not stall because an agent call, Redis query, or text-to-speech request is still running.
The main lesson was to keep the music agent's contract narrow. Claude handles taste, pivots, and short commentary. The system owns timing, state, fallbacks, and playback safety.


Log in or sign up for Devpost to join the conversation.