Skip to content

v1.1.0 — Vellum

Choose a tag to compare

@bndct-devops bndct-devops released this 31 May 21:43

[1.1.0] — 2026-05-31 — "Vellum"

Added

  • Send to device: email books to a Kindle, Kobo, or any address straight
    from the web UI — single or bulk (max 25 per send). Per-user device list
    in Settings, admin Email tab (SMTP status, test email, all devices, send
    history). SMTP configured via TOME_SMTP_* env vars; 25 MB attachment
    limit; 50/user/day rate limit (TOME_SMTP_DAILY_LIMIT). Members and
    admins only.
  • API token scopes: tokens can now be created with "full" (default) or
    "readonly" scope. Read-only tokens are blocked from non-GET requests.
    Existing tokens default to full access. Settings UI shows a scope dropdown
    on creation and a badge on read-only tokens.
  • Opt-in parallel library scans via TOME_SCAN_WORKERS (default 1 = serial,
    in-process). Set it higher (e.g. CPU core count) to fan the CPU-bound
    extract/hash phase across worker processes for large imports; database writes
    stay single-process (SQLite single-writer). ~60–80 MB per worker.
  • Wishlist: members and admins can wish for a book or a whole series. The add
    dialog has two modes — Book (structured search across Hardcover, Google
    Books, and OpenLibrary, plus a free-text fallback) and Series (Hardcover's
    series catalogue, so a series is disambiguated by author and carries its true
    volume count). Admins get a Wishlist tab; a matcher links wishes to library
    books both when a book is added (forward) and when a wish is created against
    books already present (reverse), author-aware so same-named series don't
    cross-match. Single-book wishes are fulfilled by linking a book; whole-series
    wishes are standing wants that stay open, show an "X of N" coverage strip
    (present volumes vs. the series total), notify the requester as each volume
    arrives, and close via "mark complete". In-app notifications via a new top-bar
    bell, plus email on fulfilment when SMTP is configured. The Series tab requires
    a Hardcover token (hardcover_token) — without it the dialog falls back to Book
    search only. Toggles: TOME_WISHLIST_ENABLED, TOME_WISHLIST_MAX.

Changed

  • Website: added raster favicons (.ico + .png) for Google search results
    and Cloudflare Web Analytics tracking snippet.
  • Performance: faster library scans — removed per-book ORM lazy-loads, one
    directory walk instead of one-per-format, and throughput-oriented SQLite
    pragmas (synchronous=NORMAL, larger page cache, mmap). The book-list
    endpoint (GET /api/books) is also much faster — relationships are
    eager-loaded, eliminating an N+1 of ~3 queries per row.

Fixed

  • Full-text search now indexes books inline during scan / upload / ingest, so
    newly added books are searchable immediately — previously the index was only
    rebuilt at startup, leaving them invisible to search until the next restart.
  • Cover-bearing files are no longer hashed twice during ingest.
  • Bulk ZIP download now embeds Tome metadata like every other download path
    (single, OPDS, TomeSync) — previously it zipped the raw library files, so
    downloaded books carried stale/original metadata instead of Tome's. Library
    files on disk are still left untouched.