Books and audiobooks in one app, even offline
Reads EPUB, FB2 and PDF and plays MP3 and M4B audiobooks. Books stay on the phone and open without internet; the built-in store has 20 free classics.
Personal project by Mykhailo Plokhin. Installs from the browser on Android and iPhone.
Next.js · TypeScript · IndexedDB · OPFS · Service Worker



The problem
Most readers handle either text or audio, want an account, or break on real-life files: odd encodings, zipped folders, MP3s without chapters.
- Russian FB2 files come in windows-1251 or koi8-r, often mislabelled.
- An audiobook is usually a folder of files, or a ZIP made by the iPhone Files app.
- Reading and listening to the same book means two positions to keep in step.
How it is built
Everything runs in the browser. Files go through the same parsers whether they come from the phone or the store; records go to IndexedDB, large files to the browser's private file system.

Key decisions
Each choice, and the alternative it beat.
Parse books in the browser, no server
Books never leave the device, and there is no backend to run or pay for.
A streaming ZIP reader
An audiobook folder zipped on an iPhone can be gigabytes. Reading entries as a stream keeps them out of memory, including ZIP64 archives and Russian file names.
Large files in the private file system
The Origin Private File System holds big files without the limits of older storage; older iOS Safari falls back to IndexedDB.
One position for text and audio
When a book has an audio edition, switching maps the place by chapter and by how far into it you were.
Numbers
Boowie is live: open it on a phone and add it to the home screen. Every figure here is checked in the code or on the live app.
| Figure | What it means | Basis |
|---|---|---|
| 5Formats | EPUB, FB2, PDF, MP3 and M4B, plus ZIP archives of them.Measured | Measured |
| 20Free books | Public-domain titles in the built-in store; the audiobooks are narrated with RHVoice.Measured | Measured |
| OfflineWorks | A service worker caches the app, and books are stored on the device.Measured | Measured |
- Measured
- — Checked in the code or on the live build
Need something similar?
Tell us what you need in a few lines. A person from the team replies.
Start a project