Stellody exists because another player wrote tags back into a real collection, duplicating and overwriting metadata across 21 albums. Years of ripping and tagging, damaged by software that thought it was helping.
So the first thing Stellody is, is a player that cannot do that. It describes a damaged tag; it never repairs one. That is not a promise in a readme: the tag-writing surface is unreachable from any module that can read tags; a test fails the build if that ever stops being true.
A promise cannot fail a build. Every invariant below is enforced by a structural test; each of those tests has been verified by planting a violation and watching it fail: a guard that has never been seen to fail is not yet a guard.
Only the modules that own Stellody's own state may write to disk at all; nothing in the scanning or probing path writes anything.
Exactly two modules may hold the machinery for a connection, each named in the test with what it is for. Going from one to two was an edit somebody had to make and defend, which is the point of counting them.
The layer holding the library rules touches no filesystem, no network and no clock; time enters as an argument rather than by being looked up. It is gated at 100% branch coverage.
No module exceeds 400 lines; one that creeps close is reduced properly rather than shaved. Formatting and linting are assertions in the test suite rather than a remembered step.
In the library Stellody was built for, 163 of 482 albums are built from a cue sheet rather than one file per track, 157 of them a single FLAC holding the whole album. That is a main path, not an edge case, so it is captured in one value rather than special-cased everywhere.
Because the distinction lives in that one place, the queue, the transport and shuffle are written once and work for both shapes without knowing which they hold. The waveform inherits the same property: a shape is measured for the file, then each track takes its own share of it. So does the grid of sleeves and the album pane under it.
A full-text table was the first plan and the measurement refused it: a pass over the whole library costs under half a millisecond, against the hundred and twenty a typed character allows. An index would also hold the wrong text and be empty besides.
Tag grouping was tried and measured against a real library. It fragmented one Mozart folder into five albums, two of them holding a single track.
Walking frames in Python folded a 60 megabyte track in 3.2 seconds; vectorised over blocks it takes 0.84, bit for bit the same answer. A 390 megabyte album FLAC went from 21.8 seconds to 5.3.
Letting go of a decode used to block the interface for a full two second wait, measured at 2.00 seconds a step through the library. The check is handed down to the reader instead, which gives up at the next block: 0.2 milliseconds a step after.
Stellody reads FLAC and nothing else today, so a folder of MP3, M4A or WMA scans to nothing. Measured over the library it is developed against, that hides 146 of the 656 folders holding audio and part of 23 more, most of them M4A. Widening it is planned work and both halves of it are sized.
It is not for streaming, not for ripping CDs, not for syncing to devices and not for managing a library by rewriting its tags. It does not encrypt anything at rest: the store holds library metadata, not secrets. An equalizer, gapless transitions and accepting the repairs the health report describes are not built; where a control for one of those is on screen it is disabled and says so.
Windows is the only platform built today.