Releases: vdavid/cmdr
Releases · vdavid/cmdr
Cmdr v0.11.1
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
ObjectNotFounderror log spam on every copy
(0cc675a) - MTP: fix mid-stream cancel corrupting USB session and making device unresponsive — bump
mtp-rsto 0.11.0
(a66adf6) - A11y: darken
--color-accent-textfor 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_infofor Linux
(00c5f18)
Cmdr v0.11.0
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 bynetwork.directSmbConnectionsetting
(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_changedwith incremental listing cache patches, smb2
background watcher viaCHANGE_NOTIFYlong-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
ptpcameradon 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_FOUNDon 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_subtreeauto-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_statscount 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-rsto v0.9.1 forObjectInfoChangedevents
(5b27ead)
Non-app
- Replace
smb/smb-rpccrates with customsmb2crate — 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
taoand indexing dev logs
(21b041b, 9bf0e00)
Cmdr v0.10.0
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://settingsresource andset_settingtool — inspect and change all settings without opening the Settings
window (c71115) - MCP:
move_cursornow awaits frontend confirmation, fixing race wherecopyfires 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_listingwas callingstd::fson MTP paths, emitting a
spuriousdirectory-deletedevent (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
MtpDevicefor 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 —
onDestroyrace 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, emitwrite-errorfor
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
Sendimpls,SAFETYcomments ontransmutecalls
(541804)
Improved
- Typed write operation errors replace string parsing — 9 specific variants (
DeviceDisconnected,ReadOnlyDevice,
FileLocked, etc.) instead ofIoError(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_forfilters 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_moduleson lockfile change
(ac4e26) - Refactor: split indexing module (1951 lines → focused files), extract shared
compute_bottom_up(), unify
name_foldedacross 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
Fixed
- Fix orphaned llama-server processes — rapid AI provider switching (Local → OpenAI → Local) could leave
llama-serverrunning after app quit. Spawn + PID tracking now happen in a single lock, pluspgrep-based cleanup on startup (b3382e) - Fix vendor-specific MTP device detection (Kindle, USB class
0xFFdevices) viamtp-rs0.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-server→api-server(7dc0da) - Refactor: split
search.rs(2361 lines) andSearchDialog.svelte(1552 lines) into focused modules (c17c21) - Refactor: deduplicate repeated code patterns across Rust, Svelte, TypeScript, and Go (52afe3)
- Upgrade 9 Rust dependencies —
reqwest0.13,rusqlite0.39,notify-debouncer-full0.7, and more (929556) - Tooling: skip
pnpm installwhen lockfile unchanged, saving ~20s per run (8d2b39) - Blog: add Kindle support article (5c9d5b)
Cmdr v0.9.0
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
searchandai_searchtools (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
autoreleasepoolwrappers 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 —
scanningflag 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
Fixed
- Fix crash on launch after auto-update —
fs::copyoverwrote files in-place keeping the same inode, causing macOS kernel code signing cache to SIGKILL the app. Now writes to a temp file thenrename()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 fromget_file_range(8f3ce55) - Fix indexing performance: replace composite index with integer-only (25 min → seconds for 5.1M entries), add
name_foldedcolumn for O(log n) path resolution, deduplicate replay events (99% reduction in high-churn scenarios) (b94b611, 7ac477b, 4fe5bb4)
Non-app
Cmdr v0.8.1
Fixed
- Fix indexing: lock-free dir stats reads (bypass
INDEXINGmutex), remove redundantPathResolverLRU 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
Cmdr v0.8.0
Added
- Add custom macOS updater that preserves Full Disk Access permissions across updates — syncs files into existing
.appbundle 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
MustScanSubDirslog (7510ec3)
Fixed
- Fix indexing: interrupt-safe reconciler replaces destructive
MustScanSubDirshandling, 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::Readyafter 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-streamfork 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.rsintoenrichment.rs,event_loop.rs,events.rs(bb7d57f) - Dev: pink title bar to distinguish dev from prod (d2c9ae4)
Cmdr v0.7.1
Fixed
- Fix scan overlay stuck at 100% after directory size aggregation (2842e92)
Cmdr v0.7.0
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.jsontosettings.json(d987cc8)
Fixed
- Fix startup panic from
blocking_lockin 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-upand@plancommands (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)