# BookPlayer: an audiobook app whose architecture matches its community

> BookPlayer is a DRM-free audiobook player for Apple platforms, and it is shaped less by a feature roadmap than by a long tail of contributed capabilities. Reading the repository structure and the feature list together explains a good deal about how the project actually works.

**TortugaPower/BookPlayer** — Player for your DRM-free audiobooks

- Repository: https://github.com/TortugaPower/BookPlayer
- Stars: 2,239 · Forks: 276
- Language: Swift
- License: GPL-3.0
- Published: 2026-10-08 · Updated: 2026-10-08 · Language: en
- Canonical page: https://hysenlabs.com/projects/tortugapower-bookplayer

## A DRM-free promise that shapes everything else

The project description is four words long: Player for your DRM-free audiobooks. That phrase does more work here than a feature bullet would, because it rules out the largest commercial category of audiobook apps before any other decision is made.

The app banner makes the same point with file formats: a wonderful player for your M4B, M4A and MP3 based audiobooks. Those are container formats you can obtain, copy and keep, which means your library survives if the app disappears. For a paid subscription service the library lives on someone else's server and vanishes with the subscription. That difference is the entire reason this app exists, and every architectural decision below is downstream of it.

The licensing matches the philosophy. The README states the project is licensed under GNU GPL version 3, and a `LICENSE` file sits at the repository root. A copyleft licence on an app that reads files you own is a coherent choice, since the code is shared while the content is not.

The community is international to a degree that is worth noting. The README lists translation contributors for twenty-three languages including English, Czech, German, Russian, Spanish, Swedish, Simplified Chinese, Danish, Dutch, French, Romanian, Turkish, Italian, Ukrainian, Slovak, Portuguese, Polish, Hungarian, Arabic, Finnish, Greek, Catalan and Japanese, with named contributors credited for several. That is a lot of localisation for a side project, and it tells you the audience is far wider than its name suggests.

## Five ways in, which is really a story about ownership

The import section lists five routes, and reading them as a group says something more useful than reading them one at a time.

AirDrop from a Mac or iOS device is first. Then Files and other apps on the device through the share sheet. Then File Sharing through iTunes on a Mac or PC, which is the oldest route and the one that works when you have a cable. Then downloading from your own AudiobookShelf or Jellyfin server, which is the interesting one, because it means the app treats a self-hosted server as a first-class library source. Then zip archives, which are supported and can be turned into playlists automatically.

That last detail is small but revealing. A zip is what you get when you download a book from somewhere else, and automatically converting one into a playlist means a user who acquired files by any means can get them in without a conversion step. Combined with the self-hosted server support, the design assumption is that people already own their files in whatever shape they acquired them.

The Jellyfin support has a matching detail elsewhere in the repository. The README credits a specific contributor for Jellyfin support and for Jellyfin multi-file and folder download support, and it notes that the repository includes a vendored BlurHashDecode file from the Wolt library for displaying placeholder images from Jellyfin servers. Placeholder artwork matters more than it sounds: a folder of forty files on a self-hosted server has no cover, and BlurHash gives you a gradient derived from the original so the library screen is not a wall of blanks.

The Manage section then covers what happens after import: tracking and viewing progress, marking books finished, drag and drop sorting, creating folders that play items in turn, playing the first unfinished file by tapping playlist artwork, moving files between playlists, and automatically tracking the library on Hardcover, which is a reading-tracking service in the same category as Goodreads. That last item is the only outbound dependency in the Manage list.

## The repository is a multi-target Xcode project, not an app

The top-level tree explains the engineering better than any architecture document would, because the target boundaries are visible as separate directories.

There is `BookPlayer.xcodeproj/` and a `BookPlayer/` directory for the iOS and iPadOS app itself. There is `BookPlayerWatch/` alongside `BookPlayerWatchKit/` for the watchOS companion, and `BookPlayerWidgets/` for widget extensions. There is `BookPlayerIntents/`, which is the modern App Intents surface that lets the app respond to system-level requests. There is `BookPlayerShareExtension/` for receiving files shared from other apps, which is the mechanism behind the Files import route. And there is `BookPlayerKit/`, which by name is the shared layer that the other targets depend on.

That last entry is the structural fact that matters for anyone reading the code. When playback logic, the library model and the import pipeline all live in a shared framework rather than in the app target, then a capability like the sleep timer or the volume boost can be reused by the Watch target instead of being reimplemented. The contributor list supports that reading: smart rewind, speed control with autoplay, volume boost, AirDrop support, zip support and VoiceOver support are each credited to one person, which is the signature of features that land in the shared layer and then propagate.

Around the code sits the standard apparatus of a well-run iOS project. `BookPlayerTests/` for tests, `Shared/` for files used across targets, `Templates/` and `AlternateIcons/` for the theming and icon options sold as Pro features, `BuildConfiguration/` and `ci_scripts/` for continuous integration, and `Crashlytics.framework` for crash reporting. There is also `IAP-Configuration.storekit` and `StoreKitTestCertificate.cer`, which are the local testing artefacts for in-app purchases, a useful signal that the Pro tier is store-configured rather than licence-key based.

Linting is set up three ways: `.swiftlint.yml`, `.swift-format` and `.swiftformat`, plus a `.sourcery.yml` for the code generation that Sourcery performs. The README credits both tools as managed with Homebrew, and it names the two maintainers of each dependency, which is a level of care in the acknowledgements section that suggests the project has been maintained by the same people for a long time.

## Playback features that are really accessibility features

The Listen section is a list of small player controls, and taken individually most of them are unremarkable. Taken as a group they describe a deliberate approach to audiobook playback rather than music playback.

Control from the lock screen or control centre is table stakes. Chapters are not, because music files do not have them and an audiobook file is long enough that being lost is the normal failure mode. Jumping to the start of the current book solves the other half of that problem, where you resynchronise against an audiobook and find yourself forty minutes back. Playback speed matters differently than in music, because narrators are frequently recorded at a rate that sounds slow until you adjust. Smart rewind, credited to a named contributor, addresses the specific case of having drifted out of sync. Volume boost is credited to another, which suggests it started as a request from someone who wanted loud narration without losing clarity.

Then there are the features that are about other people in the room. Support for remote events from headset buttons and the lock screen means your device does not become the only control surface, which is what you need if the audiobook is playing on a speaker while your phone is in a pocket. A sleep timer with adjustable duration is the feature that most often determines whether an audiobook app is usable at bedtime. Dark mode is listed under night owls. And support for VoiceOver is credited to a specific contributor, which tells you it arrived as a contributed fix rather than a planned feature.

For a DRM-free player, that grouping is coherent. Audiobooks are long-form, frequently resumed, often started mid-chapter, and played in situations where the device is not in your hand. The features that survive that constraint are the ones on this list, and the ones that do not appear, like visualisations or equalisers, would not have made sense here anyway.

## What the Pro tier contains, and what it says about the business

BookPlayer Pro lists four things: cloud sync, stand-alone playback on your Apple Watch, support for open source development, and additional colour themes with a selection of alternative app icons.

Cloud sync is the substantive one, and it is the feature that changes the relationship between the app and your library. Without it, a library is a set of files on one device, which is faithful to the DRM-free promise but inconvenient across three Apple platforms. With it, the library is a synchronised account, which is closer to how a subscription service behaves, though the files remain yours.

Stand-alone Watch playback is the second one worth unpacking, because it is a hardware constraint rather than a feature request. A Watch that can only stream from a paired phone inherits the phone's connectivity and battery, so a book that needs an hour of uninterrupted listening offline does not really work. Stand-alone playback means the Watch holds the audio itself, which needs storage management and is presumably why it sits behind a paywall rather than shipping to everyone.

Themes and alternative icons are grouped with the other two as Pro features, and the repository backs that up structurally: there is an `AlternateIcons/` directory, a `Templates/` directory, and the README points to a wiki Developer Guide on how to add new themes and icons. So the theming system is a documented extension point maintained by the project, not a bolt-on. That is a slightly unusual arrangement, since paying for cosmetics while an extension guide for them is public is a contradiction, but it is a common one in the iOS ecosystem and it buys a lot of goodwill.

