Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Jun 12:08

[0.4.0] — 2026-06-10

First PyPI release as bookreader-tui. Bundles every change from
the post-0.3.0 cleanup waves plus the Phase 4 / 5.0 polish work.

Added

  • Phase 4 — Library curation. C opens a Collections overview
    (every book grouped by collection); W opens a Wishlist overview
    with in-place removal via d.
  • Reader-side library actions. c toggles completion, C and W
    push the collection / wishlist overviews from inside the reader —
    no more "quit to library first" round-trip.
  • Inline images in two-page mode. PagedView was rewritten from
    Static-render to widget-mount: each spread is Horizontal[Vertical, Vertical] with mounted Static + Image widgets per page. Images
    render at natural EPUB size with width: auto; max-width: 100%.
  • Auto-enable inline images in graphics-capable terminals
    (xterm-kitty, iTerm2, WezTerm). Explicit BOOKREADER_IMAGES_ENABLED
    still wins. New I key toggles at runtime.
  • Configurable reading width. BOOKREADER_READING_WIDTH (60–200)
    overrides the column max. Default raised 84 → 110.
  • Library UX polish. Empty-state hints when a filter has 0 books;
    filter-aware status strip (showing 0 of 1 · filter: Want to Read);
    sidebar + table get accent-coloured focus borders; book table has
    explicit column widths.
  • RepositoryError at the SQLite boundary so UI code can route
    through the central BookReaderError handler.
  • Lowercase w hint on the library — instead of silently doing
    nothing, surfaces "Press Shift+W to open the wishlist".
  • Dark theme contrast — Tokyo-Night-adjacent palette replaces the
    muted Catppuccin Mocha values (brighter foreground, punchier accent).
  • Ctrl+P theme picker scoped to bookreader-* — the 20+ Textual
    built-in themes no longer pollute the picker.
  • CI on every push / PR — ruff format + check, mypy --strict,
    pytest across Python 3.11 and 3.12.

Fixed

  • Bare except Exception in UI handlers replaced with
    except BookReaderError; programming bugs (KeyError, AttributeError)
    no longer get silently rendered as "Add failed" notifications.
  • q typed inside a modal Input can no longer quit the app
    (verified with a pilot regression test).
  • T theme cycle now snaps back to the bookreader theme set after the
    user picks a Textual built-in via the palette.
  • Inline Image widget no longer eats all vertical space — explicit
    height: auto keeps the text below the figure visible.
  • PagedView re-renders use class selectors instead of static IDs;
    the async remove_children() race no longer raises DuplicateIds
    on resize / chapter jump (regression test added).

Changed

  • Versioning: __version__ and pyproject.toml bumped 0.1.0 → 0.4.0
    (matches the actual shipped surface — Phase 4 was on main long
    before the version field caught up).
  • PyPI package name: bookreader-tui (the bare bookreader name was
    already taken). The Python import path is still bookreader.
  • License declaration in pyproject.toml corrected from MIT to
    Apache-2.0 to match the actual LICENSE file.