Skip to content

Releases: vdavid/cmdr

Cmdr v0.11.1

10 Apr 14:56

Choose a tag to compare

Added

  • Striped rows setting — alternating row shading in Full and Brief view modes, auto-adapts to light/dark mode
    (faa2534)
  • MTP per-file copy progress and mid-file cancellation — progress callback on every USB chunk, instant cancel via USB
    SIC abort (~300ms instead of draining the full stream)
    (ac5ec4d,
    a66adf6)

Fixed

  • View menu Full/Brief checkmarks now sync when switching panes
    (6e36a49)
  • MTP: export files directly instead of guess-and-fallback, eliminating ObjectNotFound error log spam on every copy
    (0cc675a)
  • MTP: fix mid-stream cancel corrupting USB session and making device unresponsive — bump mtp-rs to 0.11.0
    (a66adf6)
  • A11y: darken --color-accent-text for WCAG AA compliance, fix search input placeholder opacity
    (b7744dd)
  • Fix lint errors in VolumeBreadcrumb, TransferDialog, +layout.svelte
    (90b5ea0)
  • Fix Linux compilation — move shared SMB types to cross-platform module, add get_smb_mount_info for Linux
    (00c5f18)

Cmdr v0.11.0

10 Apr 00:55

Choose a tag to compare

Added

  • SMB direct connections — file operations now go through the smb2 protocol directly, bypassing the OS mount (~4x
    faster). The OS mount stays for Finder/Terminal compatibility
    (dea46ec)
  • SMB auto-upgrade — pre-existing and newly detected SMB mounts are automatically upgraded to direct connections in the
    background, controlled by network.directSmbConnection setting
    (a6ab2ca)
  • SMB "Connect to server" — enter hostname, IP, or smb:// URL to connect to hosts not found by Bonjour. Persisted
    across restarts. Context menu to disconnect, forget server, or forget saved password
    (2df24ac)
  • SMB connection status indicators — green/yellow circles in volume picker and breadcrumb show whether a share uses a
    direct (fast) or OS mount (slower) connection, with one-click upgrade option
    (0473250)
  • SMB real-time progress for file transfers — pipelined I/O with throttled progress events, cancellation flows through
    to smb2 (f530355)
  • SMB write operations — create, delete, rename, copy, and move all work through smb2 direct connections with full
    conflict handling (e72c082,
    4f030d7)
  • SMB/MTP unified change notifications — notify_directory_changed with incremental listing cache patches, smb2
    background watcher via CHANGE_NOTIFY long-poll, fixes "listing doesn't update after create/delete/rename"
    (2d0bc98)
  • SMB native connection warning — transfer dialog warns when using OS mount (slower, cancel/rollback may be delayed)
    (d25de48)
  • MTP auto-suppress ptpcamerad on macOS — no more manual steps to stop the daemon from competing for USB access,
    auto-restored on disconnect and app exit (d161f9b)
  • MTP settings — toggle to disable MTP entirely, device connection toast with "Don't show again" option, dedicated
    settings section (2467ece,
    70d8d40)
  • Brief mode: show real recursive directory sizes in selection info
    (53ee5ef)
  • Cursor jumps to newly created directories (eff84d1)

Fixed

  • Copy progress: per-file counter now increments per individual file during directory copies, not per top-level item.
    Stale scan events from previous operations are rejected
    (d10d9cc)
  • SMB faster deletes — skip stat round-trip, halves round-trips for bulk deletes. Rollback now includes the in-progress
    item (0e7f072)
  • Copy cancellation — directory tree copies now check cancellation between each file instead of looping without checking
    (a7d401a)
  • Cross-volume copy with SmbVolume — is_local_volume() no longer misclassifies SmbVolume as local
    (4a86a85)
  • SMB paths with accented characters — NFC normalization fixes STATUS_OBJECT_PATH_NOT_FOUND on macOS
    (baaccc8)
  • Keychain lookup for SMB — resolves IP → hostname via mDNS so credentials are found regardless of address format
    (b1addfd)
  • Show login form on stale Keychain credentials instead of empty share list
    (46609f1)
  • Volume-boundary navigation — prevents navigating above SMB mount root into /Volumes, falls back to home when
    unreachable (d25de48)
  • Stale cursor index after file ops — cursor/selection adjustment now happens before fetchEntryUnderCursor
    (945093b)
  • Drag & drop after wry upgrade — webview class discovery now uses live instance instead of hardcoded class name
    (a816c77)
  • Stale dir sizes after copy/create — reconcile_subtree auto-creates new root directories, pending rescans are no
    longer abandoned (1479108)
  • Scan preview race in progress dialog — subscribe to events before checking completion status
    (5d9b91b)
  • dir_stats count drift on file↔dir type changes — writer now detects and corrects the old type's count
    (364ddf1)
  • Index entry ID race — unified all ID allocation through a shared atomic counter
    (6e173e4)
  • MTP move not refreshing UI on Linux — bump mtp-rs to v0.9.1 for ObjectInfoChanged events
    (5b27ead)

