A lightweight, all-in-one Android reader for web novels, manga, manhwa, and local documents, built with modern Kotlin and Jetpack Compose for a seamless, distraction-free reading experience.
EasyReader is a clean, focused environment for consuming digital content. Whether you're catching up on the latest light novel chapters, reading high-resolution manga, or parsing local PDFs, EasyReader handles it all with intelligent caching, automatic progress tracking, and AI-powered insights.
Why EasyReader?
- Discovery Hub: Integrated exploration of popular sources like MangaBat and NovelFire.
- Smart Scraping: "Smart Scraper" engine that extracts content from almost any online novel.
- Offline-first: Pre-fetch and cache entire series for uninterrupted reading anywhere.
- Distraction-free: Immersive Material3 design with edge-to-edge display and dark theme.
- AI-powered: On-device LLM integration for instant chapter summaries.
- Unified Explore: Browse popular titles or search across multiple novel and manga sources simultaneously.
- Extensible Sources: Native support for major platforms with a generic fallback for unknown sites.
- Detailed Previews: View summaries, author info, and chapter lists before adding to your library.
- Web Novels: Clean, text-focused reading.
- Manga & Manhwa: High-performance image rendering.
- Local Documents: Support for PDF, EPUB, and HTML files with automatic formatting.
- Deep Link Support: Add content directly by pasting a URL into the app.
- Immersive UI: Full-screen, edge-to-edge display with Material3 dynamic colors.
- Smart Navigation: Fluid swipe gestures to navigate chapters and auto-restore scroll position.
- Intelligent Formatting: Automatic removal of page numbers, ads, and HTML noise.
The app uses product flavors to make AI summarization optional:
- standard (default): Clean-clone debug builds do not require the
llmedgelibrary. AI summarization UI is visible but reports "unavailable". - ai: Enables on-device AI summarization and downloads
llmedgeautomatically from Maven Central when you build the AI variant.
For day-to-day development, use the default debug path below. If you want the AI-enabled flavor, build the aiDebug variant in Android Studio or with Gradle.
- Cloud-free Caching: Store everything locally for privacy and speed.
- Progress Tracking: Visual indicators and "Currently Reading" markers for every item.
- Batch Operations: Easily manage your collection with multi-select delete and bulk updates.
- JDK 17+
- Android Studio with the Android SDK installed
- Android SDK Platform 36 to match
compileSdk = 36
1. Clone the repository
git clone https://github.com/Aatricks/EasyReader.git
cd EasyReader2. Build and run
Start with the default debug workflow. These commands do not require release signing material or any local AAR setup, and they validate the default standardDebug variant used for PRs:
./gradlew :app:assembleStandardDebug
./gradlew :app:installStandardDebug
./gradlew :app:testStandardDebugUnitTest
./gradlew :app:lintStandardDebugOpen the project in Android Studio, sync Gradle, and run the default debug variant if you prefer the IDE.
For CI-style flavor coverage, PR/main validation uses only :app:lintStandardDebug, :app:testStandardDebugUnitTest, and :app:assembleStandardDebug.
AI flavor validation runs separately as ai-debug-validation on push to main, workflow_dispatch, and scheduled CI runs.
Normal unit-test tasks do not compile or run benchmark sources. Files under app/src/benchmark/java are kept as opt-in manual benchmark references and are not part of PR CI. There is currently no dedicated Gradle benchmark task; add one with a separate source set and classpath before relying on these sources for automated benchmark runs.
Release builds are separate from the normal debug workflow.
The app keeps the legacy io.aatricks.novelscraper application ID on purpose so existing installs can continue updating in place. The source namespace has moved to io.aatricks.easyreader to match the EasyReader name.
If you need a release build, create a local keystore.properties file at the repository root with these keys:
storeFilestorePasswordkeyAliaskeyPassword
The storeFile value should point to your local keystore file. Do not commit keystore.properties or the keystore itself; keep them private and machine-local.
AI summarization is optional and does not affect the default debug path.
To build the AI-enabled flavor, use the explicit aiDebug tasks. These are optional and require the AI dependency path to resolve:
./gradlew :app:assembleAiDebug
./gradlew :app:testAiDebugUnitTest
./gradlew :app:lintAiDebugOr select the aiDebug build variant in Android Studio. Gradle will download llmedge from Maven Central automatically; no local AI AAR is required.
If you find EasyReader useful, please consider:
- Starring the repository
- Contributing with new sources or feature enhancements


