Skip to content

Repository files navigation

Sol

Sol

A native Mac music player for people who love their music library.

Point it at your folders and it plays your files right where they live. Nothing moved, nothing converted, nothing locked in.

Free download

macOS 14+ Swift 6 Apple Silicon and Intel 34 languages

Sol's main window, showing the classic pane browser over a track list

Watch the tour


Free and open source

There is no paid tier, no subscription, no trial, no in-app purchase and no account. Every feature is in every copy.

Download it from Releases, a signed and notarized build, or build it yourself from this repository. Sol tells you when a new version is out and never nags about anything else.

There is a Homebrew cask too:

brew install --cask fulltimefeline/tap/sol

The library you remember, modernized

The classic multipane browser filing by library, genre, artist, album, etc. A grid view that lays your artwork out as a wall, grouped by artist, letter or year with an A to Z rail to skim. An album carousel for flipping through a collection like a record crate. And a resident mini player.

Built for real collections: browsing stays instant at hundreds of thousands of tracks. One search bar covers songs, albums, playlists and podcast episodes across every library and server at once, and it reaches every tag you have, down to catalog number and filename.

Grid view, artwork grouped by artist with an A to Z rail

Every format that matters

FLAC, ALAC, WAV, AIFF, MP3, AAC, Ogg Vorbis and Opus, plus the deep cuts: DSD, Monkey's Audio, Musepack and Wave64. And more. Cue sheets work both as a sidecar .cue and embedded inside the file itself.

Gapless playback, crossfade, a full equalizer with presets, and ReplayGain levelling with clipping protection.

Match sample rate and bit depth switches your DAC to each file's own rate and depth. Bit-perfect output sends the file's own bits to your DAC untouched when the device supports it, and falls back honestly when it does not.

The 31 band equalizer

Your music, wherever it lives

Watch as many folders as you like across internal disks, external drives, network shares and iCloud Drive. Offline libraries are detected instantly, greyed gracefully, and rescanned by themselves when they come back.

Stream from your own Navidrome, Subsonic or OpenSubsonic server right beside your local files, with two way sync of playlists, favourites and ratings, and downloads for offline listening.

A Navidrome server browsed alongside local libraries

More than songs

Podcasts with subscriptions, transcripts, chapters, Voice Boost for quiet talkers and one click import from Apple Podcasts. Internet radio with station artwork and live song titles. Lyrics that follow along line by line, a full screen visualizer, and karaoke.

Karaoke view   The full screen MilkDrop visualizer

Sol DJ builds an endless, radio-style mix that favours loved tracks, surfaces overlooked discoveries and avoids repeats.

Sol DJ, with its weighting controls

Your tags, your rules

A real metadata editor: thirty fields written into the files themselves, on every format Sol can tag, artwork included. Edit many files at once, find and replace with regular expressions, and look tags up on MusicBrainz.

Ratings and loves go into your files' actual tags, so they are readable by other players and portable forever.

Smart playlists with nested rule groups across more than thirty fields, a duplicates finder, play statistics, and an import organizer that renames and files new music by your own template.

The metadata editor   The smart playlist builder

Made for the Mac

Real AppleScript support and sixteen Shortcuts actions. Media keys, Dock transport controls and system Now Playing integration. Last.fm scrobbling with loved track sync. Discord Rich Presence through the free Sol Activity companion. An optional local control API for companion apps, stream decks and your own automations.

Translated into 34 languages.

No telemetry, no analytics, no account.


Building

What you need

  • macOS 14 or later
  • Xcode 26 or later, for the macOS 26 SDK. Swift 6 language mode with full strict concurrency checking
  • XcodeGen, brew install xcodegen

The project file is generated

project.yml is the source of truth and the Xcode project is not in version control, so xcodegen generate is a required first step rather than an optional one. Do not edit the generated project directly. Change project.yml and regenerate.

Credentials

This step is optional. A fresh checkout builds and runs as it is. Config.xcconfig defaults the Last.fm credentials to empty, LastFM.configured returns false, and the scrobbling UI reports itself unavailable. Nothing else in the app is affected.

To enable scrobbling, register an application at last.fm/api/account/create, then:

cp Secrets.example.xcconfig Secrets.xcconfig

Paste the two values in. Config.xcconfig pulls it in with an optional include, so the values override the empty defaults when the file is there and are ignored when it is not. Secrets.xcconfig is gitignored, so the keys never reach the repository.

Build

xcodegen generate
open Sol.xcodeproj

Or from a terminal:

xcodebuild -project Sol.xcodeproj -scheme Sol -configuration Debug build

Dependencies

One Swift package, resolved automatically:

SFBAudioEngine, a trimmed fork of sbooth/SFBAudioEngine with the LGPL decoders removed, pinned to a revision. That fork's own history records what differs from upstream.

Everything else is vendored as static libraries in Sol/Vendor/lib with headers in Sol/Vendor/include: TagLib, Monkey's Audio, Musepack, Ogg, Vorbis and opencore-amr. They are checked in, so there is nothing to fetch or build.

Layout

project.yml         the real project definition
Sol/App/            model, playback, library, tagging, integrations
Sol/Views/          SwiftUI and AppKit views
Sol/Vendor/         vendored static libraries and headers
Sol/Resources/      the string catalog, 34 languages
docs/               screenshots used by this README

Sol/App holds no references to Sol/Views outside the composition root in SolApp.swift, and services take their dependencies as injected closures rather than reaching back into the model. Please keep it that way.

Notes

  • Debug builds define SOLDEBUG, which enables the /debug/probe and /debug/snapshot endpoints on the local control server. Release never defines it.
  • Strict concurrency is fully on. Each @unchecked Sendable and nonisolated(unsafe) carries a written justification of the invariant that makes it safe. If you add one, explain it.
  • There is no test target yet. LibraryStore.slots, TagWriter, CueParser, FeedParser, ReplayGain and TagReader are pure and deterministic, and are the obvious place to start.

Sol Activity

Discord Rich Presence needs a small companion app, because Discord's IPC socket cannot be reached from inside the App Sandbox. It is free, GPL-3.0, and lives in its own repository.

Download it here, or brew install --cask fulltimefeline/tap/sol-activity.


Links

Website · Sol Activity · Sol API · Acknowledgements · Privacy

Licence

Sol is free software under the GNU General Public License v3.0 or later. You may use, study, modify and redistribute it, and any fork you distribute has to come with its source under the same terms.

Bundled third party components keep their own licences, all of them GPL-3.0 compatible. See THIRD-PARTY.md for the list and for why the version is 3.0 rather than 2.0.

About

Native macOS music player for local libraries and Subsonic/Navidrome servers, with bit-perfect output, podcasts and a metadata editor.

Topics

Resources

Stars

26 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages