Skip to content

Repository files navigation

Bookish app icon

Bookish

A quiet, offline-first audiobook player for iOS and Android.

Android 10+ iOS 16+ Flutter

See it in use

Bookish library Bookish audiobook player Bookish settings
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.

Features

  • 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.

Project structure

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.

Development

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 test

For 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.xcconfig

Use ./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.

About

Bookish is a quiet, offline-first audiobook player for iOS and Android. It keeps your books, playback history, notes, and preferences on your device and is built for both single-file audiobooks and multi-file collections.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages