0.17.0 (2026-09-10)
Bug Fixes
- api: stat files before serving and update main API key fallback to use correct permission set for verification (e751cd2)
- build: pre-compile paraglide before vite build (8ed4fc0)
- captcha: passive-first two-phase solving and browser-context binary downloads (40de989), closes #228
- cinephage: preserve release version prefix (fca6dad)
- CI: resolve typecheck errors (5adc591)
- db: make all remaining INSERT sites idempotent with onConflictDoNothing (8e8404e)
- db: never brick boot when startup VACUUM fails (248725a)
- db: purge legacy orphaned unmatched_files rows (migration 131) (6009bf8)
- discover: prevent SectionRow TMDB request loop (c3dafcd)
- docker: add AbortSignal.timeout to healthcheck fetch (7010566)
- docker: allow 10m startup grace for first-run camoufox download (#516) (3fdc8ba)
- docker: chown intermediate .cache dir in shallow ownership path (f454071), closes #516
- docker: create camoufox staging dir on non-root direct runs (#516) (08d15cb)
- docker: exclude generated paraglide from build context (65d498c)
- docker: measured camoufox logging, interrupted-install recovery, staging sweep (#516) (9ce5331)
- download-clients: enforce boolean safety for sequentialDownload (bf609a2)
- download-clients: improve error message for failed torrent addition (f78d469)
- download-clients: prevent import-exhausted failures from being resurrected by polling (4a444c2), closes #502
- downloadClients: fall back to get_cats for SABnzbd 5.x categories (#482) (691711d)
- downloadClients: resolve relative SABnzbd complete_dir via local path mapping (#489) (3913630)
- downloadClients: stalled progress timeout, blocked extensions and search cache (6f93b43)
- downloads: prevent duplicate torrent tracking (4b3779d)
- filesystem: cache root folder paths to prevent event-loop freeze on large directories (#495) (14e5ddd)
- filters: let manual grabs override size validation (df959a0)
- import: apply manual episode/season overrides when filename parses successfully during manual import (74f46f2)
- import: copy without mode preservation to support exfat roots (#490) (74bfacb)
- import: raise bulk job cap and request body limit, clearer payload errors (#496) (04a13e0)
- import: respect user's default root folder setting in manual import destination (47ca9c6)
- indexers: add kinozal.me mirror to Kinozal indexer definitions (49caba2)
- indexers: ID-first matching, context-aware parsing and scoring hardening (df92741), closes Sonarr#7372
- indexers: pure language boost, drop dead enhanced-path boost and seeder leak (1a96e57)
- indexers: return first movie variant results instead of timing out (a72340c)
- integrations: add explicit update schemas to prevent Zod v4 default injection (30cbccf)
- integrations: review fixes for PR #484 debrid preflight (9dcb321)
- library-watcher: harden ENOSPC handling and detect network mounts (cfd827c)
- library-watcher: replace chokidar with @parcel/watcher to fix inotify exhaustion (0464f10)
- library: add cancelled TV status filter with both status spellings (#494) (a8e7455)
- library: allow debrid client to satisfy auto-search preflight (d6d0671)
- library: canonicalize article titles and score TMDB original titles (0881514), closes #513
- library: direct ownership handoff in LibraryOperationLock release path (27fbd52)
- library: guard read-only root folder destinations (#529) (63bdf9b)
- library: guard read-only root folder destinations (#529) (f5978cb)
- library: heal failures fall back to removal; accurate heal metrics; deterministic transition order (74b93ee)
- library: infinite loop + directory false-positives for uppercase/extension-named content (4824ea6)
- library: keyset match paging, queued reprocess-all, self-healing job worker (c1181aa), closes #513
- library: make poster grid breakpoints responsive (978799e)
- library: movie detail back link restores filtered list state (#515) (a5f5e91)
- library: never wipe tracked records when a root folder scans as empty (b16bcfe), closes #505
- library: persist current list URL not destination in returnUrl keys (#515) (eef34bb)
- library: persist explicit default quality profile selection (#493) (3b6c821)
- library: persist movies return URL for back navigation (#515) (b98a7b8)
- library: persist tv return URL for back navigation (#515) (de5f3d3)
- library: preserve filters when returning from detail (6f7fdd9), closes MoldyTaint/Cinephage#515
- library: prevent event loop starvation during initial folder scan on ZFS/NFS (747fc66)
- library: refuse cross-root unmatched matches to avoid unresolvable file links (#488) (a6fbcb0)
- library: refuse rename and move operations while a library scan is in flight (12963e2)
- library: reject read-only root folders in reorganize and smartlist APIs (#529) (753867f)
- library: relax write-test dir mode to avoid media-server watcher errors (eecdca6)
- library: restore episode file links after series refresh rebuilds episodes (6bcdbbd)
- library: series detail back link restores filtered list state (#515) (782fdc4)
- library: stop double-resolving returnTo back links on detail pages (SSR 500) (0c89db9)
- library: validate read-only root folders without write access (ff93d6f), closes MoldyTaint/Cinephage#522
- library: watcher defers during rename operations and re-queues on transient errors (9fd6334)
- license: restore canonical GPL-3.0 text for GitHub/Unraid CA detection (11762e6)
- lint: resolve pre-existing ESLint errors from updated rule set (9f0306a)
- media-matcher: make movie_files insert idempotent (54ec2f5)
- media-matcher: make season/episode/episode_file inserts idempotent (34304fc)
- media-matcher: replace try/catch UNIQUE recovery with onConflictDoNothing across all tables (b47e94e)
- mediaServerStats: resolve Plex episodes to their parent series TMDB ID (0edff04), closes #500
- metadata: guard against TMDB placeholder titles and honor series language in manual refresh (3f15a00), closes #509
- monitoring: resolve default scoring profile for null-profile upgrade contexts (#492) (f39c792)
- monitoring: resolve log freeze and add capture-level persistence (fd5a5ec)
- monitoring: scope every log call site to a proper domain (6018f83)
- monitoring: season-pack search fixes for torrent / non-Western trackers (63b9535), closes #504
- monitoring: truthful history records and search-window fixes (b374f51)
- naming: chunk rename execution in RenamePreviewModal to respect the 500-file server cap (48f6e2e)
- naming: create nested target directories for letter-bucket renames and clean emptied parents (7b0d913)
- naming: fall back to filename-parsed audio languages in Rename Preview (f70572e), closes #507
- naming: map validation failures on rename execute to 400 instead of 500 (b5fc4a9)
- naming: move renameExecuteSchema out of +server.ts — SvelteKit forbids non-handler exports (173999b)
- naming: report rollback failure accurately in reorganize error message (c61ff39)
- naming: reset confirm state on empty selection and refresh preview after mid-batch failure (603abad)
- naming: resolve svelte-check type error in lock integration test (12cc4c6)
- naming: roll back folder rename on disk when the DB path update fails (ea5a0aa)
- naming: surface and record folder-path DB update failures instead of swallowing them (bef5a38)
- naming: surface per-file error details in rename-failure message (i18n {errors} placeholder) (03ae6f3)
- notifications: guard root-folder reorganize/delete, skip Plex pre-delete, cover root guards with tests (e9c0ed3)
- parser: bracketed episode notation, same-season ranges, title hygiene (28555e4)
- parser: don't treat episode-title tail words as release groups (186705d)
- parser: harden episode-range detection and bare ISO 639-1 language tags (7e2cae3), closes #508 #510 #508 #510
- parser: release-group guard handles bracketed quality blocks in generated filenames (4e12dd6)
- parser: strip space-separated extensions in release-group guard (94d3ccd)
- perf: eliminate remaining event-loop-blocking scans in status/logs tabs (bab3071)
- perf: eliminate unbounded full-table scans across dashboard, library pages, monitoring, and background rules (9447bcc)
- preserve native streaming formats (09186ad)
- qbittorent: refactor test stubs for torrent and preferences (52f81e1)
- qbittorrent: declare test-local hash/forceStart vars in duplicate-detection test (390972b)
- qbittorrent: parse structured add responses (4d9daf6)
- quality: apply default profile bounds to null-profile multi-quality buckets (36a4d7b)
- reconciliation: fix crash, event-loop blocking, and missed triggers (f7d966d)
- rename: add inline warning when rename button is disabled during an active scan (a128a22)
- repair episode file links after refresh, re-link unmatched files, and fix scan toasts (a91d978)
- resolve correlationIds in diagnostic reports to actual log record (98c7510)
- server: add sqlite.close, fix exit codes, ensure closeDb on all paths (7536d0c)
- server: chunk stale-item deletion media-server stats to avoid SQLite variable limit (b5cd33a)
- settings: preserve Date columns in configuration backup round-trip (3ddb61c), closes #513
- storage: multi-episode files no longer flagged missing from media server (#481) (06b5b8a)
- streaming: add CORS preflight and cheap HEAD probes to session entry routes (7894946)
- streaming: build legacy master.m3u8 redirects from the configured base URL (cec4276)
- streaming: classify DASH sources correctly and surface upstream probe status (c7b355f), closes #503
- unmatched: clear file selection when switching view mode on Unmatched Files page (6b1e4b3)
- unmatched: update unmatched file count immediately after delete or match (072721a)
- use resolveAppVersion() in pre-update backup filenames (5ff1196)
- validation: stop mediaBrowserServerTestSchema backfilling serverType default (af9a6c6), closes #499
Features
- activity: distinct importing status for finished transfers awaiting import (13e75af), closes #501
- add partially monitored indicator for TV series (#514) (3d4d383)
- api: add local library file streaming api endpoints (ac6ee11)
- i18n: add parameterized library_backTo message (#515) (8c55ddb)
- indexers: add native Hungarian tracker definitions (43413dd)
- indexers: add NoNaMe Club and fix Kinozal cartoon categories (115f22a)
- indexers: rutracker dub-studio title normalization (kinozal parity) (7639b10)
- indexers: session cookie store, browser cookie injection, search & alternate-title improvements (fa2b6ef)
- libraries: allow separate quality profiles per library (60a5e0f), closes #439
- library: add LibraryOperationLock for rename/scan mutual exclusion (072a3cc)
- library: defer library scans while rename operations hold the operation lock (a9ad2bb)
- library: persist title search query in list URLs (#515) (f04ec7c)
- library: reorganize operations write rename history for crash-window healing (0de08b8)
- library: root-folder moves hold the library operation lock (683f2ce)
- library: scan diff heals externally-renamed folders via basename+size correlation (9cc020e)
- library: scan diff heals renamed rows from rename_history instead of deleting (efcafcf)
- library: series-directory context matching for TV files (6d82643)
- monitoring: add diagnostic Reports page with correlation tracing (6597fbe)
- monitoring: add Import Failures tab to reports page (b463c3c)
- monitoring: add Rejected Releases tab to reports page (41fa86d)
- monitoring: add Renaming Failures tab to reports page (2366ec1)
- naming: add preview cache and progressive streaming (09a826f)
- naming: add Specials folder support for season 0 naming with scanner fixes (7785d36)
- naming: batch folder reorganize holds the operation lock across all items (3028416)
- naming: cap rename batches at 500 and reject renames during library scans (3a79b4a)
- naming: hold operation lock during rename execution and folder reorganize (450647e)
- naming: in-place renames carry stem-matched subtitle companions (7b3e371)
- naming: two-step bulk rename confirmation with media-server warning and 500-item batching (65dcc87)
- naming: whitespace-tolerant tokens, docs-name aliases, and :First first-letter spec (issue #497 stage A) (8c440ff)
- notifications: enforce per-server event toggles, Deleted-for-old-path, pre-delete retry, move notifications (97f1be8)
- qbittorrent: add sequential download option (4b6560d)
- reports: add Resolve All bulk action to diagnostic report tabs (fab218b)
- settings: surface latest release and auto-update toggle on cinephage page (1e36e19)
- streaming: honor empty-referer contract and wire refresh=1 for gateway sources (1a9fb52)
- streaming: remuxable .strm entry points, DASH support, self-healing gateway identity (5473ad3), closes #469 #470 #471
- subtitles: add Super Subtitles provider (e0f9814)
- system: add SQLite database backup feature (7fc0354)
- unmatched: add force-match UI and overhaul unmatched files page (77d9135)
- unraid: add ca_profile.xml at repo root for CA submission (7a1fcd8)
Performance Improvements
- db: batch disk-scan writes in transactions and yield between chunks (1d8fb84)
- db: run one-time VACUUM and enable incremental auto-vacuum on startup (4603050)
- naming: chunk preview computation and cap execute concurrency (e16636a)
- reconciliation: skip no-op DB writes on stable library, add storage_items file-id indexes (7b3c03f)