Vibraxis is an AI DJ agent. You give it a set of tracks and, like a DJ, it analyzes them, picks a compatible next track, matches the tempo, and crossfades between two decks to keep the music going without gaps. Shuffle only reorders tracks and plays them at random — it doesn't match tempo, pick a compatible next track, or blend anything. You can ask for the kind of music you want in plain text or by voice.
Inspiration
I love music. I write my own, I listen to my DJ friends blend one track into the next, I catch songs on the radio, and I keep music playing while I work. But when I start my usual playlist, I sometimes just want something fresh — and shuffle can't read the room. A DJ reads the moment: they hold the energy, choose a key- and tempo-compatible record, and blend it in at exactly the right time. I wanted that as software you can simply talk to.
What it does
- It automatically selects, queues, beat-matches, and crossfades tracks, keeping a continuous set.
- If you submit a request using natural language, it might eventually play it.
- It uses the analysis results to avoid arbitrary track combinations.
How I built it
The main codebase uses Node.js with TypeScript, while Python (with uv) is used for analysis.
Two parts carry it:
- A two-deck audio engine, controlled by a protocol. The engine runs in the browser and takes its commands over a MessagePort contract called VDAP; VDAP validates each command and schedules the beat-matched transition to land on a bar boundary. The engine has two decks, a 3-band EQ, crossfader curves, playback-rate limits, and a limiter so it can't clip.
- A bounded AI pipeline. The LLM doesn't drive the audio engine directly:
natural language ─▶ GPT-5.6 ─▶ DjIntent (bounded JSON)
DjIntent ─▶ deterministic engine ─▶ scored shortlist
shortlist ─▶ Codex ─▶ DjDecision (track, deck, crossfade)
DjDecision ─▶ schema + semantic validation ─▶ beat-matched transition
GPT-5.6 reads the request into a bounded intent, a deterministic engine scores candidates by BPM, key and energy, and Codex picks from a disclosed shortlist in a read-only sandbox. Anything that fails validation is rejected rather than silently corrected.
Challenges I ran into
- BPM detection and adjustment of the grid position at the start of the measure.
Accomplishments I'm proud of
- It runs an endless set by itself: picks the next track, beat-matches it, and crossfades between two decks with no approval step.
- Track selection runs GPT-5.6, then deterministic scoring, then Codex, and every model output is validated before it reaches the audio engine.
- VDAP has a written spec and a machine checker. 389 backend/frontend/contract tests and 33 analyzer tests pass.
- The spec and its checker were written before the features (protocol-first, with Codex).
What I learned
- Writing the VDAP spec and its checker before any feature made the later stages easier to build.
- It worked better to let GPT-5.6 handle the ambiguous language and keep the audio-critical decisions in plain deterministic code.
- Autonomous by default with instant manual override worked better than asking for approval on every mix.
What's next for Vibraxis
- Phrase-locked timing: start the next track a bar early and finish the crossfade right on the phrase, so its drop lands on the beat.
- EQ-swap and channel-fader transitions, in addition to the crossfader cut.
- Connect a streaming catalog through the existing MusicSource interface.
- Expose the agent port as an MCP server so another agent can DJ.
Built With
- librosa
- node.js
- openai
- python
- react
- typescript
Log in or sign up for Devpost to join the conversation.