Why Loa exists
Long documents rarely arrive at a convenient moment. A PDF may need attention during a commute, an EPUB may compete with visual fatigue at the end of the day, and a useful passage shared from another app can disappear before it becomes part of a real reading habit.
Loa was built around a simple idea: listening should not make the reader lose the text, and organizing a document should not require sending its contents to another service.
What it does
Loa is a local-first Android reading companion. It brings PDFs with selectable text, EPUB, DOCX, TXT, HTML, Markdown, RTF and ODT files into one library. Users can also share text from another Android app or open a public HTTPS page in the Web Reader.
From there, Loa can:
- read a document aloud with Android's native text-to-speech voices;
- keep the active passage visible while narration moves through the document;
- remember progress and continue from the same place;
- save bookmarks and notes linked to the passage that created them;
- organize documents with search and categories;
- tune language, voice and pronunciation per document with Loa Pro; and
- surface recent activity as a calm reading rhythm rather than an attention feed.
The free core supports unlimited local documents, offline use for imported content, native TTS, notes, bookmarks, search, categories and progress. It has no ads. Document content remains on the device.
How we built it
The app is written in Flutter and Dart, with Riverpod for state management, GoRouter for navigation and Drift/SQLite for durable local data. Android's native TTS engine provides speech, including voices that are already available offline on the device.
Supabase provides authentication and the small server-side surfaces that need a trusted boundary. RevenueCat powers the monthly and annual Loa Pro subscription, purchase and restore flows, paywall state and entitlement lifecycle. RevenueCat webhooks feed a server-side entitlement model, with reconciliation for ambiguous or delayed billing states so the interface never has to guess whether Pro access is valid.
We also built privacy-aware observability. Crash reports are scrubbed before transmission, and product analytics use a narrow allowlist of semantic events. No document text, title, note, URL, search term, account identifier or persistent device identifier is attached to those events. Server storage contains aggregate daily counts, and sharing can be turned off in settings.
The design
Loa treats reading as a sustained activity, not a feed. The interface uses paper-like surfaces, large touch targets, restrained motion and persistent playback controls. During narration, the active passage is highlighted inside the document instead of being copied into a disconnected transcript.
The same visual language connects the library, mini-player, reader, notebook and reading-rhythm profile. Notes and bookmarks appear in a bottom sheet over the source passage so context is never far away. Per-document voice controls keep advanced options close to the document they affect.
Challenges
The hardest product problem was keeping several systems in agreement: pagination across different formats, the text position followed by TTS, local progress, navigation state and subscription entitlements. EPUB and PDF do not expose reading position in the same way, and an Android lifecycle transition can arrive while billing or navigation is also changing.
We addressed this with stable document segments, explicit page-position rules, lifecycle-focused tests, idempotent RevenueCat reconciliation and fail-safe navigation guards. Automated testing later revealed two navigation/lifecycle races before the final production build; fixing those cases reinforced an important lesson: a polished reading interface depends as much on state transitions as it does on typography.
What we learned
Building Loa reinforced three principles:
- Accessibility is strongest when it is part of the ordinary workflow, not a separate mode.
- Monetization state must be treated as distributed state: purchases, restores, webhooks and app lifecycle events can arrive out of order.
- Privacy claims only matter when the architecture, tests, store listing and product copy all tell the same story.
What's next
Now that Loa is publicly available, the next phase is evidence-led improvement. We will use aggregate usage signals, Google Play search terms, reliability data and direct feedback to refine import flows, voice discovery and retention. OCR, additional speech options and cross-device continuity will only move forward when their value, cost and privacy trade-offs are clear.
Log in or sign up for Devpost to join the conversation.