What it does
$ aede scan ~/Music
→ 18 402 tracks · 1 512 albums · 604 artists · 52 days
$ aede query "genre:metal year:1990..1999 -label:earache"
$ aede doctor — missing tags, duplicates, incomplete albums
$ aede check — has anything been damaged since it was written?
$ aede copy /Volumes/Card --query "loved" --compress opus
-
A graph, not a table
Artists, albums, tracks, labels and genres, linked by who did what on what. Click a drummer and see their forty appearances — the model was built for that from the first line.
-
A real query language
Ranges, negation,
OR, any depth of them:(artist:ozzy OR artist:dio) album.rating:>=4 played:0. Every result is a selection, so CSV, JSON and M3U all apply to it. -
Is it still intact?
aede checkverifies the checksums your files already carry — FLAC frame CRCs, Ogg page CRCs — and remembers the verdict, so the hour it costs is paid once. -
What you think of it
Favourites, one to five stars, free-form tags and notes kept exactly as typed, in a file of their own that no rescan can destroy — and searchable like everything else.
-
Out to a player
aede copywrites a selection to a card or a phone, keeping the folder tree, adapting names the filesystem refuses, and encoding on the way out when a 64 GB card will not hold a FLAC library. -
It never writes to your files
Not a tag, not a name, not a folder. Tagging is Picard's job and it does it well; this reads what is there. Two dependencies, no database daemon, and it reaches the network only when you ask it to.
Roadmap
Each milestone is a position, not a promise of a date. The reasoning behind every one of them is written down in the design notes — most of it exists to explain a refusal.
-
M0 The catalog done
Scanning, the graph model, statistics, diagnostics, and command-line navigation of the lot. Eleven formats read by hand-written parsers, so a truncated file is a message rather than a panic.
-
M0.5 What you write done
Favourites, ratings, notes and tags in an annotation store keyed so that a scan can never destroy them; play history; the query grammar with ranges, negation and
OR; saved queries; import and export of all of it. -
M0.6 Getting music out done
aede copyto a player, a card or a drive, keeping the tree; companion files chosen by the catalog rather than by extension; names adapted to what the volume actually accepts, probed rather than guessed; verification and resume; encoding through ffmpeg on the way out. Plus spectrograms, playlists written into the album folders, and lyrics read from tags and.lrcfiles. -
M1 Identification under way
MusicBrainz for relations and credits, AcoustID for badly tagged files, Cover Art Archive for artwork. Band line-ups as dated relations, release types, and the completeness report that says which albums are missing from the shelf. Decided before a line of it is written: a fetched value sits beside the tag, never on top of it — attributed, removable, and able to say that two sources disagree.
-
M2 The API
An HTTP server with JSON and WebSocket, frozen early because it is the contract between the core and every future client.
-
M2.5 Other servers' languages
Subsonic and OpenSubsonic first — eighty-odd existing clients on every platform, which is the shortest path from no mobile client to thirty of them. Jellyfin afterwards, and timeboxed. Both as translations over the API, never as a second core.
-
M3 Playback
Local output, a queue, gapless playback and loudness normalisation (EBU R128). The decoder it needs also brings the FLAC MD5 check, which verifies the audio itself rather than the container.
-
M4 The network
Remote playback endpoints:
slimprotofirst, since it opens a fleet of existing devices without inventing anything, then UPnP/OpenHome for commercial streamers.
Explicitly out of scope: RAAT and “Roon Ready” certification are proprietary and licensed — there is no technical path to them.
Getting it
One executable. Unpack it, put it on your PATH, run it. Nothing is installed
and nothing runs in the background.
$ tar xzf aede-0.1.0-macOS-AppleSilicon.tar.gz
$ ./aede scan ~/Music
$ ./aede stats
Builds for macOS (Apple Silicon and Intel) and Linux are on the releases page, each with a checksum beside it. Or build it yourself — Rust 1.89, two dependencies, and the first build is the only step that needs the network:
$ git clone https://github.com/craft-and-code/aede.git
$ cd aede && cargo build --release
No Windows build yet. It compiles there, but catalog paths are
/-separated by design while the scanner stores the platform's own spelling,
which makes everything folder-shaped wrong — album grouping, folder restrictions,
playlists. Twelve tests say so, and
the design note
has the reasoning and the fix. Shipping a binary that builds the catalog wrongly, on the
platform where nobody would think to check, is worse than shipping none.
The manual lives in the repository: documentation, the query language, the architecture.