Vellum/internal
mithral c3b7db7114 Phase 4: CBZ comics module and reader
- comics: reads pages straight out of the archive on demand. No extraction
  pass, so a 200-page CBZ is not materialised for a reader who views three
  pages. Pages are read into memory and served via http.ServeContent, which
  gives Range for free.
- natural page ordering: page2 sorts before page10. Lexical ordering shuffles
  a numbered archive, which is the difference between a readable book and a
  scrambled one.
- skips __MACOSX and dotfiles; rejects archives with no images.
- cover is the first page.
- media.Item gained ModTime (from the backing file) so page responses carry a
  Last-Modified and support conditional GETs.
- web: ComicReader with a bounded prefetch window (two pages each way), page
  jump, keyboard nav, and progress stored as a page number.

Verified: 3-page CBZ served in natural order, out-of-range 404, cover from
page 1, progress round-trip. svelte-check 0/0.
2026-10-09 21:07:59 -04:00
..
auth Phase 1: accounts, sessions, per-library grants 2026-10-09 16:31:24 -04:00
core Phase 2: libraries and the file scanner 2026-10-09 16:33:56 -04:00
httpapi Web UI: Svelte app, embedded into the binary 2026-10-09 16:40:58 -04:00
httpx Phase 1: accounts, sessions, per-library grants 2026-10-09 16:31:24 -04:00
library Phase 2: libraries and the file scanner 2026-10-09 16:33:56 -04:00
media Phase 4: CBZ comics module and reader 2026-10-09 21:07:59 -04:00
modules Phase 4: CBZ comics module and reader 2026-10-09 21:07:59 -04:00
progress Phase 3: EPUB module, file streaming, per-user progress 2026-10-09 16:36:27 -04:00
stream Phase 3: EPUB module, file streaming, per-user progress 2026-10-09 16:36:27 -04:00