0.1.2 (2026-07-07)
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)
- 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)
- ghost entries + inotify events for all FUSE ops with Nautilus DBus reload (8003ed4)
- gui: attach to a running daemon over IPC instead of mounting a second time (0f9c804)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- theme: fetch Nextcloud server accent color from capabilities and apply to UI (0371c1b)
- thread http3 flag through notification and search clients (f9ad7fe)
- 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)
- 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: refuse to mount over a live mount or non-empty dir, remove mount dir on exit (d9a6412)
- 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)
- 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: 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)
- 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)
- 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)
- 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)
- 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)
- tray: remove Settings menu item (duplicate of Open ncRS) (f7277d0)
- typecheck: resolve all svelte-check errors (e80c94c)
- 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)
- 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)
- increase read-ahead to 64MB and add background prefetching (7869377)
- increase thumb prefetch concurrency (batch 32, cap 200) and fix stray lock unwrap (f58528e)
- make lookup/getattr cache-only, no PROPFIND triggered by Nautilus file scanning (9ac60cf)
- 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)
- 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)
- use Arc<Vec<DavEntry>> in dir cache to eliminate O(N) clones per FUSE call (9796f99)
- WebDAV connection pool and speculative subdirectory prefetching (adadcc6)