Emilio Melis / aatricks
  • build 2025.10
  • stack · 5 components
  • published 2025-10-23

EasyReader

An Android reading app where the chapter summaries run on the phone instead of calling a server.

01Product scope
Discovery, library, reader, and summary workflow
02Reading inputs
Web chapters, PDF, EPUB, and local HTML
03AI mode
On-device chapter summaries through llmedge
04Product focus
Offline-first Android UX

why it matters

  • It's the app that uses llmedge in production.
  • Saved state, file import, and on-device summaries in one workflow.
  • Four input formats go through one reading pipeline, with reading position kept across sessions.

engineering notes

EasyReader is an Android reading app: discovery, a library, and a multi-format reader, with the AI feature running on the phone. It’s also where llmedge actually ships.

The app

The main job is reading, and it covers the whole loop:

  • finding content and organizing a library
  • opening web chapters, PDF, EPUB, manga/manhwa, and local HTML
  • keeping your position and library between sessions
  • working fully offline

Every format goes through ContentRepository into one pipeline, so the reader doesn’t care where a chapter came from.

The AI part

Chapter summaries run on the device through llmedge:

  • SummaryService loads a local model and summarizes with no network call
  • the text never leaves the phone
  • the summary sits inside the reading flow

Architecture

  • MainActivity runs the reader, library, explore, deep links, and file picking
  • ContentRepository handles import and normalizing formats
  • SummaryService hands off to llmedge instead of putting inference in the UI
  • Compose, Room, and Hilt give it a normal app lifecycle