Skip to content
Pikkol0Public

About

Free Rekordbox USB export without Rekordbox: download music (YouTube, SoundCloud, Spotify playlists), analyse BPM, key, beatgrid and cues, and write a USB drive ready for Pioneer CDJ / XDJ (export.pdb, OneLibrary). Windows, macOS, Linux.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

DJSync logo

DJSync — free Rekordbox USB export for Pioneer CDJs, without Rekordbox

Find music, put it on your Rekordbox USB drive, ready for Pioneer CDJs — without going through Rekordbox.
One file on your USB drive, any computer: Windows, macOS, Linux.
Version française · Website · Download

Version Python License Platform

🙏 Thanks / Merci
A huge thank you to Tazyh for helping with testing.
Un grand merci à Tazyh pour son aide aux tests.


Why DJSync?

  • How do I export music to a USB drive without Rekordbox? DJSync writes the drive's Rekordbox library itself (exportLibrary.db for recent players, export.pdb for older ones, ANLZ waveforms), from a portable app that runs straight from the drive.
  • Is there a free Rekordbox alternative for CDJ / XDJ? For preparing a USB drive: yes. DJSync is free and open source (GPL-3.0), with no account, no subscription and no server.
  • How do I get YouTube or SoundCloud tracks into Rekordbox? Search or paste a link (YouTube, SoundCloud, Spotify or Deezer playlists): DJSync downloads, tags, analyses (BPM, key, beat grid, cues) and adds the tracks to the drive or to the Rekordbox collection of your computer.
  • Can I analyse BPM, key and beat grid without Rekordbox? Yes, locally, and you can fix the grid and set hot cues, loops and memories in DJSync.

What DJSync does

DJSync is a portable desktop app — it runs straight from the USB drive, on any Windows, macOS or Linux computer, nothing to install — that works on a drive exported by Rekordbox:

  • Search and download from YouTube Music (results as you type, preview before downloading), or import a link from Spotify, YouTube or SoundCloud (single track or playlist).
  • Write directly into the drive's library: exportLibrary.db (OneLibrary, recent players) and export.pdb (older players), with date added and artwork.
  • Analyse tracks without Rekordbox: BPM, beat grid, key (shown in Camelot notation), Pioneer waveforms (ANLZ files), in the background (Library ▸ Not analysed). Tracks already analysed by Rekordbox are never changed.
  • Manage the library like a mini Rekordbox: playlists and folders, drag and drop, track order, harmonic filter, built-in player with waveform.
  • Fix a shifted beat grid (also straight from the player) and set hot cues, loops and memories (pads A–H in the Rekordbox colours, 1–16 beat loops, names), without Rekordbox.
  • Find and merge duplicates, decided by comparing the audio (not only the title), with the hot cues of the version you choose carried over to the one you keep.
  • Clean up track info (title, artists, album, year, genre, artwork) with suggestions from Deezer, reviewed track by track on a before / after view.
  • Update the Rekordbox collection of this computer too (Rekordbox 6/7, master.db): same features as for a USB drive — download into the collection, playlists and folders, analysis, beat grid, title/artist, duplicates. DJSync only writes while Rekordbox is closed.
  • Copy playlists between libraries (USB drive ↔ this computer, drive ↔ drive) with their analysis, complete missing metadata of existing tracks, add a memory cue on the first downbeat.
  • Backups and one-click restore: the drive's original library (before DJSync) is kept forever, plus manual backups and yearly / monthly / weekly / recent ones (DJSync_Backups/ on the drive). DJSync can also remove itself from the drive (Settings ▸ Drive backups).
  • Eject the drive safely from DJSync.

English interface (French available in Settings; other languages can be added — see below), 20 colour themes, zoom from 80 to 200 %. Fast Qt interface (PySide6), no animations.

⚠️ Personal project, not affiliated with Pioneer DJ / AlphaTheta. The drive formats are reverse-engineered: keep a copy of your drive and close Rekordbox while DJSync writes to it.

Videos

Full tour — every menu (3 min, 1080p) Short — the main workflow (1 min 30, vertical)
djsync-tour.1.mp4
djsync-short.1.mp4

Click a picture to play the video. Demo library with made-up artists; regenerate them with python tools/tour_video.py tour.mp4 and python tools/teaser_video.py short.mp4.

Screenshots

Library Beat grid editor
DJSync library: playlists on the left, tracks with key, BPM and source, built-in player with waveform DJSync beat grid editor: Rekordbox-style waveform, downbeats, hot cue pads A–H and loops

Download

Your computer Download
Windows 10 / 11 ⬇ DJSync.exe — one file
macOS 11+ (Apple silicon) — beta ⬇ DJSync-macOS.dmg — drag DJSync onto your drive
Linux x86-64 — beta ⬇ DJSync-Linux-x86_64.tar.gz — DJSync folder

Put it on your USB drive and open it: nothing to install on the computer, FFmpeg and the JavaScript runtime needed for YouTube are included, settings stay on the drive. DJSync tells you when a new version is out.

How light is it? Rekordbox needs 2 GB free on your computer to install. DJSync fits on your USB drive in ~250 MB (~300 MB with its backups) — less than 25 tracks in MP3 320 — and runs on any computer you plug the drive into.

Step by step: quick installation guide (français) · pre-releases and older versions: all releases.

Help test DJSync (beta)

Testers wanted — especially with real players (CDJ / XDJ, not a controller). Download the latest pre-release, follow the tester guide (français) and send a test report or a bug report with the log file.

Run from source

Requirements

  • Python 3.10+ (developed and tested with 3.12)
  • FFmpeg (ffmpeg): download, m4a playback, analysis. In the PATH, or the folder set in Settings ▸ FFmpeg.
  • A JavaScript runtime for YouTube downloads (yt-dlp): Deno, Node.js or QuickJS-NG (qjs, 2.5 MB — the one shipped with the builds).

Steps

git clone https://github.com/Pikkol0/djsync.git
cd djsync
python -m venv .venv
.venv\Scripts\activate          # Windows   (Linux/macOS: source .venv/bin/activate)
pip install -r requirements.txt
python app.py

Building the executables

The Build GitHub workflow (.github/workflows/windows.yml, run it from the Actions tab or by pushing a v* tag) builds Windows, macOS and Linux. macOS: DJSync.app (Apple silicon), ad-hoc signed, in a .dmg (dmgbuild: background telling to drag it onto the USB drive). Not signed by Apple: the first launch needs Open Anyway once; DJSync then lifts the quarantine of its copy on the drive and relaunches from it (portable.leave_translocation). Linux: the DJSync folder (built on Ubuntu 22.04 for an old glibc), tar.gz. Both ship an audio-only FFmpeg (TARGET=native packaging/build_ffmpeg.sh) and QuickJS, and are self-tested. Windows: a single DJSync.exe: a 150 KB launcher (packaging/launcher, C + miniz) with the application folder zipped behind it. On first launch (or after an update, or if the folder was deleted) it extracts the application into the hidden .djsync/app next to itself, keeps .djsync/data (settings), then starts it — later launches are instant. Unlike a PyInstaller one-file exe, nothing is unpacked to the computer at every launch. The workflow tests the result like a user would (DJSync.exe alone in an empty folder, self-test of the application). Optional code signing with the SIGN_CERT_PFX / SIGN_CERT_PASSWORD secrets. By hand:

pip install pyinstaller
pyinstaller packaging/DJSync.spec              # -> dist/DJSync/ (DJSync.exe + _internal)
packaging/build_ffmpeg.sh out/                  # (Linux, mingw-w64) -> ffmpeg.exe, ffprobe.exe -> dist/DJSync/tools/
packaging/build_launcher.sh out/                # (Linux, mingw-w64) -> launcher.exe
python packaging/pack_single_exe.py out/launcher.exe dist/DJSync 1.0.0 DJSync.exe

Download engine updates

yt-dlp is never updated on its own. When a download or a link import fails in a way that looks like "YouTube changed", DJSync offers once to install the new version (official wheel from PyPI, SHA-256 checked, installed in the settings folder — the exe is not modified, no restart needed, failed downloads are retried). Settings ▸ Download engine checks / installs by hand and goes back to the previous version.

First steps / Premiers pas

English

From an empty drive to the decks, in six steps.

  1. Prepare the USB drive (once) — Use a drive formatted in FAT32 (or exFAT for recent players). Until DJSync can prepare a blank drive itself, export one playlist to it once from Rekordbox: this creates the PIONEER folder that DJSync then fills. Plug it in: it shows on Home.
  2. Find and download — Type a title or an artist in Search (or paste a YouTube, SoundCloud or Spotify link on Home), listen, then press Download at the end of the line and choose the playlists.
  3. Analyse — Downloaded tracks are analysed in the background: BPM, beat grid, key and waveforms, like Rekordbox. Library ▸ Not analysed lists what is left.
  4. Set your cues — Library ▸ the Grid and cues button of a track: hot cues A–H, loops and memories, beat grid to adjust. Nothing is written before Save.
  5. Check — Home shows whether the drive is up to date for older players (export.pdb). Diagnostic finds duplicates, low-quality files and missing files.
  6. Eject — Always press Eject in DJSync before unplugging the drive: everything is written and checked. Then plug it into the decks.

Français

