Skip to content

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.

koreader              # launch from terminal or app menu

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:

  1. Top menu (tap/click top of screen) → SearchOPDS catalog
  2. Add your catalog URL (e.g. https://CHANGEME-audiobookshelf/opds)
  3. 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):

  1. Top menu → SettingsKOSync plugin
  2. Server: your KOSync server URL
  3. Username and password
  4. 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 → SettingsDocument 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.

  • 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

  1. Click a book → Play button
  2. Player controls appear at the bottom:
  3. Play/pause, skip forward/back 30 seconds, playback speed
  4. Chapter list (≡ icon) — jump between chapters
  5. 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.

jellyfin-media-player        # launch from terminal or app menu

First-time connection

  1. Launch the app → it will ask for your server address
  2. Enter your Jellyfin server URL (check selfhosted.nix for the address, or reach it via Tailscale if not on the public domain)
  3. 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 seconds
  • F — fullscreen
  • M — 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:

nix shell nixpkgs#yt-dlp
mpv "https://www.youtube.com/watch?v=..."

Or add yt-dlp to your home.packages permanently.