For developers
Seabass is a personal project, not a company product.
Seabass's home is on KDE Invent; GitHub is used as a mirror for wider reach.
Architecture
Roughly hexagonal, domain logic doesn't know about Qt, SQLite, or any particular file format:
| Layer | Path | What lives there |
|---|---|---|
| Domain | src/domain/ | Tracks, cue points, duplicate/consistency logic; plain C++, no I/O. |
| Application | src/application/ | Ports (interfaces) and use cases that orchestrate the domain. |
| Infrastructure | src/infrastructure/ | The actual format/OS adapters: Rekordbox PDB/ANLZ, OneLibrary SQLCipher, Engine via libdjinterop, backups, media detection. |
| Front ends | src/cli/, src/gui/ | The seabass-cli CLI and the Seabass Qt6/QML GUI, both built on the same domain/application layers. |
File formats
Three independent library formats are involved, at three different levels of how well-documented they are:
-
Rekordbox
export.pdb/ANLZ: the Kaitai Struct specs and generated C++ parser are vendored, unmodified, from Deep-Symmetry/crate-digger (specs/*.ksy). Seespecs/README.md. -
Rekordbox 7 OneLibrary
exportLibrary.db: SQLCipher-encrypted, with no public spec. Reverse-engineered and cross-checked against a real exported stick plus pyrekordbox's source, documented in detail (including what's confirmed vs. merely inferred) in docs/onelibrary-format.md. -
Engine DJ
m.db: handled via the vendored libdjinterop library rather than a from-scratch parser.
Standing on the shoulders of giants
Seabass didn't reverse-engineer any of this from a blank slate. It exists because other people already did the slow, patient work of figuring out how Rekordbox and Engine DJ actually store data on a stick, usually with nothing to go on but a hex editor, a pile of exported files, and a lot of trial and error. Specifically:
-
Deep-Symmetry's crate-digger
(James Elliott / @brunchboy,
with @henrybetts,
@flesniak and
@GreyCat): the
export.pdb/ANLZ format specs Seabass vendors directly, the result of years of Rekordbox format archaeology. -
pyrekordbox
(Dylan Jones): the closest thing to a reference implementation for
OneLibrary's SQLCipher schema, cross-checked at every step while
writing
docs/onelibrary-format.md. -
libdjinterop:
Engine DJ's
m.dbhandled by a real, dedicated library instead of a from-scratch reimplementation. - Mixxx: the open-source DJ software whose own years of Rekordbox reverse-engineering, and whose GPL/EPL licensing precedent (see Licensing below), this project leans on directly.
None of the above are affiliated with Seabass or endorse it; they're just the reason building it was possible at all.
Testing
Unit tests live in tests/ and run via CTest, one binary
per area (cue codecs, PDB row writing, sync planning, fuzzy matching,
backup stores, QML pages, and so on). Above that sit two things that
touch reality: a committed, anonymized export of a real DJ library
under tests/fixtures/, so the format code stays honest
against something messier than hand-built fixtures, and a release rig
(tools/rig-*) that drives real USB sticks end to end,
backing up, restoring, editing and comparing, before a release goes
out.
See docs/testing.md for the suite, and for how to submit your own library to widen the set of real-world stick layouts it gets tested against.
The command line
The GUI is built on seabass-cli, which is scriptable on
its own:
seabass-cli scan --rekordbox --engine # read-only report + duplicate cue consolidation
seabass-cli sync --rekordbox --engine # match tracks, reconcile cues
seabass-cli backups --rekordbox --clean # list the backups it made, prune the old ones
seabass-cli anonymize ... # a de-identified copy of a library, for bug reports
Leave off the path after --rekordbox/--engine
and it auto-detects a plugged-in stick. Run
seabass-cli --help for the full reference.
Licensing
Seabass's own code is GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL, the licence KDE projects use. Documentation is CC-BY-SA-4.0, build files BSD-2-Clause, test fixtures CC0-1.0. The repository is REUSE compliant: every file carries its copyright and SPDX identifier, and CI fails if one doesn't.
Bundled components keep their own licences:
| Component | Location | License |
|---|---|---|
libdjinterop | third_party/libdjinterop/ | LGPL-3.0-or-later |
| Kaitai Struct C++ runtime | third_party/kaitai_struct_cpp_stl_runtime/ | MIT |
| zlib (Windows builds only) | third_party/zlib/ | Zlib |
| Rekordbox format specs & generated parser | specs/, src/infrastructure/rekordbox/generated/ | EPL-2.0 OR MPL-2.0 OR LGPL-3.0-only (used under LGPL-3.0-only) |
| Breeze icons | src/gui/qml/icons/breeze/ | LGPL-3.0-or-later |
| Seabass logo | src/gui/qml/icons/ | CC-BY-SA-4.0 |
A binary build is therefore distributed under GPL-3.0.
Licence texts: LICENSES/ in the repo.
Built with AI assistance
Most of Seabass's code, and this website, was developed assisted by AI alongside manual review, testing against real exported stick data.
Contributing
This is a one-person project at an early stage, without a formal contribution process yet. If you've found a bug, hit a format Seabass doesn't handle right, or have a stick that reveals something the format docs above got wrong, opening a GitHub issue is the best way to reach me.
Contributions are welcome, but a couple of honest expectations: please make them high-quality, not drive-by AI slop, and be respectful of my time; I do have a life (or at least I like to pretend I do). A low-effort or low-quality PR or issue may just get ignored, or earn you a spot in my personal blackhole. That said, I try to be a friendly person, and I try to recognize respectful, well-meant feedback in whatever shape it shows up in.