A+BPlans

Roadmap

For a DJ, in plain words. Being built now: controllers and audio output choice in the Mac app, through a new app shell; a one-deck player that runs a playlist unattended. Next: a library light that only counts tracks expected on this Mac. Later, with no date: headphone cue on a second audio device in the Mac app; making stems in the installed app; drum and bass and other fast styles analyzed at their usual tempo; Color FX dials that switch effect; checks before a set and a watchdog during it. Nothing here is checked as shipped; some items already have code merged that has not been verified yet. Deck A is the work in progress; Deck B is the longer view.

Not yet

Generated Sat 3 Oct 2026 from main of the private development repository (music-dj-tools) at 487fa677d7 by tools/roadmap.py. Sources: .planning/REQUIREMENTS.md and PARITY-TODO.md at that commit, and the GitHub REST API for issue state.

A+BHow this list is made

One stated rule.

The project keeps its plans as requirements, each with a scope: v1, v1.1, v2 or v3. This page shows the open ones that change what a DJ can do or see, grouped by area. Which requirements a DJ would notice, and the plain title each one gets, are editorial calls written into the generator; the column an item lands in is not. Requirement ids are in the small print under each item.

101open requirements at this commit
31plans shown
47left out, with a reason
Now: being worked on. Next: planned, not started. Later: no date.

The rule behind the columns. Now: v1 or v1.1 scope, and an issue or pull request it cites is open on GitHub. Next: v1 or v1.1 scope with nothing open cited yet, or a parity-board item that cites open work. Later: v2 or v3 scope. Build tooling, test infrastructure, project process and pricing policy are left out, and so is anything for Windows or Linux, because the app is for macOS on Apple silicon only.

ADeck A / Now

In progress now.

In the v1 or v1.1 scope, with at least one issue or pull request it cites still open on GitHub when this page was generated. 3 plans.

AreaPlanOpen work
Playing a setA one-deck listening player that runs a playlist unattended
One deck, autoplay on, no mixer and no stems. A track that fails to load is skipped with a notice and the next one plays.

PERFMODE-15 / v1

2 open issues
The Mac appA new desktop shell for the Mac app, with controllers and signed in-app updates
The 1.0 alpha runs in macOS's own web view (Tauri and WKWebView), which has no Web MIDI. The plan is to move the app to Electron, whose shell gives the page Web MIDI for controllers and its own choice of audio outputs, with updates checked against the app's code signature. The minimum macOS version would become 13. It is not in the 1.0 alpha.

ELECTRON-08, ELECTRON-09 / v1.1

1 open pull request
The Mac appLibrary mode held to a memory and CPU budget
Library mode has a written memory and CPU budget. A measurement that passes the current test harness is still owed.

PERFMODE-14 / v1

1 open issue
A+BNext

Next.

In the v1 or v1.1 scope with no open issue or pull request cited, or an item from the parity board that cites one. Planned, not started or not tracked yet. 3 plans.

AreaPlanOpen work
Your libraryA library health light that only counts tracks expected on this Mac
Tracks that live on another machine, on an unmounted drive or on a streaming service are listed in the detail, and do not turn the light amber.

HEALTH-01 / v1

None open
Your libraryFirst-run setup that handles awkward folders honestly
Folders the system refuses to list, folders that do not exist, odd file names and corrupt files are each named for what they are, and setup never dead-ends.

SETUP-22 / v1

None open
Agents and the command lineThe whole first run, drivable from the command line
The same setup steps, in the same order and with the same refusals, through the app's command line, so an agent can set up a fresh install.

SETUP-24 / v1

None open
BDeck B / Later

Later.

In the v2 or v3 scope. Intent, not a promise, and deliberately without dates. 25 plans.

AreaPlanOpen work
Playing a setA performance mode for live sets
Checks before a set that can refuse with a named reason, a watchdog during it, and a report after it.

PERFMODE-02, PERFMODE-09 / v2

1 open issue
Playing a setNoticing a deck that has gone silent
A deck that claims to be playing but is silent is stopped with a notice saying why, and autoplay carries the set on.

AUDIOLIVE-09 / v2

None open
Playing a setSeveral Open DJ machines, and Ableton Link peers, on one clock
One shared tempo and phase across machines, a sync lane above deck 1, launches quantized to the shared bar, and a second screen that controls the machine playing out.

LINK-01, LINK-02, LINK-03, LINK-04, LINK-05, LINK-06, LINK-07, LINK-08, LINK-09 / v2

8 open issues
Playing a setColor FX dials that switch effect
A filter dial that can become reverb or a reverb and filter combination, and a filter with more character on fast turns.

MIXUX-02, MIXUX-05 / v2

2 open pull requests
Headphones and outputsHeadphone cue on a second audio device in the Mac app
Cue to headphones on one device while the room plays from another, in the installed app as well as in a browser.

