# Changelog ## v0.1.3 — 2026-04-03 ### New feature - DB-stored books: scraped books are now stored as chapters in PostgreSQL instead of EPUB files on disk — full-text search, content deduplication, and backup coverage are all handled automatically - Grabber stores chapters in a `book_chapters` table and images in a content-addressed imagestore (sha256-based, automatic deduplication) - EPUB → DB conversion: "Convert to DB" button on any EPUB book detail page — extracts chapters, migrates all metadata and child rows (tags, progress, bookmarks, cover), removes the EPUB file - DB → EPUB export: "Export EPUB" button on DB-stored books — builds and streams a standards-compliant EPUB without writing a file to disk - Full-text search (`/search`): searches across all DB-stored chapter content via PostgreSQL FTS (`tsvector` / `plainto_tsquery`), returns highlighted snippets with direct links to the chapter position in the reader - Chapter editor supports DB-stored books: Monaco-based editor reads and writes `book_chapters` directly; chapter titles editable inline; title-only changes correctly included in Save All - Grabber: storage toggle on the Convert page — choose between DB storage and EPUB file before converting --- ## v0.1.2 — 2026-04-02 ### New feature - Restore functionality on the Backup page: browse any available Dropbox snapshot, see which files are currently missing from disk, and restore individual books or a selection back to the library — file is written to disk and immediately re-indexed --- ## v0.1.1 — 2026-03-31 Bug fixes, volume-aware duplicate detection, shared code cleanup, and a new Changelog page. ### Bug fixes - Duplicates view crashed on load due to a TypeError (`g.books.length` was undefined); counter was stale and the view never rendered - Duplicate detection was too aggressive: different volumes of the same series (same title + author, different volume) were incorrectly grouped as duplicates — now keyed on title + author + volume - Grabber preload: same volume-aware fix — only flags a duplicate when title, author, and volume all match; falls back to title + author when no volume is known - Bulk Import duplicate check: different volumes of the same series are no longer flagged as duplicates ### Improvements - Search changed from search-as-you-type (250 ms debounce) to Enter-to-search — prevents the iPad keyboard from locking up on large collections - CBR reader: archive format now detected via magic bytes instead of file extension — `.cbr` files that are actually ZIP or 7-zip archives open correctly; added 7-zip support via `py7zr` - Docker: replaced `unrar-free` with proprietary unrar (RARLAB v6.2.6) — fixes failures on RAR archives using newer compression methods ### New feature - Changelog page (`/changelog`): structured release history with version, date, and categorised change lists ### Code quality - Shared CSS (`theme.css`): single `:root` block with all global CSS custom properties; loaded on every page — no more duplicate inline `:root` blocks across templates - Shared JS (`books.js`): book helpers (`bookTitle`, `bookAuthor`, `bookGenres`, `bookSubgenres`, `bookPlainTags`, `filterBooks`) and search input wiring extracted into one shared file - Shared JS (`conversion.js`): SSE/EventSource logic (`connectConversionStream`, `addLog`) extracted from Convert and Grabber pages into one shared file --- ## v0.1.0 — 2026-03-29 First release of Novela: a self-hosted personal library for EPUB, PDF, CBR, and CBZ files. ### Library - Grid and List view for all books and New books, with column visibility filter and persistent view mode - Sidebar navigation: All books, Want to Read, New, Incomplete, Series, Authors, Publishers, Archived, Bookmarks, Rated, Duplicates, Statistics - Sidebar counters for all sections, live-updated without page reload - 1–5 star ratings stored in DB and written back to EPUB OPF / CBZ ComicInfo.xml - Publication status: Complete, Ongoing, Temporary Hold, Long-Term Hold - Status and want-to-read badges on grid covers, always readable regardless of cover colour - Duplicate detection: groups books by title+author; counter in sidebar - Incomplete view: all non-archived books where publication status is not Complete - Rated view: non-archived books with a star rating, sorted by rating - Bulk delete in All books List view with multi-select and Shift+click range selection - Disk usage warning in sidebar (amber ≥ 85%, red ≥ 95% or low free space) - Autocomplete for Author, Publisher, and Series in the book edit panel - Series volume suffix support (e.g. "21a", "21b") and volume 0 for prequels/specials - Cover upload for EPUB books; cover cache for fast subsequent loads ### Reader - EPUB reader with chapter navigation, scroll progress, and bookmarks - PDF reader with page-image rendering and page navigation - CBR/CBZ reader with page-image rendering; format detection via magic bytes (supports ZIP, RAR, 7-zip archives) - Reader text colour: 5 warm-tone presets, persisted per browser - Content width slider (30–100 vw), persisted per browser - Bookmarks: save position with optional note; navigate back via sidebar or bookmark list ### Import & Convert - Single-file import: drag-and-drop or file picker for EPUB, PDF, CBR, CBZ - Bulk Import (`/bulk-import`): batch import with `%placeholder%` filename pattern parsing, shared metadata, live preview table, and duplicate detection - Convert (`/convert`): scrape web fiction and convert to EPUB; warns if title+author already exists in library - Grabber with credentials manager for site-specific login ### Book Builder - Create EPUB books from scratch via a WYSIWYG editor (`/builder`) - Chapters with contenteditable editing; toolbar: bold, italic, underline, blockquote, author note, scene break, normalize - Autosave every 30 s and Ctrl+S; publish produces a standards-compliant EPUB 2.0 added directly to the library ### Following - Following page (`/following`): track external author URLs - Two tabs: Following (authors with URL set) and All Authors - Inline URL editing with Enter/Escape support; Visit opens URL in new tab - Sidebar counter shows number of followed authors ### Backup - Dropbox backup with versioned snapshots and object-store deduplication - OAuth2 refresh token flow (does not expire); legacy access token supported as fallback - Configurable backup root, snapshot retention, and scheduled interval - Live backup progress in sidebar (file count + phase); backup status dot with time-ago - PostgreSQL dump included in each backup run ### Performance - Library loads instantly for large collections: ETag `304 Not Modified`, `IntersectionObserver` lazy covers, single DOM pass rendering, `json_agg` SQL tag aggregation - Fast-path `/api/library` (DB-only); full rescan only on demand ### Branding - Favicon for browser tabs (16×16, 32×32, 256×256) - Apple touch icon (180×180) with dark background for iOS home screen - Logo in sidebar alongside the Novela wordmark