An EPUB reader that never leaves the terminal
tbook exists because I wanted to read without opening another window — and without losing the cover, the illustrations or the paragraph I stopped at.
I read a lot, and most of my day already happens in the terminal. Reading there, though, has always been a second-class experience: existing readers treat the EPUB as plain text and throw away exactly what the format does well — cover, illustrations, hierarchy. Desktop readers fix that by charging you one more window and an app that wants your attention. tbook is an attempt to pay neither price.
What a TUI usually throws away
An EPUB is, inside, a zip of XHTML with images — none of that is a mystery, but drawing images in a terminal is work, and it's easier to pretend the book is just text. The decision that shaped the project was not to pretend: the cover opens the first page, and illustrations become 24-bit ANSI art, falling back to 256 colours when the terminal can't keep up.
The rest is tuning what actually annoys you while reading: an adjustable 40-to-120-column measure (76 by default), three themes (dark, light, sepia) and keyboard-only navigation — arrows for chapters, / to search, n/N to jump between matches, b to bookmark.
Reading memory is the feature, not the extra
What makes a reader get used or abandoned isn't rendering: it's not losing your place. On exit, tbook stores position, bookmarks and reading time per book; tbook stats shows the history and tbook library browses the shelf with cover and progress beside it. tbook read harry opens by name.
I also embedded Project Gutenberg access: tbook search and tbook download pull classics straight into the library, no browser involved. That kind of integration only makes sense in a terminal tool — if I have to open a browser to get the book, the reader lost the reason to exist.
What holds it up
It's a single Go binary with the CLI separated from the core (internal/cli, internal/core, internal/epub), six test files covering EPUB parsing, session, library, statistics and Gutenberg, and two GitHub Actions pipelines: CI on every push and releases via goreleaser. A reader that stores your position needs predictable releases — nobody wants to recompile to read the next chapter.
Left out on purpose: cross-machine sync (state is local), mouse, and any window at all. To read the code or install it: tbook.