0.1.18 (2026-07-12)
Features
- --auto-keep-locally-modified-files flag controls post-upload emblem and local copy (ef4fba1)
- add 'View in Nextcloud Web' right-click menu via WEBURL IPC command (12b64cf)
- add bearer_token and auth_command to config (9cbbc23)
- add cache cleanup with configurable max size and auto-purge by age (07b3e8e)
- add CHANGES invalidation tracing to Nautilus extension (69bfa2f)
- add CHANGES IPC command for live emblem refresh after Keep Locally (1ea8f11)
- add CLI argument parsing with --offline, --config, and --mount-point flags (1409a80)
- add configurable cache cleanup interval (default 1h) (f0dfe4e)
- add ConflictsView and ErrorsView components (c3d0a36)
- add Credentials auth abstraction for basic and bearer token support (61d6488)
- add deb build script (8169ea6)
- add exclude_folders config to hide folders from FUSE mount (78ae3cc)
- add filename validation module matching Nextcloud server rules (6bcf3d7)
- add frontend plugin registry and plugins view (549cefe)
- add fuse_notify and mutation_journal modules (07adcf2)
- add GNOME Shell search provider for server-side Nextcloud search (29e4595)
- add info-level tracing across FUSE, IPC, PROPFIND and Nautilus extension (1d77751)
- add keep_paths config to auto-keep remote paths on startup (4cdf9a8)
- add logging (5fe7983)
- add Nautilus columns for sync, sharing, permissions, owner, and size (357a3fd)
- add nc_passwords plugin crate with API client (3d061f3)
- add nc:// URI handler for Nextcloud Edit Locally support (fa604b4)
- add ncrs_plugin shared crate with plugin trait (8a31352)
- add Nextcloud Notify Push WebSocket client for real-time cache invalidation (5ca11cf)
- add Nextcloud OCS notifications API to ncrs_core (e7af4e9)
- add Nextcloud unified search API to ncrs_core (b538ea5)
- add oc:permissions and oc:fileid to PROPFIND properties (d0017d2)
- add offline resilience with connectivity monitor and cache-only fallback (747b9c9)
- add PasswordsView frontend and register in plugin UI (07e33de)
- add plugin registry and tray integration (06a5cf9)
- add provider type filtering to search (d77319f)
- add resolve_fileids() WebDAV SEARCH by fileid (a13eaa0)
- add SEARCH IPC command and Nautilus search dialog for Nextcloud (38e6019)
- add search_nextcloud Tauri command with parallel provider queries (3aee79a)
- add SearchView component with debounced NC unified search (f41eb99)
- add systemd user service and deb packaging metadata (7b7333b)
- add WebDAV write operations with FUSE callbacks and ETag conflict resolution (bdc122a)
- add window-context detection for auto-suggesting passwords based on active browser tab (ea1c5ec)
- auth: Nextcloud Login Flow v2 — trigger when password missing (f8293e7)
- auth: system keyring for app password; warn on insecure config perms (35e074b)
- auto-create mountpoint if doesn't exist (9de011b)
- background file caching on open, keep-locally IPC+menu, fix emblems, add debug logging (f792818)
- background notification polling and dismiss/get Tauri commands (9ad4fb5)
- cache directory ls and update with notify-push (415a87f)
- cache downloaded files to disk, invalidate by modified time (ee9b54d)
- cache streaming reads to disk when full file is covered, with configurable read-ahead (54b441d)
- ci: build the deb via build-deb.sh and verify it with test-deb.sh (6eadd86)
- config: enable http3 by default; add explanatory comments to advanced settings (4b34dbc)
- core: add --print-default-config flag and explicit ncrs bin target (4b9dd9d)
- core: add STATE, PAUSE and RESUME IPC verbs for external clients (3b0bb03)
- deferred subdirectory readdir, partial-download icons, evict command, cache recovery, and fix web URLs (a4c2a2b)
- derive FUSE mode bits from Nextcloud oc:permissions flags (32f7be3)
- derive Serialize/Deserialize for DavEntry for cache persistence (7f8bc65)
- detect shared files via oc:share-types and show shared emblem in Nautilus (22d65df)
- dir cache persistence, sync reads, HTTP/3 client, child prefetch batching (1ced20d)
- expose error_log, transfer_map, and journal through Tauri state and commands (ab5a4e4)
- extend SyncProgressView with transfers and error indicators (609512d)
- fuse: auto-delete stale GIO atomic-write temps from server on readdir (e02bbfd)
- ghost entries + inotify events for all FUSE ops with Nautilus DBus reload (8003ed4)
- gui: add description hints to advanced settings toggles (a129dcb)
- gui: add Remount button to settings footer (3838009)
- gui: add settings view with yaml config editing and version indicator (63b3154)
- gui: attach to a running daemon over IPC instead of mounting a second time (0f9c804)
- gui: left-click tray icon opens window, right-click shows menu (09d9295)
- gui: mirror journal and conflicts from daemon in attach mode (6e43466)
- handle FUSE unmount event with shutdown flag, GUI remount (e6238f8)
- HTTP Range partial reads with 2MB read-ahead buffer for streaming (9a10ebc)
- http: probe HTTP/3 at startup, fall back to HTTP/2 if QUIC unavailable (8adc9b2)
- implement base features in UI, match most NC Desktop components. Open in top right corner (hack for Wayland) (68c39eb)
- implement basic configuration parser (dc012ee)
- implement basic Tauri UI skeleton with tray icon and menu (2abaeea)
- implement chunked uploads for files larger than 10MB (a215449)
- implement pause sync via shared paused flag in core and GUI (a8f3134)
- incremental readdir with channel-based streaming for cold cache (01c3736)
- ipc: add DETAILDIR batch command for directory metadata (f15d22d)
- ipc: add DETAILDIR to batch a directory's child metadata into one reply (e1eb509)
- ipc: add VERSION handshake so daemon/extension protocol mismatch is logged (8e13f37)
- issues: add Clear all button for conflicts in the warnings tab (4a49942)
- issues: add per-item error dismiss button (fe5fde9)
- load config from ~/.config/ncrs/config.yaml, create skeleton on first run (cb7ca65)
- login: pre-fill server URL from existing config (bd7d003)
- nautilus extension for file sync status emblems (b63b021)
- open file results in file browser with view-online button (d844d80)
- packaging: ship GUI desktop entry, icons, autostart and example config in the deb (e399413)
- populate IPC detail for directories themselves via PROPFIND self-entry (b7b0bb8)
- prefetch NC preview thumbnails into XDG cache on directory listing (16ed616)
- preview: fetch thumbnails for RAW camera formats regardless of has_preview flag (98a92cf)
- proactively propfind invalidated etags of /* at boot (18a9e2e)
- raw PROPFIND with NC properties (has-preview, etag, oc:size), replace remotefs for listings (c78fd46)
- redesign PasswordsView as quick-access popup with click-to-copy (6a28378)
- register nc_passwords plugin in tauri backend (853a457)
- replace dummy notifications with real NC API data, avatar, and dismiss (ebc156b)
- replace stub 'Add account' with working Log out button (c16bf42)
- send OS notifications (6f6467a)
- separate kept and cached files into distinct directories with per-file status (9157a48)
- set x-gvfs-notrash mount option to prevent Nautilus trash dirs on Nextcloud (6b10f5c)
- settings: add GNOME GIO intermediate auto-cleanup toggle (7fa2692)
- show correct size and uploading emblem for newly written files (b65f7f0)
- show storage usage in GUI for kept files, cache, and server quota (8c8b207)
- stale-while-revalidate for directory cache, serve cached listings immediately (96d6c20)
- support Nextcloud remote wipe to delete local data on server command (0dd7c38)
- tauri: add dismiss_error command to remove single error by timestamp (4e71616)
- theme: fetch Nextcloud server accent color from capabilities and apply to UI (0371c1b)
- thread http3 flag through notification and search clients (f9ad7fe)
- thumbnailer: add CR3/CR2 raw thumbnail support via embedded JPEG preview (0c39c1a)
- thumbnailer: fetch NC preview via IPC instead of reading local raw file, expand to all registered RAW MIME types (b5d44c4)
- ui: detect system dark/light mode and add design tokens (0f244f5)
- unix socket IPC server for file sync status queries (1c2c86f)
- update nautilus extenision on runui (b752dfa)
- upgrade reqwest 0.11 to 0.12 with HTTP/3 QUIC support (ec801f1)
- wire errors, transfers, and conflicts state into main page (6e67051)
- wire tauri commands to real backend state and config (0ce8b89)
Bug Fixes
- add done flag to stream buffer so waiters fail fast on short downloads (e5205a0)
- batch-populate IPC maps before readdir reply for immediate column data (fc322f2)
- bound IPC connections to 64 with 60s read timeout to prevent thread leaks (5917299)
- build: sync Cargo.lock to workspace version 0.1.12 (6ac52f7)
- cache: delete orphaned write_* staging files after upload completes (af1686b)
- cancel previous download when new range read starts for same fh (7177ee4)
- check dir cache before PROPFIND in keep-locally to avoid querying file paths as directories (87a4e68)
- cicd: proper release-please config (9798a78)
- ci: pass token explicitly to release-please action (3b2ce31)
- clean up stale zero-byte write_* temp files on daemon startup (cdb1599)
- core: parallelize boot validation and update detail maps on background dir refresh (553b5fe)
- core: refuse to mount over a live mount or non-empty dir, remove mount dir on exit (d9a6412)
- core: remove erroneous MKCOL 409 idempotent arm that silently dropped journal entries (16d81e7)
- core: surface PROPFIND auth/network errors to readdir and GUI error log (1c06516)
- core: validate mount point before touching the IPC socket and shared state (f196be8)
- correct Nextcloud oc:permissions flag mapping in Nautilus extension (6685d6f)
- dirty file path after PUT so Nautilus clears uploading emblem automatically (2f39435)
- don't invalidate directories on boot if etag not changed, better atime notify-push ignore after our own propfind to prevent infinite loops (7e5074a)
- drop AutoUnmount — fuser 0.17 requires allow_other with auto_unmount (8d2da94)
- enable rustls-tls for tungstenite and retry notify_push discovery on failure (871f45e)
- enforce Nextcloud oc:permissions via DefaultPermissions FUSE mount option; add perms_to_mode tests (ced8a5c)
- fetch parent directory on lookup cache miss after daemon restart (a79b075)
- fuse: delete all GIO temps on PROPFIND, not just age-threshold ones (921d2a7)
- fuse: guard newly created files in uploading set to prevent ENOENT race (9462955)
- fuse: preserve in-flight uploads during concurrent dir cache PROPFIND refresh (c41f68e)
- fuse: update inode map on rename so saved files don't vanish (233b5db)
- gate child-dir PROPFIND prefetch behind aggressive_prefetch and add HTTP request throttle (5ec0d5b)
- green-checkmark after upload; NC properties appear via forced PROPFIND (f42c403)
- guard unlink/rmdir/rename with NC D/N/V flags; block delete in create-only shared dirs (476a2bd)
- gui: embed tray icons at compile time and enforce a single app instance (1afc89d)
- gui: pin plugin bare imports to local node_modules for production builds (e49e969)
- gui: prevent floating panel from shrinking on HiDPI-scaled displays (80161ed)
- gui: regenerate app icons from the ncrs brand mark instead of the tauri template (c87d7ef)
- gui: use composedPath for click-outside detection of detached nodes (74922f5)
- harden bearer auth — redact secrets, stream downloads, pre_auth WS, validate creds (eccecbe)
- harden FUSE, IPC, and Nautilus extension against panics and errors (40aee6e)
- http: correct misleading http3 alt-svc comment and hint (dfd851c)
- http: remove http3_prior_knowledge; use alt-svc negotiation instead (239809c)
- issues: override DaisyUI grid on alert cards, add dismiss × button (b1a260f)
- issues: replace DaisyUI btn with plain icon-button classes to fix overflow (9671b18)
- lazy-unmount stale FUSE mount before remounting on restart (bd4cec5)
- login: correct init endpoint to /index.php/login/v2 and strip WebDAV paths from user input (4410f91)
- login: send User-Agent header so Nextcloud shows app name in OAuth grant page (e7e9320)
- make search async with cancellation and debounce throttling (5ac2743)
- mount: remove IPC socket on FUSE teardown so remount doesn't enter attach mode (bf5c7d5)
- mount: surface FUSE errors to UI and allow remount from error state (9aa6217)
- move DETAIL logic into update_file_info_full which Nautilus 4 actually calls (c61c494)
- nautilus: clamp _poll_skip to 0 to prevent negative value if pool resets it mid-decrement (38c80aa)
- nautilus: log malformed FILE_CHANGES entries; set _poll_skip before clearing _poll_running (e0f1562)
- nautilus: refuse dev install when the packaged extension copy exists to avoid GObject type collision (b3ae4f9)
- never return empty readdir for deferred dirs, debounce dir cache saves (bc5bc20)
- only prefetch subdirs/thumbnails on first readdir, deduplicate prefetch PROPFINDs (4f5db18)
- packaging: build GUI with custom-protocol so the deb embeds the frontend (3f8c706)
- parse statusCode as string to match Nextcloud Passwords API response (25cc8bc)
- percent-decode paths from remotefs-webdav list_dir results (84d13c7)
- percent-decode search result titles and paths (ff294c1)
- populate IPC maps from getattr/lookup, serve from file_cache in read, move poll off main thread (29ae52c)
- prevent concurrent PROPFIND race in get_or_list_dir (5d1a506)
- prevent recursive LOG IPC calls, increase socket timeout and recv buffer (cd57209)
- preview: avoid Cow allocation in fetch_preview_bytes; preallocate PNG buffer; align probe with daemon params (8376a3c)
- preview: convert NC JPEG preview response to PNG for XDG thumbnail cache (f19f259)
- preview: evict XDG fail-cache entries when thumbnail is written (c662680)
- preview: guard thumbnail_callback with thumb_inflight to prevent duplicate NC fetches (6c526bc)
- preview: percent-encode file: URIs so XDG thumbnail hashes match Nautilus (ed1a42d)
- preview: throttle on-demand RAW thumbnail fetches to avoid starving FUSE HTTP workers (8473f2b)
- reduce Keep Locally concurrency to 2 with yield to avoid Nautilus freeze (708e4f5)
- reduce thumbnail batch to 4, add 200ms inter-batch and 500ms initial delay (766fa25)
- reject empty bearer_token, prevent notification poll from killing other pollers (f18f696)
- release: annotate workspace version for release-please and unify plugin versions (d818b7e)
- release: use generic extra-file updater for workspace Cargo.toml (6d0ebb2)
- release: use rust release type so release-please updates workspace Cargo.toml version (9200368)
- remove dbus reload, let inotify events handle per-file nautilus updates (fde890d)
- remove update_file_info stub that blocked async update_file_info_full (3d32df1)
- replace hard cancel with soft self-cancel, limit read throttle to 3 (4ce0496)
- resolve $plugins alias with absolute path and add plugin loading diagnostics (a660c06)
- restore update_file_info stub, add DETAIL_ASYNC tracing (ba29455)
- return COMPLETE synchronously for non-mount files to avoid Nautilus async overhead (0389ab8)
- rewrite nautilus extension with non-blocking async update and tests (178214c)
- security: chmod 0600 config file to protect app password (5ca3337)
- send self-entry immediately via channel, mark paths dirty after IPC population (29c5a98)
- settings: add gap between toggle label and checkbox (a28ad2e)
- skip background download for streaming media, show blue emblem during active downloads (94452e5)
- skip IPC socket queries for files outside ncrs mount point (eefdd6d)
- skip zero-byte cached files and clean up failed downloads (e1f8c4a)
- stop eager full-file download on open, use fileId for preview API (6c60c37)
- suppress notify_push self-notification loop via ETag pre-check (f5350b1)
- suppress self-notify kernel dentry invalidation for freshly-fetched dirs (e492b37)
- thumbnailer: catch OSError from missing exiftool; use or-fallback for XDG_RUNTIME_DIR (7c42d8d)
- thumbnailer: route by is_remote instead of is_local so slow/absent daemon falls through to exiftool (881bcf3)
- tray: remove Settings menu item (duplicate of Open ncRS) (f7277d0)
- typecheck: resolve all svelte-check errors (e80c94c)
- ui: expandable error cards, pointerdown close, ENOSPC retry storm (9267a5f)
- ui: fix server label clipping and avatar dropdown overflow (43cd4c5)
- ui: move @const tags to be direct children of {#if} block (4efb8ec)
- ui: show FUSE error message in sync label instead of invisible alert span (bd973bc)
- unmount FUSE on quit, handle existing mount point, and sync tray state on all transitions (4a853e3)
- update mount_ncfs call signature and harden MKCOL/DELETE ops (d745ae9)
- use download arrow emblem for partial-download folders (b93a90d)
- use Nautilus.FileInfo.lookup for invalidation instead of storing stale GObject refs (85b4aef)
- use shared buffer with condvar for incremental read-ahead streaming (1ac65bc)
- use sync update_file_info with background cache for non-blocking NC columns (d2efdd3)
- use synchronous DETAIL IPC in update_file_info for immediate NC columns (12860a0)
- wait for PROPFIND completion instead of 2s timeout, increase IPC socket timeout (96b4fa7)
- wrap all Nautilus extension callbacks in try/except to prevent crashes (fa678b8)
Performance Improvements
- add 10s in-memory directory listing cache (c4dd94c)
- add prefetch_throttle so aggressive_prefetch doesn't compete with READDIR (213a34d)
- add throughput metrics to range read logging (82bb0dd)
- build: merge two cargo build passes into one to avoid recompiling shared deps (51b93b2)
- cap thumbnail and subdirectory prefetching for directories >200 entries (01f2a33)
- chain prefetch one level deeper to eliminate pause between traversal waves (85061be)
- fix condvar wake + suppress proactive_refresh during traversal (b153765)
- fuse: deduplicate concurrent thumbnail-prefetch threads per directory (861178d)
- fuse: defer O(n) map retain() calls to after reply.ok() in readdir (a85c2dd)
- fuse: release cache lock before reply.add() loop to unblock concurrent getattr (fdb907a)
- fuse: short-circuit second metadata() stat when kept_path already matches (3769185)
- increase read-ahead to 64MB and add background prefetching (7869377)
- increase thumb prefetch concurrency (batch 32, cap 200) and fix stray lock unwrap (f58528e)
- ipc: aggregate DETAILDIR directory statuses in one pass instead of O(subdirs*N) scans (0b7fe71)
- ipc: demote DETAIL log to debug, fix thumbnailer crash on malformed JPEG (a0c247a)
- ipc: drop status/detail locks before joining DETAILDIR reply so huge dirs don't stall FUSE (7632fae)
- ipc: pre-populate detail/shared/fileid maps before readdir reply.ok() to fix race with Nautilus extension DETAIL queries (d246cf8)
- make lookup/getattr cache-only, no PROPFIND triggered by Nautilus file scanning (9ac60cf)
- nautilus: avoid FUSE utimes upcall for M-type FILE_CHANGES events (396829b)
- nautilus: bound the directory metadata cache and precompute the mount prefix (d44e126)
- nautilus: guard poll loop against backpressure when daemon is slow (30c32c0)
- nautilus: make update_file_info async via update_file_info_full + IN_PROGRESS (bd1eaa8)
- nautilus: patch changed cache entries in place instead of refetching the whole directory on notify_push updates (049e167)
- nautilus: remove per-file STATUS queries from get_file_items GTK thread (2dcc8fb)
- nautilus: repaint only requested children after a fetch to avoid O(dir) invalidation on the main thread (608625c)
- nautilus: replace blocking _poll_keep_done loop with GLib timeout (4a937c0)
- nautilus: serve file info synchronously from a per-directory cache to fix slow listings and handle=(nil) spam (e11853d)
- non-blocking FUSE handlers with per-call WebDAV timeout (4df097d)
- populate IPC maps only once per directory and cap CHANGES to 500 paths (19147fd)
- prefetch child dirs concurrently on readdir using pending_dirs (648b591)
- preview: write thumbnail via tmp+rename to prevent concurrent corruption (8e5227d)
- reduce prefetch contention and thumbnail size for faster directory loads (2034acc)
- reduce thumbnail batch size and gate on active streams (f8c10e2)
- separate read throttle, increase read pool to 8, enable tcp_nodelay (d430848)
- share HTTP client across requests and parallelize thumbnail prefetch (e8d1fb0)
- short-circuit readdir continuation pages from cache (78395d7)
- skip read throttle for small reads without read-ahead (b9e2afb)
- split IPC population into per-map short locks to reduce FUSE contention (62e00b4)
- stop flooding dirty set on notify_push file change events (5b50437)
- stream range reads to reply with first bytes immediately (f57c34c)
- stream XML parsing directly from HTTP response instead of buffering (c79644c)
- switch back to async update_file_info_full with 32-worker pool for parallel DETAIL queries (b988fec)
- switch Nautilus DETAIL queries to synchronous IPC, eliminate thread pool bottleneck (f1f8691)
- thumbnailer,extension: fix hang risks, spurious NC ops, and idle poll overhead (836cae3)
- upload: stream PUT from staging file instead of loading into RAM (07dc81a)
- use Arc<Vec<DavEntry>> in dir cache to eliminate O(N) clones per FUSE call (9796f99)
- WebDAV connection pool and speculative subdirectory prefetching (adadcc6)