Bòcan Music on macOS: the three-pane browser showing the Songs list, with the player bar underneath.

Bòcan Music: A Native macOS Player That Treats Your Library as Yours

Bòcan is a Swift 6 music player and podcast client for macOS 15+. Here is what it does, how to install it, where it still falls short, and what the Apache-2.0 licence lets you do with the code.

Key takeaways
  • Bòcan is a native Swift 6 player for macOS 15+: gapless playback, a full DSP chain, and FFmpeg-backed format support covering DSD, Monkey's Audio and TrueHD.
  • It indexes your folders without touching them, and identifies tracks through AcoustID and MusicBrainz with a side-by-side preview before anything is written.
  • It is Apache-2.0, so the code can go into a commercial app, with an express patent grant and obligations to keep notices and mark modified files.
  • The gaps are documented: macOS 15+ only, phone sync goes to Android and only one way, and moving or renaming files from the library is still a roadmap item.

There is no shortage of music players for the Mac, and most of them fail the same three ways: they were abandoned, they are a web app in a window, or they are a streaming client that treats a folder of FLAC files as an edge case. Bòcan is aimed squarely at the third problem. It is a native Swift 6 and SwiftUI app built around a library you own, and its README opens with the sentence that explains the whole project: no Electron, no Catalyst, no subscription, no cloud.

It is also unusually well documented for a project this young. The repository was created in April 2026, the current release is 2.16.0, and the code is Apache-2.0 licensed. That combination, a real released app you can install today plus source you can read or lift into your own work, is what makes it worth a write-up rather than a bookmark.

What It Does

Point it at a folder and it indexes the music there. The browser is a three-pane window: sources and playlists on the left, a grid or list in the middle, the track list on the right. Albums, tracks, artists, genres, composers and recently added each get a view, and typing anywhere jumps into search. A letter, a word, or a year such as 1984, which filters the album wall to that release year.

Format coverage is the part that surprises people. AVFoundation handles FLAC, ALAC, AAC, MP3, WAV, AIFF, CAF and M4A natively. Everything awkward comes through an integrated FFmpeg bridge with no plug-ins to install: Ogg Vorbis, Opus, Monkey's Audio, WavPack, DSD, DTS, Dolby Digital and Dolby Digital Plus, and Matroska with whatever it contains, TrueHD included. Surround mixes are folded down to stereo rather than playing half a mix, and CUE sheets become chapter markers so a single-file rip keeps its track list.

The library itself is treated as read-only. Scanning never modifies your files, an FSEvents watcher picks up changes, and duplicates are caught by modification time plus a fingerprint. For music with missing or wrong tags there is AcoustID fingerprinting against MusicBrainz: it proposes changes, shows them beside what you already have, and lets you tick the fields you want before anything is written. There is also a batch tag editor with undo, automatic sidecar cover art, and an Exclude from Shuffle flag so a rain-sounds album stops ambushing a playlist.

Beyond local files it speaks three more protocols. Subsonic, Navidrome and Airsonic servers appear as first-class sources with federated search across all of them. Podcasts come from RSS, Atom, Podcast Index or iTunes search, with Podcasting 2.0 chapters, transcripts and host credits. Internet radio is a sidebar catalogue, and a pasted .pls or .m3u URL expands into the stations inside it. Scrobbling goes to Last.fm, ListenBrainz and Rocksky, queued offline when you are not connected.

How to Install It

You need macOS 15.0 Sequoia or later. Start with the signed and notarized DMG in GitHub Releases; the project's official download page is an additional direct route. Homebrew is an optional package-manager route, not the primary download path. Every release also publishes a build attestation, so you can check that the DMG you downloaded really is the file this repository's release workflow produced.

# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releases

Updates arrive through Sparkle inside the app. If you prefer Homebrew, brew upgrade --greedy bocan remains available; building from source is a separate contributor path listed in DEVELOPMENT.md.

How to Use It

First run is a choice of folders. After that the everyday gestures are the ones you would guess: double-click an album cover to play it, click a column header to re-sort, start typing to filter. Navigation behaves like a browser, with back and forward chevrons, the thumb buttons on a multi-button mouse, ⌘[ and ⌘], and Esc to climb out of any drill-down, and coming back restores both your scroll position and the search text you left behind.

The shortcuts worth memorising are ⌘⇧F for a full-screen visualiser, ⌘⇧I for the experimental immersive mode, ⌘⇧Y for Library Summary and ⌘⇧L for the log console. Library Summary is the one with no equivalent elsewhere: six tabs of statistics computed on your own machine, covering library hygiene, audio quality, collection shape, listening behaviour and the podcast backlog, right down to a completion rate that tells you where a show's ad break sits.

Smart playlists are built in a rule editor and compiled to live SQL, so membership updates as the library changes. Manual playlists sync while they play: remove a track and Up Next adjusts immediately. There are six GPU-rendered visualisers, four mini player layouts, and a Phone Sync pane that serves a read-only copy of the library to a paired Android phone over your local network, transcoding to MP3 or Opus on the way if you ask it to.

The Demo

The README carries screenshots of the songs view and the visualisers; the repository ships no demo video. What a screenshot cannot show is the part that matters day to day: a search filter that survives backing out of an album, a queue that keeps your position when you edit a playing playlist, and sort and scroll positions that come back where you left them. Those are the things worth testing in the first ten minutes.

