What Segue is
Segue is a bridge between two DJ ecosystems that refuse to talk to each other. You build your library in Serato: crates, cue points, beatgrids, the muscle memory of years. But the club’s booth is Pioneer CDJs, which only read Rekordbox-shaped data. Segue reads the Serato library and produces exactly what the other side needs: a rekordbox.xml, a direct write into the Rekordbox 6 database, or a CDJ-ready USB stick with no Rekordbox in the loop at all.
The positioning is deliberately narrow. Serato to Rekordbox, one direction, without starting over.
The problem
The industry workaround is a whole evening. Export XML from Serato, import into Rekordbox, let it re-analyze everything, export a USB, walk to the booth. Every time a crate changes, you do it again. It duplicates your library, loses fidelity on cues and grids, and treats an hour of file-shuffling as normal.
Segue collapses that into one step and keeps the fidelity.
The architecture, and the one boundary that matters
Segue ships as a single app but runs as three processes: a React UI in a webview, a Tauri (Rust) shell, and a Python sidecar that does all the actual work.
The decision the whole system hangs on is that the UI and the Rust shell never touch DJ data. They talk to the sidecar over plain HTTP on localhost, with progress streamed as Server-Sent Events. No Tauri invoke() commands, no IPC channels, just a local HTTP API.
That single interface boundary is the point. Every layer can be swapped without touching the others: Tauri could become Electron, the UI could become a CLI, the sidecar could become a hosted service. And all the domain logic, every byte of Serato, Rekordbox, and Pioneer format parsing, lives in Python. So the command line and the desktop app run the exact same code.
The hard part: writing Pioneer’s format from scratch
The XML and Rekordbox-database exporters are the easy wins. The differentiator is the USB path, and it is the hardest code in the project.
A CDJ-ready stick means writing Pioneer’s export.pdb from nothing: DeviceSQL’s page format, 4096-byte pages with a heap growing forward and row offsets growing backward, nine interlinked tables, two different string encodings. Then per-track analysis files carrying the beat grid and hot cues, colors snapped to Rekordbox’s fixed palette. This is the code that lets Segue bypass Rekordbox entirely instead of being one more XML converter.
It is also the highest-risk code in the app, so every analysis file is round-tripped back through a real Rekordbox parser before it is written. And if the USB already holds a library, Segue reads it, keeps the playlists that do not collide as raw byte copies, and only replaces what overlaps. It does not stomp.
The scar: three commits to survive macOS
The story I would actually tell in an interview is the codesigning saga. macOS 15 (Sequoia) tightened its hardened-runtime checks and started killing the app on launch, because the Python framework the sidecar unpacked at startup did not share a signature identity with the bootloader.
The fix took three consecutive commits and changed how the app is built. Stop unpacking Python at runtime (onefile to onedir, so the framework lives permanently beside the bootloader). Find and re-sign that framework explicitly in CI, because the default pass missed it. Sign every Mach-O in the tree individually instead of trusting a recursive deep-sign. Then add a four-second smoke test that boots the signed sidecar in CI, so a broken relink dies in the pipeline instead of on a stranger’s laptop.
Most of the engineering scars in a desktop app are not in the features. They are in the twenty steps between “it works on my machine” and “it launches for someone I have never met.”
Decisions I would defend
- Domain logic in one language. CLI users and desktop users run identical code paths. The shell is transport, nothing more.
- HTTP over IPC. Pushing the complexity out to a clean HTTP boundary cost a hardcoded port. It bought independent, swappable layers.
- No reverse conversion. Writing Serato’s undocumented binary formats is a trust bomb. Sharp positioning beats being a commodity bidirectional tool.
- Do not stomp existing libraries. The USB writer merges instead of overwriting, and copies untouched rows as raw bytes so nothing gets re-encoded and corrupted.
What it taught me
Segue is mostly not about DJing. It is about the seam between two systems that were never designed to meet, and the discipline of writing an undocumented binary format that another vendor’s hardware has to accept without complaint. The interesting work was making each layer ignorant of the others, and making the riskiest code prove itself before it ever reaches a user.