CUEOUT-07, CUEOUT-08, CUEOUT-14, CUEOUT-22 / v2

1 open issue
Headphones and outputsBluetooth headphones for cue
Pairing, delay calibration and recovery when the headphones drop out, without ever interrupting the main output.

CUEOUT-12 / v2

1 open issue
Headphones and outputsA separate booth monitor output
A third output for booth monitors that carries the room mix.

CUEOUT-13 / v2

None open
Headphones and outputsSending a previewed track to the room, in time
A deliberate gesture that tempo-matches a preview and drops it in on the master's next downbeat.

CUEOUT-16 / v2

None open
Your libraryWaveform previews with the same band balance as rekordbox's
Open DJ's own browser previews drawn on the same per-band scale, so its rows and rekordbox's rows look alike.

NATIVE-22 / v2

None open
Your libraryArtwork for tracks that rekordbox has none for
Cover art from the file itself, an image in the same folder, or an online lookup the decks can ask for.

PARITY-14 / v2

1 open issue, 1 open pull request
Your libraryFolder imports that read title, artist and genre in the Mac app
Folder imports in earlier Mac builds came in without title or artist. A fix that reads tags with a reader shipped inside the app is in the code; it has not been checked in an installed app yet.

PARITY-15 / v2

1 open issue
Your libraryDownload a track or a selection for offline use
A download action in the track menu that adds to and removes from what is kept on this Mac.

CAT-07 / v2

1 open pull request
Your libraryA 10,000-track library listing inside a set time budget
The full listing and playlist pages measured against a target on the reader's own clock.

LIBM-120 / v3

2 open issues
Beatgrids, tempo and keyKey changes inside a track
Key changes marked as segments on the bar grid, from Open DJ's own analysis.

NATIVE-05 / v2

1 open issue, 1 open pull request
Beatgrids, tempo and keyOpen DJ's own beatgrids as the default
Steadier grids fitted to the detected beats, made the default only after blind listening tests and a downbeat agreement target against rekordbox.

NATIVE-14, NATIVE-16, NATIVE-18, BEATMAP-03 / v2

None open
Beatgrids, tempo and keyFast genres keep their usual tempo
Open DJ's own analysis has reported some fast tracks at half tempo, such as drum and bass at 87 BPM instead of 174. This plan keeps them at their usual tempo, using the track's genre tag where it has one. It changes Open DJ's own analysis only: tracks imported from rekordbox use rekordbox's BPM and beatgrid by default today, and making Open DJ's grids the default is a separate plan.

NATIVE-17 / v2

None open
StemsMaking stems from the installed app
Stem separation run from the Mac app itself, without a source checkout.

STEM-39 / v2

None open
StemsStems in MP3 or FLAC
Stem bundles whose parts are MP3 or FLAC files load, not only WAV.

STEM-03 / v2

None open
The Mac appOpening in Library mode by default
Once Library mode has passed its budget, a cold start would open there.

PERFMODE-12 / v2

None open
The Mac appA menu-bar helper
A small menu-bar companion for library tasks, and a helper that keeps the Mac's load down during a gig.

PERFMODE-08, PERFMODE-17 / v2 and v3

None open
The Mac appA Mac App Store edition
A sandboxed store build that says plainly which features it cannot offer.

SAND-01, SAND-02, SAND-03, SAND-04, SAND-05, SAND-06 / v2

None open
Agents and the command lineUpdating the installed app from the command line
An agent with only the installed app could check for and apply an update.

AGENT-13 / v2

None open
Sets and sharingUploading a recorded set to SoundCloud
One flow with a timestamped track list and a reminder about the rights to the music.

SET-06 / v2

2 open issues
Sets and sharingBroadcasting a set through VirtualDJ
Research found no documented way for another app to broadcast into VirtualDJ's service, so this waits on VirtualDJ.

SET-07 / v2

2 open issues
Sets and sharingRecovering a synced edit that lost to another machine
When two machines edit the same row, the losing version would be kept for 14 days and could be restored.

CLOUDSYNC-26 / v2

1 open issue
BDeck B / Source

Check it yourself.

This page is generated, not written by hand. The generator, its inputs and the GitHub responses it used are kept together, so every Now claim can be re-checked.

regenerate this pagetools/roadmap.py
# fetch issue state over REST, save it, render site/roadmap.html
uv run tools/roadmap.py --repo <music-dj-tools clone> --sha 487fa677d7
# re-render from the saved responses only
uv run tools/roadmap.py --repo <music-dj-tools clone> --sha 487fa677d7 --from-saved

Now is work under way for this release line, Next is planned for it but not started, and Later is the direction after that, with no dates. Parity board: 37 open items read, 0 shown, because an item from it needs an open issue or pull request to appear. Requirement scope is the project's own; a plan can move between columns when a requirement is rescoped.

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