A local-first EPUB reader for Android. Books, reading progress, and annotations stay on the device, with no account and no telemetry.

Role

Local-First Android Developer

Timeline
September 2026

Technologies

  • Kotlin
  • Jetpack Compose
  • Room
  • Readium
  • Android

Tools

  • Android Studio
  • JUnit
  • Espresso
  • GitHub Actions

Background

Most reading apps treat a personal library as a reason to collect data. Leafline takes the opposite approach: books stay on the device and reading progress is stored locally.

Solution

Leafline imports EPUB files into a local library, extracts metadata and covers, and provides a focused reading view. Room-backed reading sessions track progress, bookmarks, and annotations. It can also browse an OPDS catalog and download into the same library, so books can arrive from a server of your own without going through a desktop. Reading progress lives on the device; pushing it between devices through KOReader-style records is the next piece of work.

Process

The project was built around testable local library and reader flows, with no remote service in the picture. Import reconciliation, cover caching, reading state, annotations, and RTL/CJK rendering each have dedicated tests. Instrumented tests exercise the main library and reader journeys on Android.

Final Product

Impact

The result is a private reading workflow that works without an account, network connection, or telemetry pipeline. The codebase also provides a foundation for reliable local library management, so EPUB files are treated as worth keeping.

Reflection

The difficult part was preserving reading state while files move, change, or are imported again. Keeping identity and progress logic separate from the UI made those cases easier to reason about. Future work would focus on richer library organization and broader sync interoperability.