- build 2025.10
- stack · 8 components
- published 2025-10-23
Emaki
architecture flow
MainActivity ties together the reader, library, explore, deep links, and local file picking.
ContentRepository turns remote chapters, PDF, EPUB, and HTML into one reading pipeline.
SummaryService uses llmedge to load a local model and summarize chapters without sending the text anywhere.
Compose, Room, and Hilt hold it together as a normal app.
visuals

engineering notes
Emaki (formerly EasyReader, named after the Japanese picture scroll) is an Android reader for web novels, manga, manhwa, EPUB, and PDF. It runs fully offline, with local chapter summaries powered by llmedge.
What it does
- Sources. Built-in scrapers for novel and manga sites (AsuraScans, MangaBat, NovelFire, Novelight), plus a
SmartSourcethat infers the parser for a site it hasn’t seen. Unified search runs across all sources at once. A kill switch can disable a source remotely when a site changes. - Offline. A
ChapterDownloadWorkeron WorkManager pre-fetches whole series with a per-host throttle and a download limiter. An offline chapter store serves them back. A reconciler keeps download status honest after crashes. - Formats. Web chapters, EPUB, PDF, and local HTML all go through
ContentRepositoryinto one reading pipeline. EPUB and PDF images are cached on disk. Manga pages are tiled and zoomable, with image bounds parsed ahead so the scroll doesn’t jump. - Reader. Paged and scrolling modes, text paginator with its own cache, reading position restored per chapter, reading sessions tracked in Room, brightness, fonts, themes, reduced motion.
- Library. Filters, sort modes, multi-select, auto-deletion policy, library update worker that checks for new chapters, and full backup and restore of library and settings (schema versioned, migration tested).
- Self-update. The app checks GitHub releases, downloads the APK, and installs it. No store in the middle.
- Safety. URL sanitiser, safe DNS, redirect interceptor, and a security test suite for the reader’s WebView paths.
The AI part
Chapter summaries run on the phone through llmedge. LlmEdgeSummaryEngine pulls Qwen3-0.6B Q4_K_M from Hugging Face, streams a 256-token summary, and the text never leaves the device. The app has two flavours: standard builds without llmedge (the summary button shows as unavailable) and ai pulls llmedge from Maven Central.
Size and testing
About 54k lines of Kotlin. 87 test files and 8 macrobenchmarks (cold and warm startup, PDF opening, manhwa scrolling, restored reader, AI initialisation), with a baseline profile generator. Min SDK 30.