Jake Goldsborough

shellbooks: A Terminal Audiobook Player

May 04, 2026

5 min read

I have a music player in the terminal (shelltrax) and a podcast player in the terminal (shellcast). Audiobooks were the obvious gap.

So I built shellbooks.

cargo install shellbooks

It's a TUI audiobook player and library manager. cmus-inspired keybinds, ratatui rendering, rodio for audio, the same shape as the other two shell* tools. Open source, offline-first, runs on Linux and macOS.

Why audiobooks need their own player

I wanted a CLI audiobook player that follows the cmus conventions I already use for music. A real TUI audiobook player on Linux, not a GUI app shoved into a terminal window.

Music players treat tracks as the unit. Podcast players treat episodes as the unit. Audiobooks need the book as the unit, with chapters as the unit inside a book. That changes a few things:

None of this is exotic. It just doesn't fit the music or podcast model directly.

The Stack

Same stack the other shell* tools use. The point of building these in a series is that each one starts halfway done.

Interface

Three views, swapped with 1 / 2 / 3:

A persistent footer sits on every screen with the book title, current chapter, position, total duration, speed, and a progress gauge. Press i anywhere to open a centered modal with the full metadata for the selected book.

What's Working

What's Not (yet)

A Bug Worth Mentioning

Imported a book and the title showed as "Track 001."

The reason: I was reading the title tag from the first audio file. For a multi-file audiobook, the per-track TIT2 is the chapter title, not the book. The book title belongs in the album tag. So now apply_to_book takes a multi_file flag and uses the album tag in that case, falling back to the directory name if there's no album.

For single-file .m4b it still uses the title tag normally, since there the file is the book.

The kind of bug that's obvious in hindsight and only really shows up once you point the tool at real publisher data.

Building it in a Series Pays Off

The bulk of the work on shellbooks was on the audiobook-specific bits: chapter atom parsing, the multi-file album-as-title rule, position tracking that survives speed changes and pause/resume, the autosave loop. Almost none of it was on TUI scaffolding, the file browser, the event loop, or the release pipeline. All of that was lifted from shelltrax.

It's also why I'm thinking about pulling the shared TUI bits into a shell-tui crate. The ListSelector, the BrowserState, the event loop, the cmus-style screen jumps, the Makefile template, the GitHub Actions release workflow - all of it is duplicated nearly verbatim across three apps now. Three is the inflection point.

Try It

cargo install shellbooks
shellbooks

Press 3 to open the file browser, navigate to your audiobooks, press a to import a book directory or .m4b. Press 1 to return to the library, Enter to start playing.