Non-app

  • Replace smb/smb-rpc crates with custom smb2 crate — cleaner API, proper error types, no NDR debug-format
    parsing hacks (2d7904f)
  • CI: upgrade actions to Node.js 24 (e5820bb)
  • Testing: fix multiple E2E flakes — MTP cache staleness, theme race, hidden files toggle, Docker shell quoting
    (5009971, 52faf43)
  • Suppress noisy tao and indexing dev logs
    (21b041b, 9bf0e00)

Cmdr v0.10.0

08 Apr 01:50

Choose a tag to compare

Added

  • Copy rollback is now visible — progress bars count backwards from the cancellation point, rollback button shows
    "Rolling back...", Cancel stays active to stop the rollback
    (0ac5d0)
  • Dual progress bars in transfer dialogs — size-based and file-count-based, hidden during scanning phase
    (ced9d2)
  • MCP: cmdr://settings resource and set_setting tool — inspect and change all settings without opening the Settings
    window (c71115)
  • MCP: move_cursor now awaits frontend confirmation, fixing race where copy fires before cursor has moved
    (634125)

Fixed

  • MTP: move conflicts no longer silently overwrite — both cross-volume and same-volume moves now show the conflict dialog
    with Skip/Overwrite options, same as copy
    (27f2ff)
  • MTP: fix watcher missing external file changes — listing cache key mismatch made every invalidation a no-op, masked on
    macOS by the 5s cache TTL but visible on Linux where inotify fires instantly
    (266026)
  • MTP: fix event debouncer permanently dropping events — suppressed events in the 500ms window are now scheduled for a
    trailing emit (21b3bc)
  • MTP: fix pane falling back to local root after copy — refresh_listing was calling std::fs on MTP paths, emitting a
    spurious directory-deleted event (9deba7)
  • MTP: fix volumes missing from copy/move dialog, fix destination volume dropdown not updating on change
    (cd6603)
  • MTP: fix event loop lock contention — clone MtpDevice for event polling instead of holding mutex during
    next_event(), unblocking copy/move/scan operations
    (0461e3, 547a41)
  • MTP: fix scan preview showing 0/0/0 in confirmation dialog, reduce USB round-trips for conflict checks
    (4e1efa)
  • MTP: fix rename conflicts not showing dialog on non-local volumes, fix paste guard checking clipboard before MTP
    rejection (25f2b2)
  • Copy: fix "Cancel" (keep partial files) triggering unintended rollback — onDestroy race condition overwrote the
    user's choice (3042f2)
  • Copy: fix cancellation hanging 30+ seconds on network mounts — use chunked copy instead of copyfile(3) for all
    non-APFS-clone copies (816e9e)
  • Fix UI blocking on network filesystem operations — move validation into spawn_blocking, emit write-error for
    handler errors (bed59d)
  • Indexing: fix replay progress showing "Scanning..." instead of the replay overlay with progress bar and ETA
    (32c053)
  • Volume selector: push-based model replaces polling, fix race conditions on mount/unmount
    (b09665)
  • Volume path resolution via statfs — resolves in <1ms regardless of network mount health, handles APFS firmlinks
    (5a1f78)
  • Harden unsafe Rust code — checked main thread markers, scoped Send impls, SAFETY comments on transmute calls
    (541804)

Improved

  • Typed write operation errors replace string parsing — 9 specific variants (DeviceDisconnected, ReadOnlyDevice,
    FileLocked, etc.) instead of IoError(String) catch-all
    (c10e06)
  • Typed volume errors — MTP errors stop being erased into IoError(String) and guessed back via string matching
    (8f2296)
  • MTP: unified backend move — frontend no longer orchestrates three-stage MTP moves, backend handles strategy
    (547a41)
  • Demote noisy per-file copy/move/MTP logs from INFO to DEBUG, add level_for filters for third-party crates
    (357fef)

