ReadPortGitHub

Self-hosted · open source · AGPL-3.0

Read and listen
in perfect tandem.

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 Tin Orchard · 1. The Gravel MileRead along

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.

1.25×· narration follows the page4 pages left in chapter

Chapter 3 of 28

The Quarry Road

Read by a patient narrator · 11h 40m

4:26:186:52 left in chapter−7:13:42
1530
Sleep1.25×3

How a pair is made

From two separate files to the same sentence.

EPUBthe textAUDIOBOOKthe narration

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

Not another library manager. The place you actually read.

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.

A serious reader

Paginated or scrolling, two-page spreads, five themes, seven typefaces, right-to-left books. Highlights, notes and bookmarks, all searchable from one page.

A resilient player

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.

One place, kept in both

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

Three gates. Only the narration can open the middle one.

  1. 01

    Mount, read-only.

    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.

  2. 02

    Pair, then listen.

    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.

  3. 03

    Switch mid-sentence.

    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.

Pairing reviewLinked · sentence exact
Title & authorThe Tin Orchard · Marla Vane, both editions
IdentifiersISBN on the ebook, none on the audio
Languageen · en
Length104,200 words against 11h 40m - plausible
The narration itself830 of 880 sentences timed · coverage 92.8%

Every row is real evidence the app shows; nothing here links two books by itself.

The engine

Forced alignment, not transcription.

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

72 s
to time a 67-minute audiobook
≈ 6 min
for a six-hour audiobook, on a 6-CPU box
7%
of the audio actually decoded
830 of 880
sentences timed on the validation book
1 model
317 MB, every language, one download
0 bytes
written into your library

Read along: the reader, with a voice.

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

The details are where a reading app is won.

Marks worth keeping

Five highlight colours, notes under a dashed underline, bookmarks. One page searches every mark in every book.

Shelves and groups

Automatic shelves, your own, an ordered reading list - plus groups built from the tags, narrators and series your files already carry.

A player that behaves

Chapter ticks, time left in the chapter, skips set per direction, a sleep timer, and an ambient tint taken from the cover.

Offline, honestly

Per-title downloads verified byte for byte, and a Downloaded shelf that works with no network at all.

A household, not a login

Three roles and one-time invite links, with progress, marks and downloads kept per person. No open sign-up.

Alignments are files

One gzipped JSON per pair, in a folder you choose, matched back by fingerprint. A reinstall adopts them on its first scan.

Progress that cannot regress

A stale background tab can never move you backwards, and a deliberate rewind always wins.

No cloud, no socket

Nothing leaves the machine. Non-root, read-only mounts, no Docker socket, optional header SSO.

Self-host

One container in front of the folders you already have.

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 account
  • Library folders mounted :ro, always
  • One read-write folder: your alignments
  • 317 MB of disk for the one model, only when you ask
  • Non-root, no Docker socket, 2 GB cap on alignment
  • Reverse proxy with HTTPS for the installable PWA
  • Header SSO from Authentik, Authelia, oauth2-proxy (optional)

Coexists with Calibre / Calibre-Web Automated, Audiobookshelf, Shelfmark and plain folders. Full guide: docs/self-hosting.md.

Questions

The honest answers.

Every claim here is documented in the repo, which says exactly where each one stands.

Does ReadPort change my library files?

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.

Do I need a GPU for alignments?

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.

Which formats does it read and play?

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.

Does it replace Audiobookshelf or Calibre?

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.

Can my family use it?

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.

What is the license?

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.

Give your library a reader.

It takes a minute to start and it never touches your files.