A mobile client for Kavita, built with Flutter for iOS, iPadOS and Android.
Patra — the left-hand page of an open book, and a nod to the verse behind Kavita's name (कविता, "poem").
Usable, still young. What works:
- Multiple servers — sign in to several Kavita servers and switch between them in one tap; tokens live in the platform keychain, passwords are never stored
- Home — Continue reading, On deck, and your libraries
- Library — filter pills per library, 3-column cover grid with reading progress
- Series — volumes, chapters and specials as rows, with covers and per-chapter progress
- Books (EPUB) — a book's row opens the reader on the pages Kavita laid out, in the face the book itself asks for — or in one of the app's own — with a table of contents, a text size and a line spacing of your own, and a copy you can save for the train
- Offline — save chapters and books to the device, read them with no server reachable, and have the progress you made on the train reach the server when you are back
- English and French, following the system language
- EPUB reading — Kavita renders a book into pages of HTML server-side and the app draws them itself, in the face the book asks for (ADR-0008, ADR-0010, ADR-0012)
- Search across libraries
- Reading lists and collections
Releases are cut by a v* tag — git tag v0.2.0 && git push origin v0.2.0, or publishing a GitHub release that creates that tag; no commit needed: the tag is what names the version, and the app reads that name back off its own binary. A push to main between releases only compiles and tests, and leaves a sideloadable artifact.
Android — a tag builds a signed App Bundle and, once a Play service account is configured, sends it to the internal test track on Google Play. Without the signing secrets — a fork, or this repository before the Play account existed — the job falls back to the patra-debug-apk artifact on the latest Actions run, which installs by sideloading.
iOS / iPadOS — a tag is signed and sent to TestFlight, so an invitation and the TestFlight app are all it takes; builds expire 90 days after upload. A fork, having no signing secrets, falls back to an unsigned patra-unsigned-ipa artifact, which has to be re-signed with your own Apple ID (AltStore or Sideloadly, from a Windows or Mac machine) — a free account's signature lasts 7 days.
flutter pub get
flutter run -d linux # or a connected device
flutter analyze && flutter testRequires a running Kavita server (v0.8+),
reachable over https:// or, for a server on your own network, http://.
lib/src/branding/— the mark as outlines, and the launch animationlib/src/api/— thin hand-written client for the Kavita REST APIlib/src/auth/— remembered servers, session and token refreshlib/src/downloads/— offline page storagelib/src/theme.dart+lib/src/widgets/— design tokens and shared UIlib/src/features/— one folder per screen