A quiet, offline-first audiobook player for iOS and Android.
![]() |
![]() |
![]() |
| Browse covers, progress, and listening status. | Move by chapter, position, or jump interval. | Set playback, sleep timer, and appearance. |
Screens use the public-domain LibriVox recording of Alice's Adventures in Wonderland.
Bookish treats an audiobook as a book, not a loose playlist. Import it once, keep it on the device, and return to the exact chapter and position later. Notes, history, covers, preferences, and backups remain local too.
- Import, organize, and edit audiobooks offline
- Play by chapter with speed, audio, rewind, and sleep controls
- Use lock-screen, headset, CarPlay, and Android Auto controls
- Save text or voice notes
- Track listening history and completed books
- Back up and restore the local library as JSON
Internal builds can also transcribe a selected passage with an on-device speech model. Store builds leave that code and its native packages out.
The Dart workspace has four members. packages/bookish_player contains the
shared app. apps/store is the public target, while apps/internal adds
packages/bookish_cactus_transcription. The store target never depends on
Cactus.
Features follow an MVI flow:
Widget -> Cubit -> use case -> repository -> platform adapter
^ |
+------------- immutable state --------+
The workspace uses one root lockfile. See docs/architecture.md for module and dependency rules.
Use Flutter 3.47 or newer with Dart 3.13 or newer. Android builds require SDK 37 and use AGP 9.1.1 with Gradle 9.3.1. Install the platform toolchain, then run:
flutter pub get
cd apps/store # or apps/internal
flutter run
cd ../../packages/bookish_player
flutter analyze
flutter testFor iOS builds, create the ignored local signing file and replace
YOUR_TEAM_ID with your Apple development team:
cp signing/ios/Signing.local.xcconfig.example \
signing/ios/Signing.local.xcconfigUse ./tool/build_store.sh android or ./tool/build_store.sh ios for guarded
store builds. CI must create its own local signing file before iOS builds.
Run bash tool/test_store_dependencies.sh to test the store dependency guard.
The internal app builds its pinned native Cactus runtime through a Flutter build hook. See the adapter setup guide for fresh-clone steps, supported targets, and caveats.
Run adapter tests with flutter test from
packages/bookish_cactus_transcription.
VS Code launch configurations at the repository root can run either app in debug, profile, or release mode.


