Djay Database and Cue Point feedback from MixMasterG

Hi everyone,
Great thread — and the MixMasterG video is a goldmine. The chapters on how djay identifies tracks (artist + title + length), the grants system, and the silently growing database is top.
@tfmeier — you asked whether anyone else is working on reading the djay database: I am, for a different but related goal. I mix techno, and djay has no phrase analysis (see the long-standing “Can we have phrase analysis?” suggestion thread, which I’ve been following and voting on). So I want to build a small companion prep tool, strictly read-only: read the BPM and beatgrid that djay computes for each track, and generate phrase grids (16/32 beats from the first downbeat) and prep sheets for my sets. This would be especially valuable for Apple Music tracks, where external analysis tools can’t help because of streaming.
Since our projects overlap on the same unknown — the structure of the djayMediaLibrary database (YapDatabase on SQLite, blobs probably NSKeyedArchiver?) and when djay writes to it — I’d be happy to share findings. I’m about to start a careful read-only exploration of the database on macOS.
Has anyone here (or MixMasterG himself, if he reads this) already decoded the collections and blob format? Any pointers would save a lot of time. And of course, an official read API from Algoriddim would make all of this unnecessary — I’ve voted for that suggestion too.
I’ll report back with whatever I find.
Yannick

Nb: I am using Claude code for this project

2 Likes

Sounds interesting. Thanks for sharing @Yan

1 Like

Quick follow-up — connecting some dots between threads.
@kyleawayan’s djay-pro-bridge (see his thread “Created a ShowKontrol-like deck monitoring tool for djay on macOS”) reads real-time deck state from djay Pro through the macOS Accessibility API — title, artist, key, BPM, BPM%, elapsed/remaining time, play/pause, per deck. No database access at all.
@tfmeier — this might solve your problem more directly than watching the database: for MIDI triggering from live deck state, reading the UI sidesteps the whole “when does djay write to its tables” question.
For my phrase counter, it becomes the foundation: elapsed time × effective BPM = current beat, displayed as beat/bar/phrase with a countdown to the next 16/32-beat boundary. Works even with Apple Music tracks. The missing piece remains the first downbeat position, which lives in the database beatgrid — so my question about the current blob format still stands.
On that front, some prior art on GitHub: parabolala/djtools and xsaardo/Djay-Pro-2-Export-Tools both decode the djay Pro 2 database (tracks, cues, BPM). Has anyone tested these on current djay Pro versions?

If you are interested to try :

Thanks @Yan, sounds like an interesting project.

I’ve had a look at the djay-pro-bridge but that doesn’t work for me as I use djay on the iPad. Also I’m not sure how well it would be able to identify a cue point on a compressed waveform. For now I’ll try to continue down the database path. Note that in my solution database access is RO but that still doesn’t solve the question of knowing which track was loaded last on which deck

I created a bit of a summary of the current architecture of my setup so far with the help of Cursor. I don’t have a repo yet but can send it to you to see if it provides any help


Hi tfmeier,
claude Ai response for what you are searching

Before going down the “read djay’s database externally” road (which I’d also looked at — see below) — there’s a much simpler path that might get you what you actually need: djay Pro supports Ableton Link, on both Mac and iPad, and so does Lightjams.

Link broadcasts tempo + beat position + phase live over your local network to any other Link-enabled app — no jailbreak, no sandbox workaround, no reverse-engineering, and it works identically whether djay’s running on the iPad or a Mac:

  1. In djay: Settings → General → Sync mode → Beat and Tempo Sync, then Settings → Ableton Link → enable it (iOS: steps here; Mac: here). Both devices need to be on the same Wi-Fi network.
  2. In Lightjams: enable its Ableton Link session — it exposes beat count, tempo (BPM), and phase (current beat position) directly to its own scripting/command-line functions (midi.clock.bpm, midi.clock.beat, midi.clock.sawtooth, etc. — Lightjams’ own dev added these specifically for tempo-locked lighting, per this thread).

No bridge app needed — Link is peer-to-peer over the network, nothing to route or configure beyond enabling it on both sides. (For what it’s worth, I also checked: djay has no MIDI Clock output at all, Link is its only sync protocol, and there’s still no public djay API in 2026 — so Link genuinely looks like the best/only current option here, not something I’m overlooking a better alternative to.)

This won’t give you djay’s own named cue points directly (Link is tempo/beat-position only, not “hot cue 3 fired”), but for triggering lighting changes off the music, it might actually be more useful than reading cue points: you’d build your light cues in Lightjams itself, keyed to beat count (e.g. “every 32 beats, trigger scene X”) rather than depending on cue points you set in djay ahead of time. That also sidesteps the “how do I know djay updated the database” problem entirely, since you’re not touching djay’s data at all — just its live Link broadcast.


(v1 draft, for reference — the database-reading approach, if Link’s tempo/phase-only data isn’t enough and you specifically need djay’s own stored cue point positions/names):

Since Algoriddim confirmed djay can’t send event-triggered MIDI/OSC natively (earlier thread), reading the database externally (read-only) was the only other path I could see — I’ve been down that exact road recently for a similar project (a phrase-analysis companion tool for djay on Mac). A few things that might help:

On “how/when djay updates the database” — you likely don’t need to detect that at all. djay’s main SQLite database runs in WAL mode, designed for safe concurrent reads while djay is writing. Polling it directly on an interval (e.g. once a second) works reliably — no need to watch for a specific update signal.

