Full feature list
Everything in v1, what comes later, and what is deliberately absent.
Playback
- Seven formats through Apple frameworks only, with no native dependency: MP3, AAC/M4A, ALAC, WAV, AIFF, FLAC and Ogg Vorbis. Opus in an Ogg container also decodes; it is not on the supported list.
- Play, pause, previous, next, seek, volume, mute.
- Repeat off, one or all — with the distinction that matters: under repeat-one a track that reaches its end replays, but pressing Next advances.
- Shuffle as a saved seeded order — no repeats within a pass, reproducible, and restored exactly on relaunch rather than reshuffled.
- Previous seeks to the start if more than 3 s has elapsed, otherwise moves to the previous track.
- Per-item seekability. A live or chunked stream disables the scrubber instead of presenting one that silently does nothing.
- App-level volume that never touches the system output volume. Mute is separate state, so unmuting restores the previous level.
Queue
- One session queue. No persistent library, no album or artist browser, no multiple playlists.
- Reorder by drag, multi-select, remove, clear.
- Per-row availability badge: loading, missing file, unsupported, failed — with the reason in the tooltip. Failed and missing tracks stay in the queue and stay inspectable. Nothing is silently dropped.
- Context menu: Play, Play Next, Reveal in Finder, Copy Source URL, Remove from Queue.
- Duplicate handling that matches intent: dragging the same track in twice queues it twice, while a folder rescan does not re-add what you already have.
Sources and entry points
- Local files, folders (recursive, depth cap 32, 20,000 files per import) and
file://URLs. - HTTP and HTTPS audio streams.
- M3U, M3U8 and PLS playlists, local and remote.
- Watched folders, with a dismissal set so a track you removed does not come back on the next scan.
- Drag and drop, the Open panel, Finder Open With, file-type associations and the
fadenza://URL scheme — all landing in the same queue. - Import never aborts on one bad entry. A folder containing a corrupt file imports the rest and reports what it rejected.
Metadata
- Read-only. Title, artist, album, track number, genre, duration, artwork.
- Loaded asynchronously after the queue populates, so paths appear immediately and titles fill in behind them.
- No editing interface and no write path. Apple frameworks cannot write MP3, FLAC or Ogg tags; this was measured rather than assumed, and the feature was dropped rather than faked. See formats.
Session
- Full restore across relaunch: queue order, current and selected track, playback position, repeat mode, shuffle state and seed, volume, mute, output device preference, watched folders.
- Restores paused at the saved position. Never auto-starts.
- Atomic debounced writes. A corrupt session file is set aside rather than deleted, and the app launches with an explanation.
System integration
- Now Playing and media keys through the system command centre — no private APIs, no global event taps.
- Dock menu and a menu bar extra.
- Notifications: errors on by default, with actions where one exists; track-change notifications off by default.
- Audio output device selection, including aggregate and multi-output devices, with automatic fallback to the system default if the active device disappears. Playback keeps going, and the device is reselected if it comes back.
- AppleScript (a minimal, read-mostly surface), Shortcuts and App Intents, a loopback HTTP control API, and an MCP adapter — all routed through one command layer, so removing any one integration breaks no other.
- The HTTP API is off by default, binds loopback only, and keeps its token in the Keychain.
Accessibility
- Space, ⌘→ / ⌘←, ⌘↑ / ⌘↓, ⌘O, ⌘⌫.
- Accessibility labels on every control; the scrubber speaks elapsed-of-duration.
- Real list rows with stable identifiers, so VoiceOver row navigation works.
- Respects Reduce Motion and Increase Contrast.
Later
- Gapless playback. Requires replacing the playback engine implementation. The protocol boundary exists for exactly this.
- An iOS client, reusing the domain and services layers unchanged. A continuous integration job builds both for the iOS simulator from day one to keep that boundary honest.
Deliberately not built
Each of these is something a competing player has. The absence is a decision, not an oversight:
- Metadata and artwork editing.
- Gapless playback in v1.
- Bit-perfect and hog-mode output, DSD, DoP, sample-rate following. Audio routes through the system mixer.
- ReplayGain and volume normalization.
- CUE sheets, including embedded CUE.
- Last.fm scrobbling, a Spotlight importer, a file tree browser, disk image mounting.
- Nested remote playlists.
- Multiple simultaneous playlists or tabs.
- A persistent indexed library, or an album and artist browser.
- Crossfade, variable speed, pitch control.
- Tracker, chiptune and console-audio formats, and the decoder-plugin architecture they need.
- Mac App Store packaging, analytics, crash reporting, broad localization.