Apache-2.0 licensed Library stays on your Mac macOS / Apple silicon open-dj.com

ADeck A

Parity.

Everything you already know.

  • A four-deck screen laid out like rekordbox
  • Your rekordbox library, imported without changing it
  • Beat sync, master tempo, quantize, hot cues and loops
BDeck B

Beyond.

Anything you want it to do.

  • Most deck and mixer controls are typed commands a script or an AI agent can send
  • A library that shows which tracks are missing their files
  • A library that records where each value came from, with a draft open format for it

Open DJ is a free DJ app that runs on your own Mac. It has a four-deck screen laid out like rekordbox, imports your rekordbox library without changing it, and plays stems and lyrics you have already prepared (making them today needs the developer setup). Scripts and AI agents can drive most of its deck and mixer controls through the same commands as the screen.

Alpha, macOS on Apple silicon only. In this alpha the Mac app does not support MIDI controllers, and making stems is not in the app: today it needs the developer setup. Apache-2.0 licensed; the source is on GitHub.

Open DJ / Performance, development buildScreen capture

Screen capture, silent. Deck 1 is playing; a second track is double-clicked in the library, loads on deck 2, starts and beat-syncs to deck 1, then the crossfader moves to deck B and back. Development build, synthetic audio, not real tracks.

ADeck A / Parity

Four decks, where you expect them.

The layout follows the rekordbox 7 Performance screen, over the library you already have, so most of it is where your hands already go. Where Open DJ does not match yet, such as the wide hot-cue pad layout or saving new hot cues, the features page says so.

Illustration, drawn in HTML for this page, not a screenshot. Track data is placeholder. The small crossfader in it follows the one docked at the bottom of your screen. Screenshots of the real app belong on the Press page.

Works

Imports your rekordbox library without changing it

On first launch, setup finds your rekordbox library and imports it, with progress on screen and no Terminal. It makes a copy of rekordbox's library file and only ever reads that copy; the installed Mac app clears the write switch before its engine starts, so it will not write to your rekordbox library, a Pioneer share or a USB export. Its one library write is a djay playlist write-back, which runs only after you confirm it and backs up the playlist first. From a source checkout, writes are off by default; the one exception is undo of an earlier write you allowed. Quit rekordbox first so the copy has your latest changes. No rekordbox? Point it at a folder of music instead.

Writing back to rekordbox is switched off. The Serato, Traktor and djay adapters run from the command line today.

Will it change my library? Library features

AppHow Open DJ reads it
rekordboxImported in the app on first launch
Any music folderImported in the app, labeled unanalyzed until analysis runs
Serato DJ Pro, TraktorAdapters that read their files from the command line (Serato: libraries from before Serato 4.0); writers are Partial (synthetic files only)
djay ProAdapter that reads its library, from the command line
Works

Beat sync, master tempo and quantize

Beat Sync locks to the bar by default, so the downbeats line up. Master Tempo keeps the key when you change the tempo. Quantize snaps cues, seeks and loops to the beat grid, and every beat on screen comes from real analysis, never a guess.

See it lock

Works

Hear the next track in your headphones

Click any track's mini-waveform in the library and it plays through your headphone cue without loading a deck; with only one output, such as laptop speakers, the MIX dial blends what is in your headphones into the main output, like the cue/master knob on a mixer, so the room can hear the preview. Rest the pointer on the row for half a second first and it starts in 28 ms; a cold click took 743 ms, mostly decoding. One measured run, Wed 16 Sep 2026.

The preview story

BDeck B / Beyond

Most deck and mixer controls are typed commands.

The same commands come from the screen, the keyboard or an AI assistant, so you can automate prep or build your own tools. You never need any of this to DJ. For the curious, the features page shows how scripts and AI assistants drive the app.

Deck 1 / channel stripIllustration
Cue
Transport
Sync
Hot cue

  

Illustration. These controls only print the command shape the app's dispatcher accepts (performance-ipc.svelte.ts); nothing is sent anywhere. Value ranges follow mixer-types.ts.

“Ground up - we just want to build this to be as easy to mod [while] having great performance, advanced beatgrid functionality, stems etc.”
Alex Foster, who builds Open DJ, in a prompt to the build agents, Tue 18 Aug 2026.
A+BHow it was built

One person and an agent build system.

The library layer dates from April. The performance rig was started in July and built mostly in August and September, by a build system where issues in the private repository are the queue, agent workers build in parallel, and changes merge through automated test and review gates. A commit count is a volume signal, not a measure of quality; the gates and their exceptions are on the build page.

10,554commits since Wed 1 Julmain at 487fa677d7, Fri 2 Oct
2,097merged pull requests since Wed 1 Jul (merge commits plus squash merges)main at 487fa677d7, Fri 2 Oct
88.6%of those commits landed in Aug and Sepmain at 487fa677d7, Fri 2 Oct
A+BThe house rule

If it does not work yet, it says so.

A control that is not built yet still looks right, but it does nothing, and its tooltip says it is not built yet. A missing waveform is drawn as a dash, never a guess. The app is built never to show made-up data.

This site does the same: drawings of the app are labeled as illustrations.

A+BAlpha

Bring your library. Keep your rekordbox.

Open DJ 1.0 alpha is for macOS on Apple silicon only. Alpha means early: try it at home on your own library, and keep rekordbox for paid gigs for now. The download page says exactly what you get and what is still missing.

A / Parity
Beyond / B { type: 'crossfader', value: 0.50 }