[3.7.1] - 2026-05-04
Mount Manager + community wishlist push (issue [#147])
A community-driven release closing the v3.7.x medium-effort cluster from issue [#147] and shipping the first big-feature ask from the same thread, the persistent Mount Manager. Filen Desktop's local WebDAV and S3 bridges now connect on the first try, AeroFile gains an aggregate multi-file Properties view and a recursive * flatten search, AeroSync wrapper scripts round-trip as .sh / .ps1, and a long list of polish items lands in one batch (PathBar empty-area edit, Settings keyboard model, smart Open with default app, configurable provider icon size, drag-reorder custom icons, dedup-aware Server Health dots on Discover, S3Drive icon + setup banner). My Servers gains a unified table layout with drag-to-reorder columns and a per-protocol dedup footer.
Added
- Mount Manager: new persistent mount registry reachable from File > Mount Manager, the My Servers toolbar, and the connected remote address bar. Saves multiple mount configs (profile, remote path, mountpoint, read-only, cache TTL, allow-other, auto-start) in either a plaintext sidecar JSON (default, daemon-friendly) or in the encrypted vault, toggleable from the dialog header. Per-row Mount / Unmount / Open in file manager / Edit / Delete actions, with a "Pick free drive letter" helper on Windows. Phase B autostart installs systemd-user units on Linux and Task Scheduler ONLOGON entries on Windows. Phase C "Open mount in file manager" auto-creates a default mount for the connected profile when none exists, waits 800ms for FUSE / WebDAV to settle, then opens the OS file manager. Tracked mounts inherit the GUI's vault credentials through
aeroftp-cli --profile; mount configs themselves never carry secrets. - Filen Desktop local presets: two new Discover entries connect AeroFTP to a logged-in Filen Desktop instance over the local Network Drive bridges. Filen Desktop (local WebDAV) runs at
local.webdav.filen.io:1900over HTTP with basic auth (username and password set in Filen Desktop > Network Drive > WebDAV, separate from the Filen account). Filen Desktop (local S3) runs atlocal.s3.filen.io:1700with literalfilenregion and bucket and path-style addressing. Both presets ship inline setup steps that surface the Filen Desktop configuration path the user has to walk before the bridge accepts connections. - Multi-file Properties: right-clicking on two or more files in AeroFile (local panel and any of the 22 remote providers) now opens a dedicated aggregate Properties dialog, mirroring the Windows multi-select view. Reports total file count and folder count, summed bytes with formatted units, common parent path, modified-date range (single Modified row when all entries share the same mtime, otherwise Oldest / Newest pair), and a "Mixed" indicator on the permissions row when entries do not agree. Tri-state Read-only and Hidden rows surface from a parallel
get_file_propertieslazy load. A scrollable list of selected entries with kind icon, name, and per-item size sits at the bottom. - Recursive search in AeroFile: typing
*or**in the local search box now flattens the subtree under the current directory, every descendant file and folder is listed with its relative path, BFS-bounded at 32 levels and 5,000 entries (clamped to 20,000). Optional residual filter after the marker (* foo,** foo) narrows the result by substring on the relative path. Search bar flips purple while flatten mode is active and warns when the entry cap is reached. - Custom Icons Manager: Settings > Appearance > Icons hosts a standalone gallery for the global custom-icon library, with upload of SVG / PNG / JPG / WEBP / ICO, sort by recent or A-Z, drag-reorder (in recent mode), inline rename via double-click, and delete with confirmation. Shares storage with the per-profile Choose Icon dialog so changes round-trip both ways through a
aeroftp-custom-icons-changedwindow event. - AeroSync wrapper script export: the AeroSync Templates dialog now exports the active sync configuration as a POSIX
.shor PowerShell.ps1script, defaulting to bash on Linux / macOS and pwsh on Windows. Generated scripts wrapaeroftp-cli syncwith the right flags and embed an# AEROFTP-METAJSON line so importing a.shor.ps1reconstructs the AeroSync settings without parsing the rest of the script. Round-trip is supported, hand-edited scripts are explicitly out of scope. - PathBar polish: clicking the empty area to the right of the last segment now drops straight into edit mode (Enter commits, Escape / blur cancels), and a trailing
>chevron after the current segment opens a dropdown listing the first-generation subdirectories so users can dive deeper without leaving the keyboard. - Settings keyboard navigation: Settings now behaves like a proper modal. Escape closes, Tab and Shift+Tab stay inside the dialog, the forward Tab cycle wraps from footer back to first focusable. The sidebar is a vertical
tablistwith Arrow Up/Down/Left/Right + Home/End. Settings > Appearance subtabs (Theme / Icons / Interface / Backgrounds) mirror the same model with a horizontaltablist. - Open with default app: AeroFile right-click adds a smart routing entry.
.aerovault/.aeroftp/.aeroftp-keystoreopen inside AeroFTP, scripts (.ps1/.sh) drop into AeroTools Terminal with the right shell prefix and POSIX-quoted path, every other extension goes through the OS default viatauri-plugin-opener. - Configurable provider icon size: Settings > Appearance > Interface exposes a Provider icon size slider (18-32 px, default 24). Both
ServerCard(My Servers compact + detailed) andDiscoverPanelcards size from the shared preference, including custom uploaded icons and favicons. - Custom icon drag-reorder + sort toggle: each tile in the IconPickerDialog Custom tab is now draggable, drop on another tile splices the array and persists the new order. Shipped tab gets a "Sort: Popular first / A-Z" chip pair below the search input, persisted in
localStorage['aeroftp-icon-picker-sort']. - Server Health dot on Discover cards: each
ServiceCardin the Discover panel now renders the same overlay-dot pattern asServerCard, gated onhealthStatus !== 'unknown'so services without ahealthCheckUrlstay clean. - CLI
aeroftp-cli profiles -i: interactive prompt loop after the table renders, with compact1l/2t/3d/qtokens (number-then-letter and letter-then-number both accepted) for list / tree / delete a numbered profile. Delete is gated by name-typed confirmation, the loop reuses the running binary viacurrent_exe()so output stays bit-for-bit identical to the standalone subcommand. - F2 keyboard shortcut hint:
ContextMenuItemgains an optionalshortcutprop rendered right-aligned in monospace. Local + remote AeroFile rename entries advertiseF2so the keyboard shortcut is discoverable from the menu. - Provider setup steps banner: connection forms with
setupInstructions(S3Drive, Filen Desktop S3, Filen Desktop WebDAV, MEGAcmd) now render a numbered checklist above their credential fields with a link to the upstream documentation. - My Servers unified table: five-phase rework brings storage Used / Total / % columns with configurable warning thresholds, a real semantic
<table>with sticky<thead>/<tfoot>and click-to-sort on every column, dedup-aware footer and a per-protocol "Storage by protocol" expandable panel, CLIaeroftp-cli profilesparity with the GUI columns and JSON / CSV output, and column drag-to-reorder + resize (also applied to AeroFile remote and local panels through a shareduseTableColumns<T>hook). Storage column visibility persists in vault keys (my_servers_table,aero_file_remote_table,aero_file_local_table).
Fixed
- WebDAV scheme detection rewrite (root cause for the Filen Desktop local-WebDAV failure reported on [#128]):
WebDavConfig::from_provider_configwas falling back to "port == 80, http, otherwise https", so HTTPS handshakes hit Filen Desktop's HTTP listener on port 1900 and failed before any auth or path negotiation. Detection is now layered: explicit scheme on the host string wins, then the newtls_modeextra field ("http" / "https" / "auto"), then "auto" maps localhost / 127.0.0.1 / RFC 1918 /*.local/*.localhost/ Filen Desktop hostnames to HTTP on any port. TheProviderConnectionParamspath now forwardstls_modeandverify_certinto the WebDAVextramap,ConnectionScreenpropagatesoptions.webdavSchemefrom a provider preset into the connection params. 7 unit tests inwebdav_config_testscover the new precedence rules. - Filen v3 Argon2id authentication: new Filen accounts using
authVersion >= 3can now log in. AeroFTP derives credentials with the same Argon2id parameters used by the official Filen SDK (t=3,m=65536,p=4,v=0x13,dkLen=64) and decodesauth/infosalt as hex bytes for v3. v1 (SHA-512) and v2 (PBKDF2-SHA512) accounts continue to work unchanged. New "Auth version" badgev1/v2/v3on saved cards, surfaced after first successful connect. - Storage quota persistence on OAuth providers: Dropbox, Google Drive, and pCloud showed quota in the bottom status bar but not on the saved server card. The OAuth call paths now pass
effectiveParams/normalizedParamssosavedServerIdflows throughpersistQuotaToProfile, a localStorage mirror plusserversRefreshKeybump re-renders My Servers without a full reopen. - Koofr WebDAV quota: Koofr does not implement RFC 4331 quota properties, so PROPFIND returned empty values. The WebDAV provider now detects
app.koofr.netand falls back to the native Koofr REST API (/api/v2/mounts) using the same basic-auth credentials. - Terminal goes black on tab switch: replaced the single shared DOM container +
xterm.open()reattach pattern with one persistent DOM container per tab, hidden via CSS when inactive.xterm.open()is now called exactly once per xterm instance. Verified end-to-end on Linux (WebKitGTK) and Windows 11 (WebView2). - Ctrl+- / Ctrl+= / Ctrl+0 / Ctrl+wheel on the focused terminal: global font-size hooks now skip events originating in
.xtermor.monaco-editor, and xterm'sattachCustomKeyEventHandlerstops the keys being forwarded to the shell as control sequences. Settings > Appearance > Interface > Font Size updates in real time when the global hotkeys fire. - F2 inline rename in AeroFile Large Icons view: input was frozen on the initial filename character because
setSelectionRange(0, dotIndex)was running before the<input>had its initial value committed. Fixed by sharing a singleinlineRenameValuebinding across list and grid views in both panels (local + remote). - Forward / Back mouse buttons (X1 / X2): X1 (event.button 3) navigates Back, X2 (event.button 4) Forward, mimicking File Explorer / Nautilus / Finder. 64-entry capped history stack with redo-truncation on new navigation. When a modal is open or history is empty, falls back to the existing Escape synthesis so "Back closes the open dialog" still works.
- MEGAcmd anonymous WebDAV: the WebDAV backend now supports explicit anonymous requests, so local bridges no longer receive an empty
Authorization: Basicheader. - S3Drive icon + Filen Desktop logos: the S3Drive provider entry was falling back to the generic HardDrive lucide icon, the two Filen Desktop bridges had no PROVIDER_LOGOS mapping and were rendering the protocol icon instead of the Filen logo. Both are wired correctly now.
- Choose Icon dialog regressions: PNG-backed provider logos (Hetzner, MinIO, Koofr, FileLu, Blomp, OpenDrive, and 8 more) silently failed on click because
reactLogoToSvgDataUrl()searched for an<svg>that was never rendered, now an<img>fallback returns the image src so every shipped catalog entry is selectable. Custom icons box accepts drag and drop with visible feedback and deletes go through a confirmation prompt. - Cross-Profile transfer dedup: the same source / destination pair queued multiple times no longer enqueues duplicate jobs.
- Drime Cloud folder listing 500 (issue [#148]): double-clicking any folder on a Drime profile failed with
Server error: List /Temp failed (500 Internal Server Error)while root listing worked fine. Root cause: AeroFTP was building the Drimefile-entriesquery with the Laravel-style array-bracket notation?parentIds[]=<id>but Drime's backend expects PHP-style comma-separated values?parentIds=<id>(verified against the official PyDrime client). Replaced all four call sites indrime_cloud.rs(resolve walk, find-in-folder, list, rename helper) with the correct parameter shape. Root listing kept working because it sends noparentIdsat all, which is why the regression only surfaced on the first sub-folder navigation.
Changed
- Backblaze B2 native Quick Connect form: native B2 no longer falls through to the generic FTP / server template. Quick Connect now renders Application Key ID, Application Key, and Bucket Name.
options.bucketround-trips through saved profiles and is forwarded intoprovider_connect. - Quick Connect form rework (round 1 of the issue [#147] feedback): removed the redundant footer from WebDAV preset Quick Connect pages, moved Generate password / Create Account links inline next to the Password / Username fields, dropped the "Save this connection" checkbox in favour of an always-visible connection-name input, moved the Docs link to the top-right corner, renamed Server to Endpoint URL with a
Link2chain icon for URL-based protocols (WebDAV, S3, Azure), added a Generate personal login token link to Jottacloud Quick Connect. - Cipher-strength badges go bit-precise: MEGA shows
E2E 128-bit(AES-128, Curve25519 keypair), Filen and Internxt showE2E 256-bit(AES-256), rclone-crypt overlay backends show plain128-bit/256-bitwithout theE2Eprefix because the server has no key. - Multi-thread chunk parallel download for S3 (Phase 1): new global flags
--multi-thread-streams N(default 1, opt-in up to 16) and--multi-thread-cutoff(default 250 MiB), HTTPRangeparallel streams overtokio::JoinSet, sparse pre-allocation, atomic.aerotmpfinalize. Auto-fallback to single-stream whenAccept-Rangesis missing. with_reauthpattern brought to Internxt and Yandex Disk: Internxt's 7-day JWT now does a fast-pathkeep_alivewith a fresh-login fallback, Yandex Disk distinguishes transientAuthenticationFailedretry from terminalAuthenticationRevoked.aeroftp-cli cryptcheck(carry-over from the v3.7.0 to v3.7.1 window): plaintext-vs-rclone-crypt integrity verification with streaming decrypt + hash.--algorithm sha256|md5,--json,--one-way. Exit codes aligned withcheck. No plaintext is ever written to disk during verification.- i18n: 100+ new keys translated into all 47 locales via the GLM batch method, including Armenian native script.
i18n:validateis clean (0 errors, 0 warnings, 0 placeholders).
Internal
- Activity Log gains
PROFILE_SAVEandPROFILE_DUPLICATEevent types so saved-profile dedup events are auditable, keyed bygetStorageDedupKey. - Headers of
SettingsPanel,VaultPanel, andMasterPasswordSetupDialogcarrydata-tauri-drag-regionso the window-move gesture works directly on the modal title bar. - Pre-push gates green at release cut:
npx tsc --noEmit,npm run i18n:validate,cargo clippy --all-targets,npm run build, regression scan.
Downloads:
- Windows:
.msiinstaller,.exe, or.zipportable (no installation required) - macOS:
.dmgdisk image - Linux:
.deb,.rpm,.snap, or.AppImage