Non-app

  • Accessibility: fix all WCAG violations found by axe-core — proper ARIA roles, focus indicators, color contrast, screen
    reader landmarks (d29a7c,
    438046, 6e6230)
  • E2E: port all tests from WebDriverIO to Playwright, add 80+ new tests covering MTP operations, SMB, file conflicts,
    accessibility, and indexing
  • E2E: replace all test sleeps with event-driven waits
    (3b5565)
  • Tooling: replace Prettier with oxfmt (10–20x faster)
    (995f8c)
  • Tooling: auto-invalidate Docker node_modules on lockfile change
    (ac4e26)
  • Refactor: split indexing module (1951 lines → focused files), extract shared compute_bottom_up(), unify
    name_folded across platforms (390864)
  • Website: light/dark theme with toggle, features page, OG images, blog Like buttons
  • Dashboard: color-coded charts, GitHub star tracking, improved error reporting

Cmdr v0.9.1

24 Mar 17:05

Choose a tag to compare

Fixed

  • Fix orphaned llama-server processes — rapid AI provider switching (Local → OpenAI → Local) could leave llama-server running after app quit. Spawn + PID tracking now happen in a single lock, plus pgrep-based cleanup on startup (b3382e)
  • Fix vendor-specific MTP device detection (Kindle, USB class 0xFF devices) via mtp-rs 0.4.1 upgrade, also fixes indefinite event polling blocking MTP operations on idle devices (1a170d)

Non-app

  • API server: migrate telemetry from Analytics Engine to D1, add crash email notifications via Resend, add admin endpoints for downloads/active-users/crashes, rename license-serverapi-server (7dc0da)
  • Refactor: split search.rs (2361 lines) and SearchDialog.svelte (1552 lines) into focused modules (c17c21)
  • Refactor: deduplicate repeated code patterns across Rust, Svelte, TypeScript, and Go (52afe3)
  • Upgrade 9 Rust dependencies — reqwest 0.13, rusqlite 0.39, notify-debouncer-full 0.7, and more (929556)
  • Tooling: skip pnpm install when lockfile unchanged, saving ~20s per run (8d2b39)
  • Blog: add Kindle support article (5c9d5b)

Cmdr v0.9.0

23 Mar 16:09

Choose a tag to compare

Added

  • Add whole-drive file search (⌘F) — in-memory index with rayon parallel scan, glob/regex patterns, size/date filters, scope filtering, keyboard-navigable dialog, AI mode via configured LLM, two-pass AI search with preflight refinement, case sensitivity toggle, system folder exclusion, MCP search and ai_search tools (058136, 15110c, 8c3546, cf5827, 415db3, 21d32e, 26d682)
  • Add opt-in crash reporting — panic hook + signal handler write crash files, dialog lets users inspect and send on next launch, crash loop protection, no PII (016ee3, be29af)
  • Add Shift+F4: create new file and open in default editor, Total Commander style (da8ca9)
  • Add smart size display — store both logical and physical sizes, show min(logical, physical) by default with setting to switch, dual-size tooltips with colored byte triads, hardlink dedup via inode tracking, size mismatch warning icon, hourglass icon for stale sizes (1d666a, b302d0, 065820, 1d588f, a93a8b, 9c450c)
  • Add Ext column in Full mode — sortable, between Name and Size (e834b4)
  • Add replay progress overlay — shows "Updating index..." with progress bar and ETA during cold-start replay (f166b0)
  • MTP: show live disk space in volume breadcrumb dropdown and status bar (b155f1, c4cc26)
  • MTP: show loading progress when opening large folders (77ebaa)
  • Add missing focus indicators on search and command palette inputs (179221)
  • Selection summary now includes directory sizes (392819)
  • MCP: show directory sizes in state resource (9cb775)

Fixed

  • Fix macOS multi-GB memory leak — add autoreleasepool wrappers around all ObjC API calls on background threads, 50M retained objects / 5 GB after 20h of runtime (777f9e)
  • Fix stack overflow crash in sync status — use dedicated OS threads with 8 MB stacks instead of rayon for NSURL/XPC calls (fa28cd)
  • Fix size overcounting — hardlink dedup via inode column, cloud-only files no longer counted as local, smart size mode for dataless files (fe5eff)
  • Fix file watcher: instant updates in large dirs via incremental stat-and-compare instead of full re-read, synthetic diffs for mkdir (df558e)
  • Fix selection clearing after file operations — clear on source pane after move/copy/delete/trash, gradual deselection per source item (538ec5)
  • Fix selection indices drifting after external file changes — pure index adjustment on structural diffs (453ec0)
  • Fix cursor lost after deleting all files (17808d)
  • Fix stale dir sizes on rename — writer now emits notifications after both delete+insert commit (10213d)
  • Fix indexing won't start on fresh DB — scanning flag moved to correct path (a61376)
  • Fix "Scanning..." stuck after replay — clear scanning in replay-complete handler (4a44d7, fb796e)
  • Fix verifier + replay transaction conflict — use named savepoints instead of nested transactions (72ca9f)
  • Fix MTP browsing panic and show device name instead of storage name for single-storage devices (d37b8a)
  • Fix MTP duplicate directory listing on connect (17efe8)
  • Fix MCP stale state after server crash, auto-probe port when configured port is in use (0369d2, d69f87)
  • Fix OpenAI compatibility (795a67)
  • Hide misleading rollback button for move operations (fbdba5)
  • Raise replay and journal gap thresholds to reduce unnecessary full rescans (377919, af2bf7)