How the Audio Works

Gapless playback is the headline claim and the mechanism is worth knowing: playback is anchored to AVAudioTime at nanosecond resolution, so a live album or a DJ mix runs across track boundaries without the silence or click a normal transition inserts. On top of that sits a DSP chain between the decoder and your output: a 10-band graphic EQ, bass boost, a stereo expander, binaural crossfeed and a peak limiter.

ReplayGain is applied at playback time rather than baked into your files, and anything missing a gain tag is analysed in the background to the EBU R128 loudness standard. The analyser decodes through the same route playback uses, which is why the FFmpeg-only formats get a value too, and why a surround file is measured from the stereo fold you actually hear. Crossfade runs from zero to twelve seconds, playback speed from half to double with pitch correction, and the sleep timer fades out instead of cutting mid-note.

Two decoders, one graph. AVFoundation handles what it handles well, and the FFmpeg bridge takes over for the rest, including a file the system decoder will open but not play, such as Opus inside an MP4 container. The player bar reports what is really decoding: codec, bitrate, sample rate, bit depth and channel layout, read from the open decoder rather than guessed from the file extension, so an .m4a is reported as AAC, ALAC or E-AC-3 as appropriate.

How the Code Is Put Together

The repository is split into twelve Swift Package modules with no upward imports, which is the part a Swift developer should read first. AudioEngine owns the decoder graph and the playback actor, Metadata wraps TagLib, Acoustics handles Chromaprint fingerprinting and the AcoustID and MusicBrainz lookups, Library runs the folder scanner and the FSEvents watcher, Playback owns the queue, shuffle and the gapless scheduler, and SyncServer does the mutual-TLS phone pairing. Persistence is GRDB 7 with FTS5 full-text search and reactive ValueObservation streams.

The discipline is stated as a requirement rather than an aspiration: Swift 6 strict concurrency with @MainActor isolation and Sendable conformance, an 80 per cent line-coverage gate that fails the build, an end-to-end suite that drives the real UI, and XcodeGen so no .pbxproj is ever hand-edited. SwiftLint, SwiftFormat, gitleaks and Snyk run on every pull request, and updates are delivered by Sparkle against a signed feed.

Where It Falls Short

Start with the floor: macOS 15.0 and nothing below it, which rules out every Mac stuck on an earlier release. Phone Sync goes to Android only, and only one way: the Mac serves, the phone keeps a copy, and nothing is ever written back. There is no iPhone app, and controlling the Mac from a phone is listed under what comes next rather than what ships.

File management is the other gap. Bòcan will index, tag and identify your music but will not move or rename it; organising the library from inside the app is on the roadmap. Immersive Mode is labelled experimental in the README and may change shape or be dropped. Deep Dive, the MusicBrainz and Wikipedia report generator, is off by default, and its first pass over a large library is paced at one request every 1.5 seconds, so it is measured in hours rather than minutes.

The Licence: What You Can Do

Bòcan is licensed under Apache License 2.0, © 2026 Chris Funderburg. Apache-2.0 is permissive in the same way MIT is, but it is a longer document and the differences matter if you plan to ship the code rather than just read it.

You can use it commercially and inside closed-source products. You can modify it and distribute the result under terms you choose, including as part of a larger proprietary app. Unlike MIT, Apache-2.0 grants an express patent licence from every contributor covering the patents their contribution necessarily infringes, and that grant ends if you file patent litigation alleging the work infringes.

The obligations are about notices, not openness. Ship a copy of the licence with anything you distribute, mark the files you modified, keep the copyright, patent and trademark notices from the source, and reproduce the attribution notices from the project's NOTICE file. There is no copyleft: you are never required to publish your changes or to license your own app the same way.

Two things Apache-2.0 does not give you. It grants no permission to use the project's name, logo or trademarks beyond describing where the code came from, and it disclaims all warranties: the software is provided as is, and no contributor is liable for damages. In practice, keep the notices, mark your changes, and you are free.

Should You Install It

If you keep a local library on a Mac running Sequoia or later, the download costs nothing and pointing it at your music folder is the only setup there is. If you are a Swift developer the value is less the app and more the repository: twelve modules, a working FFmpeg-to-AVAudioEngine decoder graph, GRDB with FTS5, and strict-concurrency Swift 6 held to a coverage gate, all under a licence that lets you lift any of it into a product you sell. The gaps are written down rather than hidden, an Android-only phone sync, no file management yet, and a hard floor at macOS 15, which is a better sign than a feature list with no caveats.

Project facts

License
Apache-2.0
Platform
macOS 15.0+ (Sequoia)
Written in
Swift 6, SwiftUI
Version reviewed
v2.16.0 (2026-09-16)

Install

# Open GitHub Releases and download the signed and notarized DMG:
open https://github.com/bocan/bocan-music/releases

License summary

Apache-2.0 is permissive: you can use the code in commercial and closed-source apps, modify it, and redistribute it, as long as you keep the licence and its notices, mark the files you changed, and pass along the project's NOTICE file. It also carries an express patent grant. There is no warranty and no trademark permission.