Support for open source development as a Pro benefit is the honest framing of how a GPL app with no ads and no subscription on the free tier funds itself. The roadmap lives on GitHub projects rather than in the README, so the direction of travel is not documented in the repository itself.

## Maintenance signals and how to get involved

Activity on this repository is current. The develop branch was pushed on 2026-09-21, and three releases are visible in the recent window: version 5.22.0 on 2026-08-30, 5.21.1 on 2026-07-15 and 5.21.0 on 2026-06-10. Two releases inside a quarter is a normal cadence for a mobile app and means the tagging discipline is intact.

Note that the default branch is develop rather than main. For an Xcode project of this size, that usually means stable releases are tagged from a release branch while develop carries unreleased work. Anyone cloning without thinking will get the moving target.

The contributing guidance is short and unusually direct. Pull requests and ideas are always welcomed, with a link to open an issue using a bug template. There is a `CONTRIBUTING.md` at the root alongside `CODE_OF_CONDUCT.md`, and the README adds a governance detail worth repeating: there is a Discord server, but bugs and feature requests belong in a dedicated forum channel or a GitHub issue, and the maintainers explicitly ask that they not be reported in the chat channels. They add that a chat is not a bugtracker and that maintainers drop by occasionally.

That is a small thing that says a lot about project health. Projects that say this usually have a working issue flow, and the fact that this one has a bug template, a code of conduct, general and supplemental terms documents, a privacy policy file and a `CLAUDE.md` at the root suggests an active, structured project rather than a hobby. The dependencies section lists Swift Package Manager packages by maintainer, including DeviceKit for device information, SweeterColor for artwork colors, Themeable for custom themes and ZipArchive for zip files, with BlurHashDecode vendored directly into the repository. Vendoring one dependency inline while managing the rest through Swift Package Manager is the kind of detail that tells you the project is maintained by people who care about build reproducibility.

## Conclusion

BookPlayer is the right choice if your library is DRM-free and you live entirely inside Apple's ecosystem, because the import paths, the Watch target and the playback controls are all built for that combination and the GPL licence means your library format stays yours. It is the wrong choice if you need a desktop client, since the app is iOS, iPadOS and watchOS only. Read the repository before you contribute, because the tree is split into separate targets with a shared framework between them and the boundary between BookPlayerKit and the app target is where a new capability usually has to be placed. Start with the community channels rather than a pull request, since the maintainers explicitly ask that bugs and feature requests not arrive in chat.

## FAQ

### Is BookPlayer free?

The core player is free and the source is licensed under GNU GPL version 3. There is a paid BookPlayer Pro tier that adds cloud sync, stand-alone Apple Watch playback, additional colour themes and alternative app icons, so the free version covers importing and playing your own DRM-free M4B, M4A and MP3 files.

### Is BookPlayer available for PC?

There is no PC or desktop version. The repository targets iPhone, iPad and Apple Watch through separate app, watch, widget, intents and share extension targets, so there is no Windows, Linux or macOS build. Files reach the app through AirDrop, the Files app, iTunes File Sharing or your own Jellyfin or Audiobookshelf server.

### What file formats and import sources does BookPlayer support?

The app handles M4B, M4A and MP3 audiobooks, plus zip archives that it can convert into playlists automatically. You can import over AirDrop, from the Files app and other apps through the share extension, through iTunes File Sharing, or by downloading from your own AudiobookShelf or Jellyfin server, which it treats as a first-class library source.

## Sources

- [Issues](https://github.com/TortugaPower/BookPlayer/issues)
- [License: GPL-3.0](https://github.com/TortugaPower/BookPlayer/blob/develop/LICENSE)
- [README](https://github.com/TortugaPower/BookPlayer/blob/develop/README.md)
- [Releases](https://github.com/TortugaPower/BookPlayer/releases)
- [TortugaPower/BookPlayer on GitHub](https://github.com/TortugaPower/BookPlayer)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/tortugapower-bookplayer