Non-app

  • Analytics dashboard: full-stack metrics view with 6 data sources, rich download timelines, agent-readable report (b4f740, 0766c4, b97028)
  • Tooling: enforce CSS design tokens via Stylelint — spacing, colors, font sizes, border radius, z-index (50f2b4, e3259b, 36b340)
  • Testing: remove desktop smoke tests (covered by Vitest + Linux E2E), speed up store tests by ~20s (c6210a, dab071)
  • Refactors: reduce structural code duplication across write ops, listing, events, and search dialog (33ec2f)
  • Website: add story + testimonials sections, landing page polish, fix Docker healthcheck, fix Remark42 CSP (d5a7f4, 51acd8, 424a80, dd5e34)
  • MTP: upgrade mtp-rs to v0.2.0 (634255)

Cmdr v0.8.2

15 Mar 20:08

Choose a tag to compare

Fixed

  • Fix crash on launch after auto-update — fs::copy overwrote files in-place keeping the same inode, causing macOS kernel code signing cache to SIGKILL the app. Now writes to a temp file then rename() for a fresh inode (dec8457)
  • Fix indexing: per-navigation verifier catches index drift via background readdir diffs with 30s debounce, excluded system paths (/System, /dev) no longer inserted as empty stubs, unified exclusion checks across scanner/reconciler/verifier (7afe71b, 9434ee6)
  • Fix dir size display during indexing — show "Scanning..." during aggregation phase, refresh panes on aggregation-complete instead of scan-complete (a6a123d)
  • Fix navigation latency — fire-and-forget verification (no mutex block), parallelize 6 sequential listen() calls, remove redundant index enrichment from get_file_range (8f3ce55)
  • Fix indexing performance: replace composite index with integer-only (25 min → seconds for 5.1M entries), add name_folded column for O(log n) path resolution, deduplicate replay events (99% reduction in high-churn scenarios) (b94b611, 7ac477b, 4fe5bb4)

Non-app

  • Tooling: separate dev and prod log dirs, fix Linux Rust test output capture, fix smoke test timeout (8429123, 2181ad5, de5236b)
  • Docs: improve agent instructions (71f365b)

Cmdr v0.8.1

14 Mar 17:33

Choose a tag to compare

Fixed

  • Fix indexing: lock-free dir stats reads (bypass INDEXING mutex), remove redundant PathResolver LRU cache with latent staleness bug, remove broken micro-scans, fix "DB is locked" in post-scan reconciler, fix overlay race during index rebuild, fix lost scan metadata causing full rescan on every restart, fix dir→file replacement leaving orphaned children (50bd4fa, 44abfd1, 7319c5c, 26785fc, 795e48b, 424eedb, dbccec1, 8f87a4f)
  • Fix traffic light position in production builds (7551df2)

Non-app

  • Indexing: add concurrency stress tests, event loop tests, and reconciler tests (3ad3adc, 8a084cd, dbccec1)
  • Docs: ReadPool thread safety correction, release gotchas from v0.8.0 (a6b5c0a, 4aaa53f)

Cmdr v0.8.0

13 Mar 06:32

Choose a tag to compare

Added

  • Add custom macOS updater that preserves Full Disk Access permissions across updates — syncs files into existing .app bundle instead of replacing it, with privilege escalation when needed (190a637)
  • Add MTP delete, rename, and move operations with full progress, cancellation, and dry-run support (812ad07)
  • Add breadcrumb improvements: path displays "/" prefix, abbreviates home directory to "~" (44b7105)
  • Add auto-rescan on FSEvents channel overflow with user notification toast (ca7cece)
  • Add index debug dashboard with live DB stats, watcher status, event rate sparkline, and MustScanSubDirs log (7510ec3)

Fixed

  • Fix indexing: interrupt-safe reconciler replaces destructive MustScanSubDirs handling, stop micro-scans after cold-start replay, faster bulk inserts by dropping/recreating index, fix false FSEvents deletions, fix missing dir sizes after replay, eliminate enrichment lock contention, periodic DB vacuum (31df59e, 981b311, da74290, f0c225f, bf0b47f, d125a24, 67684bb)
  • Fix drag swizzle failing on wry 0.54+ — moved install to RunEvent::Ready after webview creation (2680bae)
  • Fix MCP live start/stop UX: query backend state as ground truth, serialize operations, auto-check port availability, unified status messages (f4c107a)
  • Fix MCP server not stopping on app quit (61fe290)
  • Fix traffic light position in production builds (b74ed39)
  • Fix scan overlay showing stale state — refresh UI after full scan completes (218bcb9)

Non-app

  • Vendor cmdr-fsevent-stream fork into monorepo as workspace crate (8b937a6)
  • Website: fix two FOUC flickers on page load (light mode flash, newsletter icon flash) (8c21ac7)
  • Tooling: self-hosted macOS GitHub Actions runner (665f63a), index DB query tool (37f1062), extract website deploy workflow (5744636), trim Linux test output (b9d0ef2), fix release script (190bfe9, 233c8dd)
  • Refactors: split indexing mod.rs into enrichment.rs, event_loop.rs, events.rs (bb7d57f)
  • Dev: pink title bar to distinguish dev from prod (d2c9ae4)

Cmdr v0.7.1

12 Mar 08:25

Choose a tag to compare

Fixed

  • Fix scan overlay stuck at 100% after directory size aggregation (2842e92)

Cmdr v0.7.0

12 Mar 00:21

Choose a tag to compare

Added

  • Add AI settings with three providers (off / cloud API / local LLM), 15 cloud presets with per-provider key storage, connection check, model combobox, RAM gauge, and context size control (b41365b, abfc248, 423e669)
  • Add live MCP server start/stop in Settings — no app restart needed (e0c55e7)
  • Add stale index detection with user notification toast and automatic rescan (b590a54)
  • Add device tracking for license abuse detection with fair use terms in ToS (cf4f913)
  • Add license section to Settings with status display, action buttons, and dynamic labels across the app (39cf7b4)
  • Improve app icon for macOS Sequoia (cc80d28)

Changed

  • Remove supporter license tier — legacy keys gracefully map to Personal (c0a63f5)
  • Split Settings UI horizontally 50-50% (9493f88)
  • Rename settings file from settings-v2.json to settings.json (d987cc8)

Fixed

  • Fix startup panic from blocking_lock in async context (f9855ca)
  • Fix SQLite write pragmas running on read-only connections, causing panic in subtree scans (a53a275)
  • Fix llama-server not stopping on app quit, keeping stale PIDs alive, and using excessive memory (256k → 4k default context) (eae70f1, ffcbc81, e45c742)
  • Fix Settings UI freezing for ~5s when stopping AI server — instant SIGKILL for stateless llama-server (2af7ee8)
  • Fix dev and prod app data clashing on same machine — dev now uses separate data directory and MCP port (b8b058a)
  • Fix fallback path resolution falling to / instead of ~ (8d7c644)
  • Fix indexing: 100x faster aggregation via in-memory accumulation, DB auto vacuum, truncate before full scan, live index size in Settings (47a2e8e, cad1af5, aff2046, 96323e9)
  • Fix FSEvents storms causing high memory pressure — mimalloc allocator, 1s dedup window, reduced SQLite cache and channel buffers (207ddee)

Non-app

  • Docs: replace 19 ADRs with colocated Decision/Why entries in 11 CLAUDE.md files, slim down AGENTS.md from 245 to 93 lines, add @wrap-up and @plan commands (ccf5cc7, d297a1a, 0595796)
  • Website: show version + file size on all download buttons, fix Intel/Apple detection flicker, fix a11y warning, fix Umami script collision (bd17056, ec35b1f, 55c950e, 0ad03f4)
  • Tooling: add html-validate and circular dep checks, pass kill signals in checker script, remove pnpm audit check (3dbd5af, 4bead2b, ce3eae1, 2c588bf)
  • Refactors: extract volume grouping, menu platform code, viewer scroll/search; eliminate all circular deps (7740fbc, 8522e71, e16bd91, 7ed1cea)
  • Add missing tests across multiple modules (b53ce59)