Fadenza

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.