Lesson 15 — Reading & Listening¶
Consuming books, audiobooks, media, and video. Sources: vendor/nixproject/modules/home/apps.nix (KOReader, Jellyfin, mpv) and vendor/nixproject/modules/home/webapps.nix (AudioBookshelf PWA).
KOReader — ebooks¶
KOReader is a document reader optimised for e-ink devices but works well on Linux too. It handles EPUB, PDF, MOBI, CBZ (comics), and more. Configured with OPDS catalog browsing and KOSync for reading progress sync.
Opening books¶
- File browser on launch — navigate to your ebooks directory
- Drag and drop files onto the KOReader window also works
- Or set up an OPDS catalog (see below) to browse your library directly
OPDS catalog (browse your library from KOReader)¶
If you have Calibre-Web, Audiobookshelf, or another OPDS server, you can browse and download books directly inside KOReader:
- Top menu (tap/click top of screen) → Search → OPDS catalog
- Add your catalog URL (e.g.
https://CHANGEME-audiobookshelf/opds) - Browse and download books from within KOReader
KOSync — reading progress sync¶
KOSync keeps your reading position in sync across devices (if you also read on a phone or tablet with KOReader):
- Top menu → Settings → KOSync plugin
- Server: your KOSync server URL
- Username and password
- Enable → your position saves to the server whenever you turn a page
Reading controls¶
| Action | Input |
|---|---|
| Next page | Right arrow / right side of screen |
| Previous page | Left arrow / left side of screen |
| Top menu (settings, etc.) | Click/tap top of screen |
| Bottom menu (progress, TOC) | Click/tap bottom of screen |
| Table of contents | Bottom menu → TOC icon |
| Highlights / notes | Select text → highlight or add note |
| Search | Bottom menu → search icon |
Useful settings¶
- Font size: Bottom menu → Font size slider
- Margins: Top menu → Settings → Document settings
- Night mode: Top menu → Gear icon → Nightmode
- Page turn animation: Top menu → Settings → disable if it feels slow
AudioBookshelf — audiobooks¶
AudioBookshelf at https://CHANGEME-audiobookshelf (fill in your server's public URL) is your self-hosted Audible replacement. Your config creates a PWA launcher for it in the app menu.
Open AudioBookshelf from the app menu.
Navigating your library¶
- Library → browse all audiobooks by title, author, or series
- Listen → currently in-progress books
- Bookmarks → saved positions
- Search bar at the top → search by title, author, narrator
Listening¶
- Click a book → Play button
- Player controls appear at the bottom:
- Play/pause, skip forward/back 30 seconds, playback speed
- Chapter list (≡ icon) — jump between chapters
- Your progress is saved server-side and syncs to the mobile app
Mobile app¶
The AudioBookshelf mobile app (iOS/Android) syncs listening progress with the server, so you can pick up where you left off between phone and laptop.
Playback speed¶
The speed control (1x, 1.5x, 2x, custom) is in the player bar. Most non-fiction is comfortable at 1.5–1.75x once you get used to it.
Jellyfin — media server client¶
The jellyfin-media-player desktop app connects to your Jellyfin server on stronghold. It plays movies, TV shows, and music from your server.
First-time connection¶
- Launch the app → it will ask for your server address
- Enter your Jellyfin server URL (check
selfhosted.nixfor the address, or reach it via Tailscale if not on the public domain) - Log in with your Jellyfin username and password
The interface¶
The app is essentially Jellyfin's web UI but wrapped in a desktop player with better media key support and hardware decoding.
- Home → recent additions and continue watching
- Movies / TV Shows / Music → your libraries
- Search icon → search across everything
Playback¶
- Most controls are the standard media player controls
- Keyboard shortcuts (in the player):
Space— play/pause←/→— skip 10 secondsF— fullscreenM— mute↑/↓— volume
Transcoding vs direct play¶
Jellyfin can direct play (stream the file as-is) or transcode (convert on the fly). Direct play is always better — no quality loss and no server CPU usage. If you're getting buffering, the server may be transcoding a format your player can't handle natively. Check Settings → Playback and enable formats that match your files (H.264, H.265/HEVC, AV1).
mpv — quick video playback¶
mpv is a minimal video player for watching files locally without opening a full application.
mpv video.mp4 # play a file
mpv https://... # play a URL (YouTube works with yt-dlp installed)
mpv --shuffle music/*.mp3 # shuffle a playlist
mpv --loop video.mp4 # loop
Keyboard controls (during playback)¶
| Key | Action |
|---|---|
Space |
Play / pause |
← / → |
Seek -/+ 5 seconds |
Shift-←/→ |
Seek -/+ 1 second |
↑ / ↓ |
Volume up/down |
M |
Mute |
F |
Fullscreen |
Q |
Quit |
S |
Screenshot |
O |
Toggle on-screen progress bar |
, / . |
Step frame backward/forward (when paused) |
[ / ] |
Decrease / increase playback speed |
9 / 0 |
Decrease / increase volume |
Watching YouTube with mpv¶
Install yt-dlp and mpv can play YouTube URLs directly:
Or add yt-dlp to your home.packages permanently.