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

Emaki

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

stack // Kotlin / Jetpack Compose / Room / Hilt / llmedge

architecture flow

01

MainActivity ties together the reader, library, explore, deep links, and local file picking.

02

ContentRepository turns remote chapters, PDF, EPUB, and HTML into one reading pipeline.

03

SummaryService uses llmedge to load a local model and summarize chapters without sending the text anywhere.

04

Compose, Room, and Hilt hold it together as a normal app.

engineering notes

Emaki (formerly 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