Self-hosted · open source · AGPL-3.0
A reader and a player for the ebook and audiobook libraries you already keep. It mounts them read-only, pairs matching editions, and moves you between the page and the narration at the same sentence.
One containerNothing leaves your machineLives beside Calibre-Web Automated and Audiobookshelf
The road out of town was gravel for the first mile, and then it was nothing at all. My grandmother drove it twice a week for thirty years and never once admitted she knew the way by feel, though she took the bend above the quarry without slowing and I never saw her check the mirror. The orchard had been tin, she said, long before anyone thought to call it that. It was the only argument she ever won.

Chapter 3 of 28
The Quarry Road
Read by a patient narrator · 11h 40m
How a pair is made
Every sentence now has a time.
Between anchors the timeline is filled in and checked. Now the page and the voice can hand off to each other at the same sentence.
The reading layer for a self-hosted library
Calibre and Audiobookshelf are good at keeping books. ReadPort sits beside them, on the same folders, and owns only what a reader needs: your progress, your marks, and the timings that tie an audiobook to its text.
Paginated or scrolling, two-page spreads, five themes, seven typefaces, right-to-left books. Highlights, notes and bookmarks, all searchable from one page.
Chapters, 0.5× to 3× with the pitch kept, a sleep timer, lock-screen controls. A folder of mp3s plays as one book, and progress survives a killed tab.
Where an ebook and an audiobook are the same work, ReadPort times the narration against the text. Switch mid-sentence, or read along while it plays.
Your library already has the book and the narration. ReadPort teaches them to keep the same place.
How it works
Point it at the folders Calibre or Audiobookshelf already manage. The only folder ReadPort writes to is the one where your finished alignments are saved.
Editions are proposed from title, author, identifiers and length, with the evidence shown. Metadata never links two books on its own - the narration is checked first.
Listen from here in the reader; Read from here in the player. Reading to listening lands a few seconds behind you on purpose - a repeated line is a nuisance, a spoiler is not.
Every row is real evidence the app shows; nothing here links two books by itself.
The engine
The words are already in the EPUB; only their timing is unknown. One acoustic model listens to about 7% of the narration, finds where audio and text provably agree, and interpolates the rest - then listens again wherever the reading rate says the interpolation would be a lie.
A six-hour audiobookember = the seconds actually decoded · ticks = anchors
The narration starts at the sentence in front of you, the spoken line is washed as it is read, and the page turns itself to keep up. Tap any line to move the voice to it. Where the alignment has nothing to say, the wash is dropped and the bar says so, rather than guessing.
Everything else a reader wants
Five highlight colours, notes under a dashed underline, bookmarks. One page searches every mark in every book.
Automatic shelves, your own, an ordered reading list - plus groups built from the tags, narrators and series your files already carry.
Chapter ticks, time left in the chapter, skips set per direction, a sleep timer, and an ambient tint taken from the cover.
Per-title downloads verified byte for byte, and a Downloaded shelf that works with no network at all.
Three roles and one-time invite links, with progress, marks and downloads kept per person. No open sign-up.
One gzipped JSON per pair, in a folder you choose, matched back by fingerprint. A reinstall adopts them on its first scan.
A stale background tab can never move you backwards, and a deliberate rewind always wins.
Nothing leaves the machine. Non-root, read-only mounts, no Docker socket, optional header SSO.
Self-host
Docker, your library, and enough CPU to be patient with. The stock compose file mounts a bundled sample library, so everything is usable within a minute.
# 1. get it
git clone https://github.com/ilanKushnir/readport
cd readport
# 2. set RP_SESSION_SECRET (openssl rand -hex 32)
cp .env.example .env
# 3. point the library mounts at your folders
docker compose up -d
# then open http://<host>:8383 and create the admin accountCoexists with Calibre / Calibre-Web Automated, Audiobookshelf, Shelfmark and plain folders. Full guide: docs/self-hosting.md.
Questions
Every claim here is documented in the repo, which says exactly where each one stands.
No. Your library folders are mounted read-only and never written. The one writable folder is the one you choose for finished alignments: a .rpalign file per pair, readable with gunzip, and the only thing ReadPort ever puts there.
No. Alignment is CPU only. On a 6-CPU box a 67-minute audiobook is timed in 72 seconds and a six-hour one in about six minutes. Reading and listening need almost nothing.
EPUB for ebooks. For audio: m4b, mp3, m4a, flac, ogg and opus, single-file or a folder of files. PDF, MOBI/AZW3 and comics are reported as unsupported rather than rendered badly.
No, and it does not try to. ReadPort is a reading layer over the folders they manage: keep them for acquisition and organising, and let ReadPort do the reading, the listening and the switching.
Yes. The setup wizard creates the admin account; after that you add people or send one-time invite links. Three roles, and everyone gets their own progress, marks and downloads.
AGPL-3.0-or-later. The one model download, Meta’s MMS forced aligner, is CC BY-NC 4.0 and is never fetched behind your back: the wizard offers it, Settings has it, and a command installs it on a headless server.
It takes a minute to start and it never touches your files.