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.
  • A twenty-band spectrum meter in the player bar, on by default, drawn from the audio actually being played. It can be switched off, and off means the analysis does not run at all.

Playlists and the queue

  • Up to sixty-four named playlists, filled by hand. No persistent library, no album or artist browser, and nothing that generates a playlist for you. See playlists.
  • A permanent Queue, first in the list, where every unattended import lands — watched folders, the URL scheme, and every scripted interface.
  • An eleven-column table: status, track number, Title, Artist, Album, Length, Format, Bitrate, Sample Rate, Rating and Plays. Reorder, resize and hide columns; the layout is shared by every playlist and remembered between launches.
  • Header sorting that physically reorders the list, and grouping by album, artist or genre.
  • Ratings of one to five stars and a play count, both keyed to the file’s contents rather than to its place in a list — so they survive removal, re-import, a rename and a move.
  • 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 list and stay inspectable. Nothing is silently dropped.
  • Context menu: Play, Play Next, a Rating submenu, Reveal in Finder, Copy Source URL, Remove.
  • Duplicate handling that matches intent, checked per playlist: dragging the same track in twice queues it twice, while a folder rescan does not re-add what you already have.
  • Drag a selection onto a sidebar row to copy it into that playlist, or hold to move it. Tracks already in the destination are skipped, because it is not the list you can see.

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 and file-type associations land in the playlist you are viewing (or the sidebar row you drop onto); the fadenza:// URL scheme lands in the Queue, along with every other unattended import.
  • 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 list 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: playlist 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.
  • Eight transport actions — play/pause, next, previous, volume up, volume down, mute, shuffle, cycle repeat — with a keyboard shortcut you assign, each one optionally global so it works while another application is in front. Three ship bound and global: \, ] and [. A shortcut must include Control or Option; no Accessibility permission is asked for or needed, because the combinations are registered individually rather than observed. See shortcuts.
  • 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, , 15, 0 — fixed, and unaffected by anything you assign in Settings → Shortcuts.
  • Transport reachable without the window: eight actions bindable to a shortcut of your own, each able to work while another application is in front.
  • 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.
  • 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.
  • An equalizer, or any other filtering of the audio. The player bar’s meter reads the signal; nothing alters it.
  • A separate or detachable visualiser window.