The harder problem is almost certainly the iPad’s sandbox, not the database format. On macOS, external read access works because you can reach djay’s SQLite file directly on disk; iPadOS won’t let another app reach into djay’s container the same way without jailbreaking. A couple of things worth checking if Link above doesn’t cover your need:

  • Whether djay’s iCloud sync (Settings → enable for djay, syncs cue points + loop regions across devices with the same Apple ID) gets you close enough — though heads up, I found mixed reports on this forum about its reliability, and it only syncs when you load a different track afterward, not live during playback, so it may not suit a real-time trigger use case anyway.
  • Screen-mirroring the iPad to a Mac (AirPlay/QuickTime, no jailbreak) + OCR/computer-vision on the video feed — inelegant, but sidesteps the sandbox since you’re reading pixels, not the filesystem.
  • If djay Pro on Mac is ever an option for this particular rig, external read access is much more tractable there — happy to share specifics.

For reference, I open-sourced the read-only database/cue-point reverse-engineering I did (binary format details, extraction code, the WAL-mode read-safety finding, etc.) here: GitHub - yanchau/djay-phrase-tool: Live phrase analysis companion for djay Pro (macOS) — read-only, reverse-engineered · GitHub

Good luck with the Lightjams integration — sounds like a fun build.

Thanks for that analysis, @Yan I’ll do a deep dive in this

1 Like

Man, thank you! I really wish MixMasterG would timestamp his livestreams.

I’m glad MixMasterG spoke about this issue. I’ve been watching Djay for years, buying it in it’s early phases of growth but never switching… because Traktor was stable and Djay’s issues were too many.

This issue was one that made me aware of the metadata in my files, how it affects the size of my .mp3’s, and how it affects Djay’s library… ultimately leading to me avoiding .mp3’s altogether.

This still concerns me… Djay using the track name, artist name, and song length - rather than file path. But, I don’t expect this will change any time soon since it’s been Djay’s way since the beginning.
Such an odd choice though… I still don’t understand the benefit. Anyone have insight into why Djay made this choice?

I don’t know the reasons for the decision, but if you’ve ever switched streaming services, having your hot cues and saved loops magically appear in the new service for songs of the same name is pretty nice.

1 Like

Totally… that could be it!

Being designed from the ground up to support streaming services (and sync cues+loops across platform) would necessitate identifying the song in another way than the industry standard file path… instead by artist, song name, length… makes sense!

Yeah, exactly. djay was the first DJ software to support streaming music so that may have been a factor in the design development decision making process.

1 Like

It seems like a clear decision now. Though, I think now that Djay has come so far, becoming a professional tool, it might be good to split the way both the streaming library and local library are accessed…

…keeping the streaming library as-is and then making the local library rock-solid by using absolute file paths.

I know that’s extremely long term thinking and a huge change so I won’t hold my breath. But it would alleviate a lot of these issues like MixMasterG is talking about, and others talking about “Ghost files”.

Personally, I don’t use streaming services. I care most about having a solid and reliable setup with all my audio files downloaded in lossless.

Thanks for the additional feedback @skymakai

1 Like

Why can we not have both?

  • Personally, the default should be file based (even for streaming where there is a unique network URL for each online track.
  • Then have an option to match the title - artist - album to preserve the cue points and other metadata.

There is no reason we cannot have it both ways, aside from the fact it was done one-way in the first place.

boom, had it both ways, no regrets” - Captain Holt

2 Likes

Thanks for the input @Michael_Wisniewski

Well, as you can see in the video, using title - artist - time (DJay uses song time) for cue points still causes problems, particularly when it ignores the file path. The video shows two issues happening… one, the cues are confused and lost when loading several different files with the same title - artist - time metadata… and two, Djay seems to continuously scan the local drive looking for audio files, bloating the library size - unless you limit the “grant” to a particular folder.
Djay reduces I/O by only refreshing metadata on search or loading of a track, rather than loading of the library (like other DJ software). You would think that using title - artist - time would reduce disk I/O… but it doesn’t. It’s problematic.

This is all not even mentioning that song time in MP3 files can be affected by metadata, causing songs to duplicate or disappear if the metadata is edited outside of Djay.

So, like other standard DJ software, the change would need to make the URL/File-Path the default for local files, only using title - artist - time for streaming services… which of course would be limited to the folders where those streaming services store files.

I agree with this. Make everything path based, both the Local files as well as the streaming services, Like Michael states, every song in a streaming service has a unique url. Example

https:// open. spotify. com /track/4t0UsYzmmmZRMTWn77jiGF?si=db5046e96fe84d18

is the link to Robin S - Show me love. Then it could be stored in the database as:

Spotify:https:// open. spotify. com / track/4t0UsYzmmmZRMTWn77jiGF?si=db5046e96fe84d18

Without the spaces, they are added to keep the the link visible in this post.

Having the option to ‘search‘ in your collection for possible the same song, to copy the cue points etc over, is a good idea. Another option is when you load a song without cue points and there is another song with the same artist title and length that you get the option or popup “This song might be the same as ‘Other song‘, would you like to copy cue points etc“ with yes and cancel

Only relying on only the Artist, Title and time combination is very risky and error prone:

  • I have tracks where I have the normal version, Instrumental and acapella version. All have the same Artist, Title and track length. The filenames are different, in the comment section of the file I have the specific version name.
  • I have lots of duplicate tracks in my collection, where the version is exactly the same only the length differs a couple seconds. The fade out starts a bit earlier, or the dafe out is a bit longer. Luckily i don’t push these duplicates to my ‘DJ ssd drive‘

After checking the video and reading te other post about the ghost files. I stopped using Djay and moved back to recordbox. Managing your collection, with your cue points takes lots of time. I make regular backups of my collection and Dj app ‘databases‘. I don’t want to get those data lost, then the video of Mixmaster G is not making me confident to spend my time on managing my library in Djay

1 Like

Thanks for the additional feedback @EwoutdeBoer