D'une clé vide aux platines, en six étapes.

  1. Préparer la clé (une fois) — Utilisez une clé formatée en FAT32 (ou exFAT pour les platines récentes). Tant que DJSync ne sait pas préparer une clé vierge lui-même, exportez-y une fois une playlist depuis Rekordbox : cela crée le dossier PIONEER que DJSync remplit ensuite. Branchez-la : elle apparaît sur l'Accueil.
  2. Chercher et télécharger — Tapez un titre ou un artiste dans Recherche (ou collez un lien YouTube, SoundCloud ou Spotify sur l'Accueil), écoutez, puis bouton Télécharger en bout de ligne et choix des playlists.
  3. Analyser — Les sons téléchargés sont analysés en arrière-plan : BPM, grille, tonalité et formes d'onde, comme Rekordbox. Bibliothèque ▸ Non analysés liste ce qui reste.
  4. Poser ses cues — Bibliothèque ▸ bouton Grille et cues d'un son : hot cues A à H, boucles et mémoires, grille à ajuster. Rien n'est écrit avant Enregistrer.
  5. Vérifier — L'Accueil dit si la clé est à jour pour les anciennes platines (export.pdb). Le Diagnostic trouve les doublons, les fichiers de mauvaise qualité et les fichiers introuvables.
  6. Éjecter — Appuyez toujours sur Éjecter dans DJSync avant de retirer la clé : tout est écrit et vérifié. Ensuite, branchez-la sur les platines.

Quick use

Shortcut Action
Ctrl+K Search a track or paste a link, from anywhere
Ctrl+1 … Ctrl+6 Home, Search, Library, Downloads, Import URL, Settings
Ctrl+F Search / filter field of the page
Space Play / pause
Ctrl+→ / Ctrl+← Next / previous track
F1 Help

The in-app Shortcuts & help button has a short guide.

Command-line tools (read-only)

python -m djsync.db.diagnose E:            # check a drive's database
python -m djsync.db.pdb.check E:           # check export.pdb
python -m djsync.analysis track.m4a        # analyse a file (BPM, key, grid) without writing anything
python -m djsync.analysis --compare E:     # compare DJSync's analysis with Rekordbox's on a drive

Languages

Everything (interface, error messages, logs, command-line output) is written in English. Other languages only translate the interface: djsync/i18n/fr.py is a dictionary key -> text; a missing key simply falls back to English, so a translation can be partial. To add a language, copy fr.py, translate what you want and register it in djsync/i18n/__init__.py.

Code layout

app.py                  entry point (python app.py)
djsync/
  core/                 YouTube Music search, download (yt-dlp), Spotify import, duplicates, Camelot
  db/                   USB drive: exportLibrary.db (SQLCipher) in library/, export.pdb in pdb/, artwork
  analysis/             BPM, grid, key, waveforms, ANLZ files (numpy + FFmpeg only)
  audio/                built-in player, artwork
  ui/                   Qt interface (PySide6): app, controller (ctrl/), views (views/), table, dialogs
  i18n/                 English (en.py, reference) and French (fr.py) texts
tests/                  pytest tests (fake drive, synthetic tracks)
tools/                  development tools: screenshots, logo export
packaging/              PyInstaller spec + icon
docs/                   technical notes (in French for now)

Tests

pip install pytest
python -m pytest -q                 # everything, UI included (Qt "offscreen": no display needed)

Tests use neither the network nor a real drive: generated Rekordbox database, synthetic tracks. A test also checks that no French text is hard-coded outside the translation file. Screenshot tool (no display needed): python tools/ui_screenshots.py shots --sizes 860x560,1280x800 --lang en --dialogs.

Technical notes (French)

Version history

Version Changes
1.4.0-rc.5 Fixes after the rc.4 tests. Playlists: tracks can be reordered by dragging again (a line shows where they will land, the list scrolls near the edges); the button bar adapts to the window width (secondary buttons become icons, then move to the ☰ menu: no more cut-off text); Save order only shows when the order changed; on the computer, Remove from the Rekordbox collection instead of Delete from drive. Watched folder: its playlist is called Watched folder (with an eye icon), tracks that came from it show an eye in the Source column, the setting says what it is for, and the first import says so with a link. Settings reorganised: the big Downloads card split into Search, Format and quality (quality table folded) and YouTube; watched folder in Libraries, audio delay in Analysis and playback, light mode in Performance, DJSync split into Updates, About and This installation; labels and buttons aligned. Download engine: Check for an update no longer makes the page jump and says when it checked; Back to the built-in version instead of a button that did nothing. Search: faster when typing quickly (search has its own queue, view counts only for the visible rows, older ones dropped); Size column in the high-quality search (the Views column showed the size). Also: Estimated quality (instead of Real quality: it is an estimate from the spectrum); analysis after a batch of downloads counts the whole batch from the start (no more going back to zero); collapsed sidebar a little bigger; checkboxes no longer cut at 125–150 % display scaling; Track page button and menu for SoundCloud imports (free download links hidden in the description); fewer harmless pyrekordbox lines in the logs; builds pinned to the PySide6 version the tests ran with.
1.4.0-rc.4 Fixes after the rc.3 tests. Watched folder: files dropped in it are imported again on Windows (the folder was compared as text and the watcher reset itself at every check). Soulseek: the State column shows what really happens (connecting, queued at the peer with your position, next peer, new search) instead of "Downloading 0 %"; when no spare peer is left, one new search is made before giving up with a clear message; a warning when no UPnP router answers (VPN, router setting) or when sharing is off; far fewer library lines in the logs. Real quality: tracks from YouTube (and the Opus signature) are capped at about 192; the quality table shows the measured bitrates. First launch: a YouTube quality step (M4A recommended, best stream with its size trade-off); startup windows open one after the other, and a new version is announced by a banner. Import from a link: real checkboxes (header box, Shift + click, Space), a visible Free Download button, record-label smart links (ffm.to, lnk.to…) no longer shown as free downloads, columns fitted to their content. High-quality search: faster (Internet Archive pages in parallel, results as each source answers), archive.org order and relevance kept. SoundCloud: clear messages for unreadable browser logins and private tracks, the stream is downloaded instead. Sidebar: when collapsed, laid out correctly at launch, rings no longer cut, one ring per activity; the activity card opens Downloads.
1.4.0-rc.3 Fixes after the rc.2 tests. Soulseek: only one download at a time from the same user (users send one or two files at a time: the others waited in their queue and were cut after 60 s), the other tracks go to another user who has the same file or wait their turn; Improve ▸ Replace all now keeps the other users found as spares; a user who never answers is left after 20 s, a user who has you in their queue is waited for, with your position shown; the listening port is written in the log. Real quality: a codec cut-off with a flat noise floor above it (a YouTube stream saved as WAV) is no longer taken for lossless, and a track from YouTube is never shown lossless; measurements are redone once. Settings: the real-quality table has drawn cells and no longer jitters when scrolling; the Space used card is no longer rebuilt while scrolling. Sidebar: when collapsed, the active button is centred and the library and activity cards become a centred icon with a progress ring. Also: Show in Explorer opens the track's folder (it opened Documents when the path had spaces).
1.4.0-rc.2 Fixes after the rc.1 tests. SoundCloud playlists: every track now shows its title, artist and duration (only the first ones did: « Untitled · 0:00 »); tracks protected by SoundCloud (DRM, frequent for label releases) are marked and their YouTube Music version is used to listen and download. Soulseek: a download stuck at 0 B/s for 60 s, refused or banned switches by itself to the same file at another user; your download folder is shared by default (many users refuse people who share nothing) and the panel says so; results show each user's speed; a search with no answer just after connecting is sent again, and « No results » is no longer shown while searching. YouTube: « confirm you are not a robot » (common with a VPN) now gives a clear message with a button to choose the browser where YouTube is open; failed tracks are retried once it is chosen, and YouTube downloads pause after several refusals. Real quality explained: Settings ▸ Download shows what each source really gives in MP3 equivalent; MP3 is no longer labelled « 320 » and a warning says converting does not restore lost quality. Diagnostic: the Improve tab opens (it showed Missing files); a page left with a task running (real quality, duplicates…) comes back as it was. Columns: Import URL and Improve remember column widths like Search; in Downloads the Title no longer shrinks to 3 letters behind a huge empty column. Also: right-click a track ▸ Show in Explorer / Finder; Space used: other files on the left of the bar, caches in their own colour; Settings: the side panel highlights the section actually shown.
1.4.0 Better sources: SoundCloud original files and artists' free downloads, a High quality search (Internet Archive, Audius, and Soulseek if enabled, with a warning), Buy (WAV / FLAC) links, a best YouTube stream option, Deezer playlists. Your own files: add files or folders from the computer, a watched folder imported by itself, FLAC converted to AIFF / WAV for older players. Real quality measured from the spectrum and Improve my library (better version found, gain shown, safe replacements in one click). Space used on the computer, colour, zoom, Playlists column, light mode.
1.3.2-rc.7 Beat grid and cues: the mouse wheel or a vertical touchpad swipe now zooms the main waveform (Shift + wheel or a horizontal swipe scrolls); zoom from 0.5 s to 2 min. Library (computer): playlists open without waiting behind downloads. Downloads: refused before downloading while Rekordbox is open (no more duplicate files).
1.3.2-rc.6 Beat grid and cues: the waveform is drawn in one block (~40× faster): no more freeze every ~8 s during playback. Library: playlists no longer stay on "loading" after a series of downloads (the computer library reopens itself if it was closed).
1.3.2-rc.5 Beat grid and cues: no more freeze of the cursor and sound every ~8 s during playback. Python's memory clean-up now runs in small, regular steps and never does a full pass while a track plays. If the screen still freezes during playback, the log records what was blocking it.
1.3.2-rc.4 Beat grid and cues: no more small freezes of the cursor and sound every few seconds during playback. On Windows, checking whether Rekordbox is open took up DJSync for a moment every 4 s; it now reads the process list in one quick call. Duplicate checks slow down while a track plays, and a slow drive check is noted in the log.
1.3.2-rc.3 Fixes after the rc.2 tests. Analysis: tracks whose file is missing (often on an unplugged USB drive) are left out of every analysis, whatever button starts it, and are no longer counted as failed; the end message names the absent drive with a link to the Diagnostic. Library: missing tracks show a warning icon with the reason, and a Missing files entry lists them. Missing files: check boxes, Check those on E: and Remove the checked, also for tracks on a disconnected drive. Duplicates: the versions that can be read are compared with each other even when the best one is missing; the label says why a version was not compared. Beat grid and cues: smoother playback (overview kept in memory, fewer redraws, precise timer, slightly larger audio reserve) and a more detailed frame log. Settings: the wheel scrolls the page instead of changing a list or a counter you pass over. Diagnostic reopens on the last tab used. First launch opens maximized; clearer welcome text.
1.3.2-rc.2 Fixes after the rc.1 tests. Settings on one scrolling page, the side list jumping to each section; the version list and its install button sit in the DJSync card (no more Choose a version… window); the Default settings notice with Undo shows properly; the shortcut option is back in the DJSync section; long labels wrap. Library: action buttons are visible again (Grid and cues, Download, Analyse); Not in a playlist has its own icon and colour, a reminder in All tracks, and dragging a track onto a playlist works (hovering a playlist no longer opens it). Search: no empty column on the right. Analyse page: files not found (often on an unplugged USB drive) are left out with the reason, time left during the analysis, failure reasons in the log. Missing files: the absent drive is named (“on E:, not connected”). Duplicates: Back keeps the tool running (only Close closes it), compact labels, a readable message for a damaged file. Player: no scrolling waveform above the player any more (only in Beat grid and cues). Welcome: bigger, language confirmed with a button, highlighted GitHub star. Windows: DJSync comes to the front after the loading screen. Round shapes stay round at any zoom. FAQ removed.
1.3.2 Beat grid and cues: smooth playback (no more freezes or crackles), the mouse wheel zooms the waveform (Shift + wheel scrolls), zoom from 0.5 s to 2 min. Library: missing files marked and gathered in a Missing entry; playlists of the computer library open at once, even during downloads; columns and Not in a playlist entry. Analysis: tracks whose file is missing are set aside (never counted as failed); clearer Analyse page with progress. Duplicates: readable versions compared even when one file is missing; merge with Undo; preview of each version's cues. Downloads: refused before downloading while Rekordbox is open (no duplicate files). Settings: one scrolling page; the wheel no longer changes a value while scrolling; Choose a version…. Getting started: welcome on first launch, window maximised the first time, Diagnostic reopens on its last tab. Also: missing files removable in bulk; faster Rekordbox detection on Windows; release notes as a list.
1.3.1 Stable (known issue: Space used does not work yet for the computer library, it does for USB drives; fixed in 1.4.0). Library columns: every metadata column can be shown (genre, year, label, bitrate, sample rate, rating, colour, plays, created, size, comment, location) from the Columns button; checked columns stay visible (the table scrolls sideways instead of hiding them), and their order, widths and choice are remembered. Genre and label in export.pdb: Rekordbox and older players show the genre of tracks added by DJSync (drives written before are caught up). Settings side panel: General · Libraries · Download · Analysis · Feedback and privacy · DJSync, a search field across all settings, last section remembered. Space used (Settings ▸ Libraries, or click the free space on Home): music, analyses and artwork, Rekordbox databases, DJSync backups, application, caches; empty the caches, keep only the latest restore points (the original state is never removed). Diagnostic in tabs: Missing files (replace with an identical track of the library, relink a moved file, download a clean version or remove the entry; tracks on a disconnected drive are flagged), Duplicates (format, bitrate and sample rate of every version, best quality marked and proposed, clean version to download), Poor quality, Uniformise; the missing-file message links to it. Suggestions: tracks that mix well after the playing or selected one (compatible key, close BPM, half and double tempo), to listen, add to the open playlist or drag onto a playlist; the Harmonic filter gains a BPM range. Player controls centred in the window, one Filters button in Search showing the active filters, a shared colour scale (good, fair, warning, problem) independent of the accent colour. Also: memory loops in the Beat grid and cues page (Memory loop button, or right-click a memory ▸ 1–16 beats), written like Rekordbox; thanks to the people who helped, at the top of this page, in Settings ▸ DJSync and in Feedback; an error that looks like a file held by Rekordbox ends with advice to close it, and error messages are wider, selectable, can be copied and stay until closed; DJSync.exe leaves out Qt files it never uses (software OpenGL, QML, virtual keyboard, other languages' Qt texts), for a smaller download and a faster first launch from a USB stick. Settings tidied up: an Advanced section for the rarely needed settings (FFmpeg, download engine, export.pdb, drive letter, audio delay), folded while all is well; a Check everything button (DJSync and engine versions, FFmpeg, drives, export.pdb brought up to date, Diagnostic), nothing installed without a click; Uninstall DJSync always in Settings ▸ DJSync, also when DJSync runs from the computer (program, settings, caches and log removed; music, Rekordbox libraries and, unless asked, master.db backups kept). rc.2: the Suggestions panel no longer crashes on Mac when changing tracks quickly; a native crash now leaves its trace in the log (sent with Feedback); dragging a column border in the Library resizes that column (the Title no longer absorbs it) and a thin line marks each border; active loops (a memory loop that engages by itself when playback reaches it, one per track) written to the analysis files and to master.db; duplicates show the real quality of a version to download first (« ≈ 128 kbps (YouTube Music) · saved as MP3 320 »); Space used on the computer counts the whole Rekordbox collection, its analysis folder and master.db.
1.3.0 Stable: on macOS in full screen, opening Duplicates or the Diagnostic no longer shows the desktop (the key badge of each version briefly opened as a window of its own before being placed in the page); on macOS, confirmation and Download to… windows no longer slide in as sheets, which held the sound for 120–170 ms (short gap while listening); deleting a pad whose loop is playing, or removing its loop, exits the loop at once (resizing it makes the playing loop follow); a test now opens every page and fails if any window flashes. rc.9: macOS diagnostics: for 3 s after a page opens, the log records every other window that appears and disappears (with timings), and when DJSync loses focus or leaves full screen, to find what sends a full-screen DJSync back to the desktop; late audio is no longer reported after the sound card was stopped (false delays of several minutes) and the log gives the worst delay; tracks without an audio fingerprint are counted instead of logged one by one. rc.8: Back from Beat grid and cues returns to the page you came from (Duplicates, Diagnostic, Analyse), as you left it; tracks re-analysed from the Library show in the Analysis list while they are analysed; Play / Pause no longer restarts the Beat grid and cues track when that page was left open behind another tab; on macOS the log now records an extra window opened with a page and late audio, to track two Mac-only issues; code of conduct, contributing guide, security policy and pull request template. rc.7: one Duplicates tool — the Diagnostic no longer has its own duplicates list, its Duplicates line opens the tool, which can now also replace every version with a clean download; a jump while playing (click on the waveform, hot cue, player bar) is heard at once — the playing track is kept decoded in memory (up to 12 min) and the sound card is no longer reopened (Windows, Linux); a drive unplugged and plugged back in before DJSync noticed is reopened by itself with one message, instead of "disk I/O error" and an error report. rc.6, players: analysis files of the tracks added by DJSync now go in the same folders as Rekordbox's (PIONEER/USBANLZ/… named from the track's path, like Rekordbox; ANLZ0001 when two tracks share a folder); drives written by an earlier version are tidied up when opened (files copied, both databases updated, old files removed once export.pdb is up to date; Rekordbox's own tracks are never touched); export.pdb track rows written by DJSync now carry the same values as Rekordbox's (per-track id field, constant fields, no bit rate for m4a, duration truncated); faster releases (tests run next to the builds, FFmpeg and Python packages cached). rc.5: one Duplicates tool (the Diagnostic opens it to merge): groups listed at once, audio checked group by group afterwards (cached), parts and versions (Pt. 3 / Pt. 7, remix, live…) no longer grouped, Not a duplicate takes one track out and is remembered (Set aside list to undo, Full detection); Rekordbox open only shown when Rekordbox itself is running; waveforms now look like Rekordbox's (height follows the real level instead of being stretched to the top, colours and previews recalibrated on tracks analysed by both, drawn 6.7 ms later like Rekordbox; re-analyse to update); sound no longer late on Windows: the sound card now keeps ~80 ms ahead instead of ~600 ms, the real delay is measured to place the cursors, and a jump (click on the waveform, hot cue, player bar) is heard at once (macOS unchanged; set Extra audio delay back to 0 unless you use Bluetooth headphones). rc.4: Clean up track info no longer squeezes and stretches the tracks while results arrive; with the Beat grid and cues page open, the play button of the bottom player (and Space, media keys) plays that page's track from its cursor; pause cuts the sound at once (the sound card's buffer, up to ~1 s with Bluetooth headphones, is dropped) and resumes from what was heard; Test… next to the audio delay setting (Settings ▸ Appearance) plays a click at 120 BPM to set the delay by ear, now up to 2 s; on Windows the DJSync splash with its exact version takes over from the executable's one before Qt starts, so it stays centred at 150–200 % display scaling; a new accent colour is applied everywhere at once (Home tools included), without restarting; a drive pulled out without eject gives one clear message, also when it is noticed by the drive watch, and no follow-up error. rc.3: the version is shown while DJSync starts (native splash on Windows, splash on macOS/Linux, where the logo is no longer drawn twice too big); the Windows launcher window says Setting up DJSync x.y.z on this drive or Updating DJSync A → B, in the Windows language only, sized for 125–200 % display scaling, with a percentage; downloaded tracks are analysed in the background by default, with one setting for the USB drive and one for the computer library (Settings ▸ Analysis); when export.pdb is not up to date, the drive card on Home says what is missing and offers Update export.pdb; Beat grid and cues page: pads and labels sized for 125–200 % display scaling, bar numbers and cue letters on separate rows, the player shows the whole track in 3 bands (click or drag to move through it), optional Fixed cursor in the middle (remembered); the playback cursor follows what you actually hear (smooth, no longer ~0.2 s ahead), with an extra delay setting for Bluetooth headphones; Exit loop button on the grid page (playback carries on, no cut); without the audio file the grid page shows Rekordbox's 3-band waveform; Clean up track info adds tracks without jumps and shows Search differently results as two-line cards; a drive pulled out without eject gives a clear message instead of "disk I/O error"; a missing audio file is reported for the library actually open (drive or computer), marked in the duplicates and on the grid page; export.pdb error messages in English. rc.2, older players (export.pdb): a drive freshly prepared by Rekordbox no longer becomes "corrupted" for Rekordbox after DJSync adds tracks (index page of a new table, repaired by itself on drives written by rc.1); export.pdb is now reconciled with exportLibrary.db as a whole (order, removals, renames, deleted tracks, edited titles), so a write that failed (Rekordbox open on the drive, drive pulled out) is caught up at the next write, when the drive is opened, or on Eject, which warns if something is left. Hot cues, loops and memories in the Beat grid and cues page (right-click a track ▸ Beat grid and cues…): eight pads A–H in the Rekordbox colours under the waveform; an empty pad sets a cue on the nearest beat (Shift: exactly at the cursor), a set pad plays from it; right-click for a 1–16 beat loop, a name, 16 colours, move or delete; drag a cue's letter on the waveform; memories at the cursor; Suggest cues fills the free pads only. Nothing is written before Save; written like Rekordbox (ANLZ files on the drive, djmdCue on the computer), originals backed up. Clean up track info (Uniformise v2, Home tile): each track on two lines, Now and After; click a field to edit it, colour shows what changes and what is uncertain; artwork removed on hover, uploaded or dropped; tracks one after the other, Enter validates and the next one comes; Search differently for a wrong title; better Deezer search (YouTube ids removed, featured artists used, several queries). Duplicates by the audio: versions found by the title are compared by their sound (same track, variant with a part in common, or different and taken out of the group). Hot cues carried over: when merging duplicates, choose whose hot cues to keep; they are lined up on the kept version by the audio offset, also after a replacement from the Diagnostic.
1.2.4 Older players (export.pdb): drives exported by Rekordbox 7 and older exports with big playlist pages are no longer refused ("next free page outside the file", "inconsistent counters"): DJSync updates their export.pdb again and catches up what was missing when the drive is opened. A file stored several times in an old export, or two playlists whose names differ only by upper/lower case, no longer lead to tracks added twice to a playlist. A drive that Rekordbox has not prepared yet now appears on Home with what to do, instead of not showing at all.
1.2.3 Send my logs (Feedback tab): the log with personal paths hidden, a report on the drive (file system, PIONEER/rekordbox files, export.pdb check) and, if ticked, the drive's library files zipped — for tests and problems on the decks. Error reports: after an unexpected error, DJSync offers to send a report to the author (setting: ask each time, always, never). Drive format: the Home card shows the file system and warns when older players cannot read it (exFAT/NTFS: NO USB / E-8307 on an XDJ-1000), and when export.pdb is missing or not up to date. Mac feedback: one click on a playlist name ticks it in Download to…, no more audio "rollback" when a window opens, macOS media keys and Now Playing, Duplicates / Diagnostic / Analyse open as pages of the main window, scrolling waveform with a centred playhead in the player (like Rekordbox). Developer: python -m djsync.db.pdb.compare compares two export.pdb files.
1.2.2 Edit info (right-click a track, the player or Tools): title, artists, album, year, genre and artwork (keep, pick one found on Deezer, an image from the computer, or none) — the audio file is never touched. Uniformise a playlist or the whole library: clean titles (no feat., no Official Video), artists separated by commas with guests taken from the title, album / year / genre / artwork filled in when empty; a review page where nothing is written until you validate track by track and Save, progress kept between sessions, suggestions unticked for tracks not downloaded by DJSync. Playlists by genre (off by default): a DJSync ▸ Genres folder, one playlist per genre or group of genres, kept up to date as you download or edit, even once moved or renamed; tracks you add yourself are never removed. Developer: voice-over and subtitles for the tour video (tools/narrate.py), French tour (--lang fr).
1.2.1 Feedback tab: report bugs, ideas and comments from the app, several remarks per sending, each with its type, text and up to 3 screenshots (capture of the DJSync window, image picked or dropped), technical details and the end of the log without personal paths if wanted; sent by e-mail through a small Google Apps Script of the author (tools/feedback/, setup in docs/FEEDBACK_SETUP.fr.md), otherwise a pre-filled GitHub issue. Library: choose the columns shown (right-click a header), widths and the sort of each playlist remembered, # wide enough for 700+ tracks, new Source column (YouTube Music, YouTube, SoundCloud…). Playlist picker as a folder tree with search, new playlists created in the selected folder. Search: Everything / Title / Artist / Album selector (an artist's tracks, not tracks named after them), albums opened in one double-click with all their tracks ready to download, maximum duration and "hide tracks already owned" filters. Grid editor zoom (Ctrl/⌘ + wheel, pinch, − / +). Duplicates: playlists of each version, Start / Middle listening. Progress bars in each download row, overall download progress, estimated progress of the track being analysed, one Activity card in the sidebar.
1.2.0 macOS (Apple silicon, .dmg) and Linux builds (beta), built and self-tested by the Build workflow next to Windows; on macOS, the first launch lifts the quarantine by itself and relaunches from the drive. DJSync tells you when a new version is out (Settings, once a day; test versions also see pre-releases). Grid backups and the grid waveform cache are capped. GPL-3.0 license, tester guide (computer, Rekordbox, players) and issue forms. Presentation videos (tools/tour_video.py, tools/teaser_video.py). rc.3: drive restore points (Settings ▸ Drive backups), remove DJSync from a drive, clearer computer-library errors. rc.4: update DJSync from the app (Settings ▸ DJSync: download, SHA-256 check, restart into the new version; stable or test channel), exact version shown everywhere (a test build now sees the next test build); m4a beat grids no longer early in Rekordbox (measured −32.5 ms on 52 tracks, now compensated: re-analyse m4a tracks, Tools ▸ Analyse selection ▸ Re-analyse), ½-beat button in the grid editor, half-beat count in --compare; Rekordbox saving master.db in place is picked up before DJSync writes; click-to-seek bar, spinner while a track loads, Space after Listen and keyboard media keys; collapse/expand button for the sidebar; playlist picker with search and full-height list; dialogs stay above the window on macOS (full screen too); French fixes; About (license, third-party components, credits).
1.1.0 Library diagnostic (Home ▸ Diagnostic, one button per library: USB drive and computer): duplicates, low-quality files (MP3 < 192 kbps, AAC < 112 kbps, < 44.1 kHz) and bad sources (music video, live, lyrics, visualizer, sped up…). For each problem: keep one of the versions, or download a clean version (YouTube Music, SoundCloud as a fallback) that replaces the old one(s) in all their playlists, at the same position, and is analysed again; Ignore is remembered. Beat grid editor: no more old waveform for 2 s, the Rekordbox-style waveform is cached (instant on reopening). python -m djsync.analysis --compare also reads this computer's Rekordbox collection (--compare local --under E:\Contents), ignores tracks analysed by DJSync itself and gives 95 % confidence intervals (procedure). Presentation video tool (tools/demo_video.py).
1.0.0 First release: ONE file to download, DJSync.exe (prepares itself on first launch, repairs itself if moved or deleted, keeps settings across updates), published as a GitHub release with its SHA-256 and notes built from this table. Everything from 0.1 to 0.5: search and download from YouTube Music, Spotify/YouTube/SoundCloud import, USB drives (exportLibrary.db + export.pdb) and the Rekordbox library of the computer, BPM/key/grid/waveform analysis, beat grid editor, duplicates, playlist copy between libraries, metadata completion, memory cue, eject, yt-dlp updates on demand.
0.5.1 Windows CI: full test suite passes on Windows (280 tests); failing tests are reported as annotations on the run page; GitHub actions moved to Node 24.
0.5.0 Portable build that looks like a single file (DJSync.exe + hidden .djsync folder), audio-only FFmpeg and QuickJS instead of full FFmpeg + Deno (≈ 250 MB less), GitHub workflow for the Windows build with optional signing. Player on miniaudio instead of pygame (streams, nothing decoded in full). yt-dlp updated only on failure or by hand (Settings ▸ Download engine), with rollback. Eject button; when running from a USB drive, the host computer's Rekordbox library is opened only after asking (remembered per computer). Copy a playlist to another library (USB ↔ computer, drive ↔ drive) with its analysis reused, not recomputed. Complete missing metadata (Deezer) of existing tracks. Memory cue on the first downbeat (ANLZ + database). Download format M4A (original) or MP3 320, optional loudness normalisation. Analysis memory peak reduced (≈ -30 % on a long mix, same results).
0.4.0 Rekordbox library of this computer (master.db, Rekordbox 6/7): opened automatically when no drive is plugged in, or from Home / Settings. Downloads go to Music/DJSync (configurable) and into the collection with analysis (ANLZ files under share, named after the track UUID), artwork (640/240/80 px), album, genre, label, year; playlists and folders (masterPlaylists6.xml kept in sync), beat grid, title/artist, duplicates, delete. Never writes while Rekordbox is open; master.db copied before each change. Built on pyrekordbox.
0.3.1 Polished interface: icons on buttons, menus, tables and the sidebar, rounded cards, key pills, larger search fields, messages as small pop-ups; explanations moved to tooltips (ⓘ) and needless texts removed. New "Downloads & analysis" page: downloads table + analysis table (every unanalysed track, search in the whole library to re-analyse, beat grid editor icon on each analysed track).
0.3.0 New Qt interface (PySide6) replacing customtkinter: native widgets, much smoother scrolling, resizing and table updates. Zoom and theme colour apply instantly without rebuilding the window; the zoom no longer follows the window size. Plainer look: flat dark theme, square corners, no shadows or animations, no per-row artwork or placeholder rows. Beat grid editor: drag the listening cursor on the waveform, "Bar starts here" (a downbeat exactly on the cursor), shift by ±1/±10/±100 ms, BPM ×2 / ÷2. Rekordbox 3-band waveforms (.2EX): track previews now look like Rekordbox's own instead of blue (re-analyse older tracks). Downloads complete album, year, genre, label, track number and ISRC (Deezer, can be turned off). Same features as 0.2.4 otherwise; UI tests run without a display.
0.2.4 Background analysis: Library ▸ Not analysed section with "Analyse all" / "Stop", progress card in the sidebar, the rest of the app stays usable. Player: beat grid button and track options (title/artist, analyse again, compatible keys, show in library). export.pdb: track updates no longer eat the free space (in-place rewrite, deleted rows reclaimed), clearer "export.pdb is full" message. Beat grid editor is now a page of the main window (the separate window vanished or froze the app on Windows). Fixes: dialogs sized for the zoom and kept on screen, key pill now shown right after analysis.
0.2.3 Windows start-up fix: the main window stayed invisible after the splash screen, and the splash shrank to a corner (DPI awareness set too late).
0.2.2 Window always opens inside the screen (saved size/position clamped, maximised state remembered); lightweight splash screen at launch (also a native splash for the Windows executable).
0.2.1 Fully English software: error messages, logs and command-line tools included; French kept as an optional interface translation (partial translations fall back to English). English README, obsolete console demos removed.
0.2.0 New interface: Home + omnibar, search as you type, "All tracks", Camelot pills, drag and drop onto playlists, harmonic filter, player previous/next + waveform, zoom and small windows, English by default, logo per colour. On-demand analysis, beat grid editor, duplicates tool, help and shortcuts. Code split (library, controller).
0.1.6 Local BPM / key / ANLZ waveform analysis, date added and artwork in both databases, calibration on a real drive (MP3 encoder delay).
0.1.x YouTube Music search and download, Spotify/YouTube/SoundCloud import, writing to exportLibrary.db then export.pdb, library and playlists, player, portable mode.

Releasing

djsync/__init__.py holds the version. Add its row to the table above, then push a tag: git tag v1.0.0-rc.1 && git push origin v1.0.0-rc.1 publishes a pre-release to test on real hardware; git tag v1.0.0 && git push origin v1.0.0 publishes the release. The Build workflow refuses a tag that does not match the version, runs the tests on Windows, macOS and Linux, builds the three downloads and attaches them to the release.

Roadmap

  • Beta with testers, on real players (recent CDJ/XDJ reading OneLibrary, older ones reading export.pdb)
  • Compare the analysis with Rekordbox on 300–500 varied tracks (procedure)
  • Signed executables (no Windows SmartScreen / macOS Gatekeeper warning)
  • macOS on Intel Macs; Linux as a single AppImage file
  • Public release

Contributing

Bug reports, deck tests, ideas and pull requests are welcome: see CONTRIBUTING.md (how to report, what never to attach, how to run the tests). Please follow the code of conduct; security problems go through SECURITY.md.

Credits

License

DJSync is free software under the GNU General Public License v3.0: you can use, study, share and modify it; modified versions you distribute must stay under the GPL, with their source code. Bundled components keep their own licenses: see THIRD_PARTY_NOTICES.md.

Only download content you have the right to use.

About

Free Rekordbox USB export without Rekordbox: download music (YouTube, SoundCloud, Spotify playlists), analyse BPM, key, beatgrid and cues, and write a USB drive ready for Pioneer CDJ / XDJ (export.pdb, OneLibrary). Windows, macOS, Linux.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages