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:

LayerPathWhat lives there
Domainsrc/domain/Tracks, cue points, duplicate/consistency logic; plain C++, no I/O.
Applicationsrc/application/Ports (interfaces) and use cases that orchestrate the domain.
Infrastructuresrc/infrastructure/The actual format/OS adapters: Rekordbox PDB/ANLZ, OneLibrary SQLCipher, Engine via libdjinterop, backups, media detection.
Front endssrc/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:

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:

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:

ComponentLocationLicense
libdjinteropthird_party/libdjinterop/LGPL-3.0-or-later
Kaitai Struct C++ runtimethird_party/kaitai_struct_cpp_stl_runtime/MIT
zlib (Windows builds only)third_party/zlib/Zlib
Rekordbox format specs & generated parserspecs/, src/infrastructure/rekordbox/generated/EPL-2.0 OR MPL-2.0 OR LGPL-3.0-only (used under LGPL-3.0-only)
Breeze iconssrc/gui/qml/icons/breeze/LGPL-3.0-or-later
Seabass logosrc/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.