Riffle lets you browse your library, read EPUB, PDF, and CBZ files, listen to audiobooks, and keep reading and listening progress in sync across devices — all from a clean, privacy-respecting Android app.
- EPUB, PDF, and CBZ (Comic Book Archive) readers
- Table of Contents navigation
- Chapter navigation rail for jumping between sections
- In-book text search
- Chapter map progress indicator
- Fullscreen immersive reading mode
- Rich formatting controls (themes, fonts, sizing, spacing, margins, justification)
- Auto theme that can follow configured app light/dark reader themes or switch between configured day/night themes on a global clock schedule
- Paginated and continuous scroll modes, with landscape double-page spread
- Per-book formatting overrides
- Volume-key page navigation (with optional inverted direction)
- Keep screen on
- Highlight passages in any color while reading
- Attach notes to highlights for personal commentary
- Bookmark pages for quick return
- Search across all highlights, notes, and bookmarks in your library
- Highlights, notes, and bookmarks sync across devices automatically for Audiobookshelf users; Komga users can optionally configure a WebDAV server for the same.
- Reading and listening progress for Chitanka and Project Gutenberg syncs across devices via an optional WebDAV server — configure once and your position follows you to every device
- Full audiobook player for any Audiobookshelf audiobook, streamed directly from your server
- Transport controls: play/pause, skip 15s back / 30s forward, and previous/next chapter
- Seekable chapter-map scrubber with chapter ticks, plus per-chapter and whole-book remaining time
- Variable playback speed (0.5×–3.0×) with quick presets, remembered per book
- Background playback with lock-screen, notification, and Bluetooth media controls
- Download audiobooks for offline listening, with progress that reconciles when you reconnect
- Audiobookshelf playlists surfaced as a dedicated tab on the audiobook library — play a playlist end-to-end with auto-advance that resumes each next item from its saved position, and add or remove items from the item detail sheet
- Storyteller Readaloud in the reader: synced sentence highlight, auto-page-turn, "Play from here," and background playback
- Listening and reading positions stay in sync for matched books — pick up in the reader exactly where you stopped listening, and vice versa
- Audiobookshelf and Storyteller self-hosted servers — full read, listen, and sync
- Komga self-hosted server — browse, read, and sync comics, manga, and ebooks (EPUB, PDF, CBZ) from any Komga instance with Basic-auth credentials; page-based reading progress syncs bidirectionally across devices; annotation sync available via optional WebDAV
- Chitanka (chitanka.info + gramofonche.chitanka.info) — anonymous, zero-config access to the Bulgarian public catalogue of EPUB ebooks and MP3 audiobooks; browsable by category, genre, and series; reading and listening progress syncs across devices via optional WebDAV
- Project Gutenberg (via Gutendex) — anonymous, zero-config access to ~70,000 public-domain EPUBs; browsable by language, subject, and author; reading progress syncs across devices via optional WebDAV
- O'Reilly — read or listen to any title in your O'Reilly subscription; ebook chapters stream on demand and cache locally for instant re-reads; audiobooks stream via Kaltura with per-chapter progress; books download to device for offline access
- radio.es — browse and stream Spanish-language radio stations and podcasts from the radio.es catalogue; filter podcasts by category and language; live radio stations stream directly without downloading
- Local files — import EPUB, PDF, and CBZ files from device storage and read them alongside your server libraries, with the same reader, highlights, and progress tracking
- Multi-source support with per-library visibility and ordering controls
- Browse by Home, To Read, Series, Collections, and All Books
- Cover grid with book details
- Read/unread and "To Read" toggles
- Full-text library search
- Item detail screen shows personalized estimated reading time for EPUBs (based on learned reading speed) and discrete page count for PDFs
- Download for offline reading, plus automatic caching on open
- Downloads manager with bulk removal
- Offline detection and seamless offline reading
- Audiobookshelf and Storyteller login with secure token storage and insecure-connection warnings
- Storyteller Readaloud Library: browse every completed readaloud as a single library
- Automatic Storyteller↔Audiobookshelf matching with a Settings review queue: high-confidence pairs auto-confirm, fuzzy matches go to Pending Review, and a manual picker pairs anything the matcher can't place
- Bidirectional progress sync with last-update-wins conflict resolution, unified across the ebook, audiobook, and readaloud of a matched book
- Periodic auto-sync, offline queueing, and durable reconciliation of progress recorded while offline
- Reading session time tracking
- Android 7.0 (API 24) or higher
- One or more of: a running Audiobookshelf, Storyteller, or Komga server, internet access for Chitanka or Project Gutenberg, or EPUB, PDF, or CBZ files on your device
| Channel | Status |
|---|---|
| GitHub Releases | CI-built signed APK |
Riffle follows a strict Kotlin Multiplatform (KMP) layered architecture:
app/ # Android host — Jetpack Compose + Hilt
core/domain/ # KMP — entities, repository interfaces, domain logic
core/models/ # KMP — shared data models
core/sources/ # KMP — source plugin contracts and catalog adapters
core/sync/ # KMP — progress sync engine
core/net/ # KMP — API client interfaces
core/network/ # JVM — OkHttp-based network implementation
core/database/ # Android — Room schema and DAOs
core/data/ # Android — repository implementations, Keystore token storage
feature/*/ # KMP — per-feature ViewModels and domain logic
feature/*-ui/ # Android — Compose screens for each feature
- Android SDK (via Android Studio or
sdkmanager)
make bootstrap # Install JDK 17, download Gradle wrapper, fetch bundled fontsmake build # Build the project
make test # Run unit tests
make lint # Run lint checks
make check # Full CI check: build + lint + tests
make install # Build and install debug APK on connected device
make harness-test # Clone a fresh emulator, run instrumentation tests, then delete it
make harness-test-tablet # Same but for tablet-layout testsRiffle is licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
Commits up to and including 44d17c362 were also published under the Apache License 2.0. From the relicense commit onward, the project is AGPL-only. If you forked or copied Riffle before the relicense, your existing copy retains its Apache-2.0 grant; future updates are AGPL-3.0-or-later.
See CONTEXT.md for the full domain glossary (Server, Library, Library Item, Cache, Download, Reading Session, Progress Sync, etc.).











