{"id":50335098,"url":"https://github.com/pkmetski/riffle","last_synced_at":"2026-05-31T13:00:55.538Z","repository":{"id":361155445,"uuid":"1253316904","full_name":"pkmetski/riffle","owner":"pkmetski","description":"An Android ebook reader for Audiobookshelf self-hosted servers.","archived":false,"fork":false,"pushed_at":"2026-05-29T12:19:11.000Z","size":3270,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T13:22:48.383Z","etag":null,"topics":["android","android-app","audiobookshelf","audiobookshelf-app","ebook-reader","epub","epub3","foss","pdf","reader"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pkmetski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-29T10:45:19.000Z","updated_at":"2026-05-29T12:53:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pkmetski/riffle","commit_stats":null,"previous_names":["pkmetski/riffle"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/pkmetski/riffle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkmetski%2Friffle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkmetski%2Friffle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkmetski%2Friffle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkmetski%2Friffle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pkmetski","download_url":"https://codeload.github.com/pkmetski/riffle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pkmetski%2Friffle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33731998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-app","audiobookshelf","audiobookshelf-app","ebook-reader","epub","epub3","foss","pdf","reader"],"created_at":"2026-05-29T13:00:44.110Z","updated_at":"2026-05-31T13:00:55.517Z","avatar_url":"https://github.com/pkmetski.png","language":"Kotlin","funding_links":["https://ko-fi.com/pkmetski"],"categories":[],"sub_categories":[],"readme":"# Riffle\n\nAn Android ebook reader for [Audiobookshelf](https://www.audiobookshelf.org/) self-hosted servers.\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/pkmetski)\n\nRiffle lets you browse your ABS ebook library, read EPUB and PDF files, and sync reading progress — all from a clean, privacy-respecting Android app.\n\n## Features\n\n### Reading\n- EPUB and PDF readers\n- Table of Contents navigation\n- In-book text search\n- Chapter map progress indicator\n- Fullscreen immersive reading mode\n\n### Reading Display\n- Rich formatting controls (themes, fonts, sizing, spacing, margins, justification)\n- Paginated and continuous scroll modes, with landscape double-page spread\n- Per-book formatting overrides\n- Volume-key page navigation\n- Keep screen on\n\n### Library\n- Multi-server support with library visibility controls\n- Browse by Home, Series, Collections, and All Books\n- Plex-style cover grid with book details\n- Read/unread and \"To Read\" toggles\n- Full-text library search\n\n### Downloads \u0026 Offline\n- Download for offline reading, plus automatic caching on open\n- Downloads manager with bulk removal\n- Offline detection and seamless offline reading\n\n### Server \u0026 Sync\n- Audiobookshelf login with secure token storage and insecure-connection warnings\n- Bidirectional progress sync with last-update-wins conflict resolution\n- Periodic auto-sync and offline queueing\n- Reading session time tracking\n\n## Requirements\n\n- Android 7.0 (API 24) or higher\n- A running [Audiobookshelf](https://www.audiobookshelf.org/) server\n\n## Distribution\n\n| Channel | Status |\n|---------|--------|\n| Google Play Store | Planned |\n| F-Droid | Planned |\n| Codeberg Releases | CI-built signed APK |\n\n## Architecture\n\nRiffle follows a strict layered architecture designed for future Kotlin Multiplatform (KMP) migration:\n\n```\napp/                  # Android UI — Jetpack Compose + Hilt\ncore/domain/          # Pure Kotlin — entities, repository interfaces, domain logic\ncore/network/         # Pure Kotlin — OkHttp-based ABS API client\ncore/database/        # Android — Room database\ncore/data/            # Android — repository implementations, Keystore token storage\n```\n\n## Development\n\n### Prerequisites\n\n- Android SDK (via Android Studio or `sdkmanager`)\n\n### Bootstrap\n\n```sh\nmake bootstrap   # Install JDK 17, download Gradle wrapper, fetch bundled fonts\n```\n\n### Build\n\n```sh\nmake build       # Assemble debug APK\nmake test        # Run unit tests\nmake check       # Full CI check: build + lint + tests\nmake install     # Build and install debug APK on connected device\n```\n\n## Glossary\n\nSee [`CONTEXT.md`](CONTEXT.md) for the full domain glossary (Server, Library, Library Item, Cache, Download, Reading Session, Progress Sync, etc.).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpkmetski%2Friffle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpkmetski%2Friffle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpkmetski%2Friffle/lists"}