Repository navigation
Replies: 33 comments
Release hygiene: 4.0.9 version consistency + 4.1.0 dependency refreshPost-4.0.9 maintenance, done on
Held back on purpose: Verified green: cargo check --all-targets, clippy --all-targets, cargo fmt --check, cargo audit (0 advisories). |
AppImage launches on minimal / immutable distros without libappindicatorPost-4.0.9 fix, done on On Linux the system tray goes through
On these systems the window and every feature work; only the tray icon is absent. Installing Verified green: cargo check, clippy, cargo fmt --check. The |
AeroAgent coding loop (foundation)Landed on AeroAgent gains a curated set of tools for local coding work: an edit, verify, review, commit loop. Everything is GUI-only and either read-only or approval-gated, so it does not change how transfers or file management behave. A user who never asks the agent to code sees no difference. This is the first power-set of a broader plan; AeroAgent stays AeroFTP's file-first agent.
Verified green: cargo fmt --check, cargo clippy --all-targets -D warnings, the full Rust test suite, tsc, vitest (37 files / 352 tests), i18n:validate (47 locales), and the full PR CI (Linux, Windows and macOS builds, SFTP fixtures plus live, Socket, Snyk). Not promoted on the README or public channels for now. Anyone interested is welcome to reach out and I will gladly answer. |
Per-user groups/favourites +
|
| Area | Description | Status | Ref |
|---|---|---|---|
| Per-user state | Server groups and favourites moved from a shared global vault blob to each user's encrypted partition (best-effort one-time seed from the legacy blob); the dead aeroftp-favorite-servers localStorage export key was dropped |
🟢 fixed | 4afc1d97, 492b0f85 |
groups -i / users -i |
Labelled action bar + Help (H/?), screen-clearing Refresh (.), compact one-token selectors, header rule, Profiles/Groups count columns, and arrow + strikethrough summaries on re-index and delete (parity with profiles -i) |
🟢 fixed | 75c069bd, 3aec8910, 79617cc6 |
benchmark --tui |
The "Pick profiles to compare" picker repaints in place instead of clearing the screen each frame, so the title no longer flickers and the list no longer shakes on scroll | 🟢 fixed | 4e675d63 |
| Filen Quick Connect | Green Save now persists an API-key deletion (removes it from the vault like Convert to Native API) and cancels the 2FA auto-login countdown popup | 🟢 fixed | de830e8d |
Verified green: cargo test --bin aeroftp-cli (410 tests), cargo clippy --bin aeroftp-cli -- -D warnings, tsc --noEmit, and i18n:validate (46 locales, 0 placeholders).
iroh 0.92 to 1.0 migration: the 6 Dependabot alerts clearedQueued for v4.1.0, done on
Still owed before the release tag: the AeroShare 2-machine live matrix on iroh 1.0 (cross-network, 5G), since the P2P transport runs on this engine. Verified green: peer-l0 |
|
| Area | Description | Status | Ref |
|---|---|---|---|
-i action bar |
The profiles / groups / users interactive action bars are reordered safe-first: Help(H) leads, the read-only verbs follow, re-index(#) moves out of the front and the destructive Delete(D) sits last before Quit. The key letters are unchanged, so existing muscle memory and scripts keep working |
🟢 fixed | 330a3201 |
groups -i membership |
New a <group> <profile...> and x <group> <profile...> verbs add/remove member profiles to/from a group from inside groups -i (the counterpart to profiles -i's g toggle). Group by index or name, profiles by the same selectors as profiles -i (index, name, id, substring), multi-target and idempotent. The reverse users -i direction (groups to/from a user) stays under design while the data model is pinned |
🟢 fixed | 3da0f1ed |
Verified green: cargo test --bin aeroftp-cli (411 tests), cargo clippy --bin aeroftp-cli -- -D warnings, plus a live pseudo-tty check of every action bar and the a/x add/already-in/remove/not-in/unknown-group paths.
Interactive
|
| Area | Description | Status | Ref |
|---|---|---|---|
groups -i |
n [name] creates a new empty group (members added afterwards via a/x here or g in profiles -i); inline name or prompt, empty/duplicate name rejected |
🟢 done | 21d08c5ae |
users -i |
n [name] creates a new local user, prompting for the name and an optional account passphrase; clean "already exists" message before the passphrase prompt |
🟢 done | 21d08c5ae |
profiles -i |
n [query] runs a service-first catalog picker: substring-match aero catalog (company, method, protocol, provider id), numbered pick (a single match skips it), name defaulting to the company with a duplicate rejected, then protocol-aware fields |
🟢 done | 46d543b77 |
| Profile fields | Self-hosted protocols (ftp/ftps/sftp/webdav/webdavs/s3/swift) prompt host/port/username/remote-path (all optional, blank to defer); OAuth/API clouds record just the name. Credentials are added later in the GUI Edit modal, the same contract as profile-add |
🟢 done | 46d543b77 |
| Action bars | New(N) joins each -i action bar in the mutators block (after the read-only and cross-navigation verbs), with the hint lines and help text updated; key letters unchanged so no automation breaks |
🟢 done | 21d08c5ae, 46d543b77 |
The persist core was factored out of cmd_profile_add into a shared persist_new_profile_entry, so the n handler and the profile-add subcommand build and save the identical entry shape.
Verified green: cargo test --bin aeroftp-cli (413 tests, +4 across both phases) and cargo clippy --bin aeroftp-cli -- -D warnings, plus a live pseudo-tty walkthrough of every n flow (no-match, multi-match with abort, cloud create, self-hosted create with the field prompts). The --tui menu parity is tracked separately.
Provider offline-test coverage, Phase A (Azure, Immich, shared sanitizer)Wishlist follow-up, done on First slice of the "deterministic offline parser plus status-to-error tests for the unit-only providers" item. This batch covers the seams that are already pure functions, so it is tests-only with zero production change. The remaining providers need a small behaviour-preserving refactor first (extract a pure
Verified green: |
Provider offline tests Phase B Group A, plus a CI fmt-gate fixPost-4.0.9 follow-up, done on Phase A covered the providers whose error mapping was already a pure function. Phase B does the ones where it was trapped inside an async handler: for each, the status-to-error logic is lifted into a pure
Verified green: |
Provider offline tests Phase B, Group B start (GitLab, Filen)Post-4.0.9 follow-up, done on
Each async handler keeps identical behaviour: the extraction adds a testable seam, it does not change what callers see. The rest of Group B (Swift, Zoho, Internxt, Drime, kDrive, Jottacloud, 4shared) is queued per-batch. Verified green: |
Sigstore update verification now actually verifies (auto-updater)Post-4.0.9 follow-up, done on The in-app auto-updater has carried a Sigstore signature check since v3.3.0, but it had been stuck on its amber "verification unavailable" fallback since v3.3.2: GitHub Actions / cosign attach a v0.3 signing bundle to our releases, and the
Proof: pointed the verifier at the real published v4.0.9 Verified green: |
Bridge "Setup ... first" box no longer flashes open then collapsesPost-4.0.x follow-up, fixed on Switching to a Filen Desktop or MEGAcmd bridge tab made the amber "Setup ... first" box flash open during the "Checking..." probe and then collapse the moment the probe settled to green. The fix existed on a branch that never landed; I recovered it, confirmed it was not superseded by any other patch (the file on
Verified green: cherry-pick applied clean (3-way, no conflicts), Bundled with a release-plumbing bump: softprops/action-gh-release 3.0.0 to 3.0.1 (Dependabot #353, SHA pin advanced to |
Splash version label is now dynamic (root-cause fix for #367)Queued for v4.1.0 (#367, reported by @EhudKirsh). The 4.0.9 welcome / splash popup read
Verified green: |
Copy / Move a server profile to another user: data loss fixed, avatar overflow fixedPost-4.0.9 follow-up, fixed on Two defects, both real.
Verified green: cargo fmt clean; |
Transfer Queue per-item bar on Crypt overlays: now advancesPost-4.0.9 follow-up, fixed on A Crypt overlay upload encrypts locally, stages the ciphertext, then uploads it, and those crypt paths did not emit the per-item
Covers rclone-crypt and native AeroCrypt, file and folder. Verified green: cargo fmt clean; full |
Windows USB eject now actually ejectsPost-4.0.9 follow-up, fixed on On Windows the AeroFile PLACES eject control did nothing:
Verified on real Windows 11 by the Windows peer: the code compiles and links, and on a real USB pendrive the eject performs the native safe-removal, the PLACES row vanishes cleanly with no 0 B ghost, a removable-with-media and the system drive stay untouched (no regression), and the red failure toast renders on a genuinely busy drive. Verified green: A separate, non-blocking follow-up was noted on the way: on Windows a freshly inserted drive can take up to ~30s to appear in PLACES (the real-time volume watcher is Linux-only inotify; Windows/macOS fall back to a 30s poll). The fix would be a Rust-side |
OS "Extract here / Extract to folder" right-click verbs on Windows (Deliverable G)Deliverable G follow-up, on Extends the OS extract integration to the Windows shell. The NSIS installer now registers per-extension right-click verbs, "Extract Here with AeroFTP" and "Extract to Folder with AeroFTP...", that invoke the same cross-platform GUI extract intent already shipping on
Validation: this is an installer-only NSIS fragment, so the cargo and frontend gates do not apply (it is not compiled by cargo or vite); the hooks compile inside the Windows NSIS bundle on CI. The Linux gate state from rows 13-24 is unchanged. Live file-manager validation on a real Windows box (right-click a clear archive, an encrypted archive, and a vault) is still owed before the release tag. |
Filen Desktop bridges work outside the GUI + OpenDrive API host self-heals (#368 follow-up)Post-v4.0.9 follow-up, fixed on The Filen Desktop local bridges (
Verified green: fmt, clippy |
#368 Filen bridge fix validated end-to-end on WindowsFollow-up to the fix comment above: Fix A is now confirmed end-to-end on a real Windows runner against a live Filen Desktop bridge (admin/admin), binary built from
The only difference between PASS and the negative control is the Fix B (OpenDrive host normalization) was not run e2e (no OpenDrive account on the runner); it stays covered by the 4 |
AeroShare always-on, Windows local-STT build fix, the 5th file format and MSI shell-integration parityPatches landed on
Verified: each claim re-checked against the source on |
AeroShare always-on follow-up: draggable hub dialog + a status-bar receiver indicatorPatches landed on
Verified green: |
Provider offline-test coverage: Phase B Group B complete (#347 row 4 closed)Post-4.0.9 follow-up, done on This finishes the row-4 request: a deterministic, no-network regression net across every unit-only storage provider. Group B held the providers whose status/parse logic was inline in an async method rather than a separable
Swift is intentionally skipped: its only profile, Blomp, is inactive, so a parser net for it has no value today. With this batch all 16 row-4 providers are covered (Phase A: Azure, Immich, sanitizer; Phase B Group A: Koofr, Yandex Disk, Cloudinary, Uploadcare; Phase B Group B: GitLab, Filen, then the six above; GitHub was already covered). Row 4 is now done. Verified green: |
Quick Connect connectors aligned to one two-column layout (#215)Post-4.0.9 follow-up, done on The Quick Connect (Add Service) pages were born at different times, so some connectors were single-column and others two-column. They now share one layout: the same right column (profile name + icon, Local/Remote Path, Wrappers/Overlays) is used everywhere, including the OAuth cloud pages, which previously had no overlay option at all.
GUI-only, no backend protocol change. The layout is still independent profile records under the hood, each individually exportable. Verified green: |
"Active Sessions" sidebar filter now appears for Quick Connect re-authsPost-4.0.9 follow-up, fixed on A Quick Connect connection (notably an OAuth re-auth) is driven by the form, not launched from a saved card, so it carried no
The badge (jump-to-sessions) and the filter (narrow the grid) keep their distinct roles; the re-authed session now appears in both. Verified green: typecheck ( |
Wrappers / Overlays opens by default on the Quick Connect pageQuick Connect polish, done on The collapsible Wrappers / Overlays section on the Quick Connect page started collapsed, so reaching the transparent crypt overlay meant an extra click into a nested section. When closed it only hides a single enable checkbox, and you have to tick that checkbox to configure anything anyway, so collapsing it by default just buried the option one level down for no payoff. It now opens by default while staying collapsible, so anyone who wants the page tidy can still close it.
Verified green: |
#215 export/import: per-protocol credentials survive, and the CLI can back up profiles nativelyPost-4.0.9 follow-up, done on Two backend pieces for the Quick Connect redesign landed. First, Caveat A: a profile that holds one online account across several protocol modes (e.g. a Koofr account saved as Native API + WebDAV) now keeps each mode's saved credentials when the profile is exported and re-imported. Before, export/import dropped them, so every per-protocol login had to be re-entered on the new device. Second, the GUI's native profile backup finally has a CLI equivalent.
Verified green: cargo fmt, clippy --all-targets --all-features -D warnings (0 warnings), cargo test --lib (2419 passed), npm run build, i18n (0 needing translation). Plus a live round-trip with the real |
Filen S3 empty-folder rename now explains itself instead of leaking a raw 401Post-4.0.9 follow-up, fixed on S3 has no native folder rename, so AeroFTP emulates it as copy-then-delete of the underlying objects. An empty folder on Filen's local S3 bridge is a virtual prefix with no marker key, so there is nothing to copy and the rename cannot succeed server-side. AeroFTP already detected this and returned an actionable message, but only when the bridge answered the probe with 404 (as the Linux bridge does). On the Windows bridge the same probe answers 401, which slipped through as the cryptic
Verified green: |
Pre-release security audit remediation (AeroShare, AeroAgent, per-user, CLI, extract)Post-4.0.9 follow-up, fixed on The two High findings both broke a containment promise: AeroShare drive replication could write or delete outside the chosen folder, and the AeroAgent diagnostics tool could execute workspace code with no approval. Both are closed.
Verified green: |
OpenDrive privacy: editable Permissions, per-account default, and a CLI verb (#252)Post-4.0.9 follow-up, fixed on The original OpenDrive privacy bug from #252 was fixed back in v4.0.1; this closes the two follow-ups that were kept open: a cleaner, editable privacy surface, and a per-account default for new items. A CLI counterpart was added so the same control exists outside the GUI.
Verified end to end against a real OpenDrive account via the CLI: |
|
✅ Released as v4.1.0. Everything queued in the table above shipped in v4.1.0, now published (release notes). The headline is AeroShare, a Beta preview of direct, end-to-end-encrypted device-to-device transfer with no server in the middle: send a file or a folder straight to another person over a peer-to-peer channel (iroh 1.0 with Mainline-DHT discovery and federated relays), always-on at launch with a Discover tile, a titlebar +friend button, a draggable hub and a status-bar receiver indicator (#284, @EhudKirsh). Alongside it:
Per the tracker convention, 4.1.0 patches accumulated here; the next line gets its own tracker. The next release is v4.1.1, tracked in #1409. Known issues found in 4.1.0 will be logged there as reports come in; reporters close their own issues after confirming the fix in the release. Thanks to @EhudKirsh and everyone who reported, tested and suggested. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
AeroFTP 4.1.x, Rolling Tracker
Umbrella issue for AeroFTP 4.1.x: known issues for the current release (v4.0.9, release notes, published 2026-06-24) and the patches/updates landing on
mainfor the next release (v4.1.0).Before opening a new issue, please check the lists below. If your problem is already tracked here, just add a thumbs-up reaction or a comment with your environment (OS, version, provider) instead of filing a duplicate. We update this issue as bugs are found and fixed.
Found something that is not listed? Open a new issue and we will link it here.
What shipped in 4.0.9
See the v4.0.9 release notes and the previous tracker (#349).
Patches & updates queued for 4.1.0
Done on
main, shipping in the next release. Items appear here as they land.254103822b1dd825515abb03cf7ae3494afc1d97,492b0f85groups -i/users -ipolish (#311): labelled action bar plusHelp (H/?), aRefresh (.)that clears the screen (#341), compact one-token selectors (l1/1l/d2,ffor users), a header rule, count columns (Profiles, and Groups for users), and arrow + strikethrough summaries on re-index/delete so a move shows the struck old index and green new index and a delete leaves a struck tombstone, matchingprofiles -i75c069bd,3aec8910,79617cc6WM_DEVICECHANGElistener emittingvolumes-changedon device arrival/removal would make it instant; lighter mitigations are a refetch on window focus or a shorter poll interval. Surfaced during the #351 eject verification on real Windows hardwareStorageProvidertrait, recommending a hybrid model. Implementation is a later, separate effortaero benchmark --tuiprofile picker no longer flickers or shakes on scroll: the "Pick profiles to compare" view repaints in place (overwriting changed lines) instead of clearing the whole screen every frame, so the title stays put4e675d63de830e8d0512071a,41fd4397,13368e21-iaction bar reordered safe-first (#311): theprofiles/groups/usersinteractive action bars now lead with the read-only verbs andHelp(H), withre-index(#)moved out of the front and the destructiveDelete(D)last beforeQuit; the key letters are unchanged, so no automation breaks330a3201groups -iadd/remove members (#311): newa <group> <profile...>andx <group> <profile...>verbs curate a group's membership from insidegroups -i(the counterpart toprofiles -i'sgtoggle), idempotent and multi-target. The reverseusers -idirection (groups to/from a user) is still under design3da0f1edNew(N)verb (#311): create a profile, group or user from inside the-iloop (rclonen) New remotemodel) instead of dropping out to a separate add command.groups -in [name]makes an empty group,users -in [name]a new local user, andprofiles -in [query]runs a service-first catalog picker (substring-matchaero catalog, numbered pick, name defaulting to the company, protocol-aware fields for the self-hosted protocols, credentials added later in the GUI Edit modal). Complete across all three loops21d08c5a,46d543b78cfd49bcclassify_<provider>_error(status, body)function, with eachparse_errornow a thin wrapper of identical behaviour (theStatusCodeDisplay form is reconstructed from the status so the surfaced messages are byte-for-byte unchanged), then matrix-testing each one: body-level error codes, the HTTP-status fallback, field precedence and the sanitized-body fallback. Behaviour-preserving, 9 new unit tests. Group B (Swift, Zoho, Internxt, Drime, kDrive, Jottacloud, 4shared, GitLab, Filen) is queued per-batch8ad082fc,63a8229a,50042907,ff8b8910cargo fmt --all --check, which recent CLI-i commits and the Phase A test had drifted from, red-walling every push to main; a one-shotcargo fmt --allreformats the affected files (no logic change) so the fmt gate, and the vitest plus cargo-audit steps queued behind it, pass again387fbcedparse_error. GitLab: theexecutestatus match becomes a pureclassify_gitlab_error(401/403/404/429 plus the 5xx catch-all thatis_server_errorkeys its retry on), with 429 still short-circuiting before reading the body. Filen: it has no single seam (HTTP errors go through the already-pureformat_filen_error, logical errors through the per-call{status,message}envelope), so the one centralizable piece, the transient-retry class indownload_filen_chunk, becomes a purefilen_status_is_retryable. Behaviour-preserving, 4 new unit tests. Remaining Group B (Swift, Zoho, Internxt, Drime, kDrive, Jottacloud, 4shared) queued per-batchc841ee1d,176ff58fSigstoreVerifiedon real releases (validated offline against the actual v4.0.9.debbundle). The fallback is unchanged and stays non-blocking: the artifact SHA-256 remains the primary integrity check and any sigstore error still degrades to amber, so an install never blocks; the true end-to-end is exercised on the 4.1.0 to 4.1.1 updater path. Only theverifyfeature is enabled (thesignpath does not compile against the post-iroh-1.0 crypto graph and we never sign). Bonus: drops 3 now-moot cargo-audit ignores (sigstore 0.14 pulls tough 0.22, fixing both GHSA tough advisories;proc-macro-error2left the graph)42b126411a5a913e718ea10b..., verified as the dereferenced commit of the upstream v3.0.1 tag). Sibling Dependabot #356 (aes-gcm rc.4) was closed/held, a stale transitive RC bump that would have regressed sigstore back to 0.1347d5cc1cenv!("CARGO_PKG_VERSION"), the single source of truth bumped on every release) via an initialization script the page reads before paint, with the static text kept only as an out-of-app fallback. No IPC, no build step; the label can never drift from the published version again4feb65c8UserAvatar(image or clipped initial). The overflowing string was the avatar image, never a credentiald1a469fc8transfer_events the Transfer Queue listens to, so the per-item bar never moved. Both overlays (rclone-crypt and native AeroCrypt) now emit live start/progress/complete: folder uploads drive the running file-count badgeN/totaland single-file uploads thread a byte-progress callback so the bar and percentage advance during the upload5ca990fb1aero benchmarkreal defects fixed (#368): the sharedaeroftp-benchscratch base is now removed after a run (guarded: only when this run created it and left it empty, so a pre-existing base, a concurrent run or a--test-root-prefixis never touched), the scratch tree is built with mkdir-parents so WebDAV servers that refuse nested collections (pCloud WebDAV) work, both the per-profile header and the comparison tables gained a protocol column, a best-effort public-IP snapshot flags a run as not comparable if the IP changed mid-sweep, and a multi-profile run shows[k/N]per profile plus per-operationrun k/Nlines; plus a Yandex region hint on Yandex endpoint errors and the report form Connection-type clarified as downstream Mbpsbfb6c52b2dfbe42b6c,92cbbd256eject_volumehad no Windows implementation and the frontend swallowed the error. It now performs a real safe removal via the Shell.Application "Eject" verb (the tray "Safely Remove" action); since that verb is fire-and-forget, the call keeps the COM object alive and polls until the drive disappears (10s deadline) so a real failure surfaces instead of a silent false success. The misleading power glyph becomes a standard eject symbol; after a successful eject the no-media removable slot is dropped so no "Removable Disk (X:) 0 B" ghost row lingers in PLACES; and an eject failure now always raises a visible toast ("the drive is still in use") even when ambient toast notifications are off, since a clicked action must never fail silently. Six Linux-onlyvault_mounthelpers were cfg-gated to clear non-Linux build warnings found along the way. Validated on a real Windows 11 USB pendrive: the drive ejects (native "safe to remove"), its PLACES row vanishes cleanly, a removable-with-media and C: stay untouched (no regression), and the red failure toast renders;sidebar.ejectFailedtranslated in 47 localesbb3b488c,484ac1c1,fca2e93a,cde3c80f,0926ccbe,703e0832AeroFTP.exe --extract-here/--extract-to "%1"): the dedicated minimal window computes the never-clobber stem subfolder, prompts for a password on encrypted archives and vaults, and shows the native destination picker, never booting the main app. General formats (zip/7z/rar/tar/tgz/gz/xz/bz2) attach viaSystemFileAssociationsso the verb is additive and the double-click Open is untouched (decision c); the aero* ProgIDs gain the verbs next to their Open. Live Windows file-manager validation still owed before the release tag2aaf37696filen-desktop-webdav,filen-desktop-s3) authenticate to a loopback server defaulting to admin/admin, but that blank-to-admin/admin fallback lived only in the GUI connect path, so the CLI, benchmark, MCP and schedulers sent empty credentials and got "Invalid credentials" (WebDAV) / "signature does not match" (S3). A sharedapply_local_bridge_credential_defaultsin the anti-driftprofile_loadernow applies the same fallback on both headless paths (one helper fixes both transports). Separately, an OpenDrive profile switched from the WebDAV preset into native API mode could keepwebdav.opendrive.comand hit the WebDAV HTML auth page; the host is now normalized todev.opendrive.comin the backend (self-heals saved profiles) and reset in the preset-less mode switch. 9 new unit tests. Fix A validated e2e on Windows (both Filen bridge presets PASS with blank creds, a custom-webdav negative control to the same bridge FAILS, isolating the providerId); Fix B unit-test covered840222548aeroShareEnabledSettings flag, so the feature was undiscoverable. The Discover tile (E2E 256-bit badge), the titlebar +friend button (moved to the right of the theme toggle) and the handshake dialog are now always visible; adding a friend or sharing a folder auto-activates the feature (idempotentensureAeroShareActivated) and lights up the richer surfaces (peer filter, friend cards, notification bell). The standing receiver is never auto-started: a one-time prompt lets you opt in or out of receiving, recorded so it shows once, both changeable from Settings. i18n 47/47dfcd55cb+crt-static), butwhisper-rs-sysbuilds whisper.cpp/ggml via CMake which defaults to the dynamic runtime (/MD), so the ggml objects linked /MD against the rest of the image /MT and failed with LNK2038 (RuntimeLibrary mismatch), LNK2005 and LNK1120 (unresolved__imp_*thunks) at the gui-lib link stage. Two MSVC-only CMake env vars in.cargo/config.tomlforce whisper.cpp to the static release runtime (CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedplusCMAKE_POLICY_DEFAULT_CMP0091=NEW, needed because whisper.cpp pins cmake 3.5 where the policy defaults OLD), no crate fork. Inert on Linux/macOS;+crt-staticand the default local-stt feature kept0cb0f1b1.aeroftp-scriptregistered as the 5th file format + a generic archive icon: the README advertised five AeroFTP file formats but only four were OS-registered, so.aeroftp-script(it has an icon asset andsync_script.rssupport) fell back to the blank-document icon. It is now registered on all OSes (tauri.conffileAssociations, NSISAeroFTP.ScriptProgID plus MIME entry and uninstall cleanup, deb-postinst xdg-mime plus hicolor PNGs and SVG), matching the other four. A shared archive-family icon (amber box badge, distinct from the dark-red.aerozipand green.aerovault) was also added for the supported compressed formats (zip/7z/tar*/rar) as SVG, hicolor PNG,.icoand a draft.icns52de7b04,bb45b024installer/associations.wxs(wired viabundle.windows.wix.fragmentPathspluscomponentGroupRefs) brings the MSI installer to parity withhooks.nsh: the Extract Here / Extract to Folder verbs on the 8 general archive formats and the 2 aero archive ProgIDs, the 5 aero mimetype DefaultIcons, and the genericaeroftp.exeDefaultIcon fallback. All HKMU (perMachine resolves to HKLM), additive verbs only with no default-handler hijack (decision c);hooks.nshgains the matching DefaultIcon fallback for NSIS/MSI lockstep. Verified WiX ICE-clean, MSI Registry 87 rows, live elevated install/uninstall with the.zipdefault unchangedc33e0570useDraggableModal, clamped in-window, buttons/inputs excluded) instead of a fixed centered modal; and a status-bar pill next to AeroCloud surfaces the standing receive loop at a glance (emerald + dot when on, neutral when off) and toggles it on click, patching theaeroShareReceivingsetting the hub already acts on. The pill reframes Ehud's "put AeroShare next to AeroCloud" as a status indicator, not a fourth launcher (the +friend button, My Servers bar and Discover tile already open the hub), and only shows once AeroShare is activated3fc5ebc5,1a8da046classify_fourshared_auth(the 401 OAuth-token-revoked gate), kDriveclassify_kdrive_connect_auth(the 401 invalid-token / 404 unknown-drive handshake gate), Drimedrime_status_is_retryable(the transient-retry class: any 5xx plus 404/408/425/429). Deterministic offline parser tests where the listing/parse logic was already pure: Jottacloudparse_folder_xml(folders plus COMPLETED files, skipping deleted and incomplete, base-path join, md5/size/mime), Zoho WorkDrive byte-amount + recursive quota-key walk, Internxt filename/size helpers. Swift is intentionally skipped: its only profile, Blomp, is inactive. 10 new unit tests; all 16 row-4 providers are now covered6bd2941a,523f0603,2b36c30a,b20d2dbb,cb47474b,53fc2c06renderRightColumninstead of bespoke per-form columns. The 8 OAuth clouds (Google Drive, Google Photos, Dropbox, OneDrive, Box, pCloud, Zoho WorkDrive, Yandex Disk) render the shared right column via arightColumnrender-prop, so they now expose Wrappers / Overlays: a transparent crypt overlay (rclone-crypt or AeroCrypt) is activatable on the 7 overlay-eligible OAuth backends (hidden on Google Photos, a media-only API), with the overlay binding persisted through the OAuth save path. The profile name with a clickable icon avatar moved to the top of the column, Local Path now sits above Remote Path in every form, and the "Connect to X" button is disabled once already authenticated (reconnect from My Servers). GUI-only, no backend protocol changeb94fdf085,ce353d791#128-Clineage): a Quick Connect connection (notably an OAuth re-auth) is form-driven, not launched from a saved card, so it carried nosavedServerIdand showed only in the header Active Sessions badge (which counts raw session tabs) but never in the sidebar Active Sessions filter, whose count and result are both keyed on the set of sessionsavedServerIds (the filter narrows the saved-server grid tos => activeProfileIds.has(s.id)).connectToFtpnow binds the live connection to its matching saved profile before creating the session: credential protocols (FTP/SFTP/S3/WebDAV/API) via a precise uniqueprotocol + username + hostmatch, OAuth (empty username, host=displayName) via a provider-unique fallback applied only when a single saved profile exists for that provider (no mislink with multiple accounts; a no-match stays unlinked as before). The badge (jump-to-sessions) and the filter (narrow the grid) keep their distinct roles; the session now lights up both893236413overlaysExpandednow defaults totrue(and stays open when editing a saved profile, where it previously opened only if a crypt binding already existed), while the section header chevron still toggles it closed for anyone who wants the page tidy156031b8server_modes_<id>), thepersistModeCredentialsopt-in and the OAuth Remote Path all round-trip, and the "has credentials" import badge reflects every secret kind (OAuth, Jottacloud, crypt-overlay and the new snapshots), not only OAuth/Jotta2fc7d32caeroftp-cli profile-export/profile-importwrite and read an encrypted.aeroftpprofile backup, byte-compatible with the GUI's My Servers Export/Import (a CLI-exported file imports in the GUI and vice versa). It reuses the GUI's exact code path, so credential collect/restore including the #215 per-protocol snapshots is shared, not duplicated; secrets are opt-in via--include-credentials. Closes the gap where a CLI-first user could only convert to/from external formats or take a full keystore backup, never back up profiles natively4627dc26HEAD on rename source returned status 401. An empty folder is a virtual prefix with no object, so S3's copy-then-delete rename has nothing to copy; the Linux bridge already surfaced this via a 404, but the Windows bridge answers 401, which leaked the raw status. The 401/403 from a Filen S3 endpoint is now mapped to that same case, scoped tois_filen_s3_endpoint()so real files and non-empty folders are unaffected3ae5e8ccv4.0.9..HEADdelta surfaced 7 verified findings (2 High, 2 Medium, 3 Low); this closes 6 of them. The two High blockers both broke a containment promise: AeroShare drive-replicate wrote/deleted files at a publisher-controlledout_path.join(rel_key)with no../absolute guard (path traversal to arbitrary write/delete, RCE via~/.bashrc), now contained bysafe_replica_path(); andcoding_diagnosticsexecuted workspace code (cargo checkbuild.rs,tsc/eslintconfig) classified ReadOnly and ungated, now approval-gated (DangerLevel Medium). Plus the Medium per-user legacy-seed cross-user leak (now scoped to the single migrated owner and the global blob consumed), and 3 Low: the approval dialog now shows the command, CLIprofile-importno longer overwritesskippedcredentials (two-phase restore-only-added), and the extract window no longer mislabels real errors as wrong-password. The remaining Medium (knock/action flood) is deferred to 4.1.18e172771baeroftp-cli access <path> --to private/public/hiddensets the privacy of an existing file or folder (wired into the dispatcher allowlist and agent-info). On Linux the file picker now goes through xdg-desktop-portal to avoid a WebKitGTK GtkFileChooser heap corruption. Verified end to end against a real OpenDrive account via the CLI4e1086308Requested / under consideration
Community ideas captured for triage. Not committed to a release yet.
-iselectors (prioritised by the reporter ahead ofEdit(E)and the 2-letter semantics; exact behaviour to be pinned).jpgto.jxltranscode in AeroFile: JXL re-encodes an existing JPEG losslessly and reversibly (the original JPEG bytes reconstruct exactly), for a real size win with no quality loss. Candidate framing: AeroFile as a GUI for libjxl.mp3to.opusis destructive and should not be done silently)8cfd49bca(Azure listing parser, Immich status mapping, shared sanitizer), Phase B Group A8ad082fce..ff8b8910e(Koofr, Yandex Disk, Cloudinary, Uploadcare via extracted pure classify seams), Phase B Group Bc841ee1d1,176ff58fa(GitLab, Filen) then6bd2941a..53fc2c06(4shared, kDrive, Jottacloud, Zoho, Internxt, Drime). GitHub was already covered. Swift is intentionally skipped (its only profile, Blomp, is inactive). See queued rows 13, 14, 16, 33users -i: a verb sousers -ican add/remove groups to/from a user. The groups-side counterpart (groups -ia/xfor member profiles) shipped in 4.1.0; this remaining users<->groups direction needs the data model pinned first, since groups live inside each user's partitionKnown issues found after release
Reported against v4.0.9. Fixed items ship in v4.1.0; reporters close after confirming in the release.
v4.0.8while running v4.0.9 (the release bump missed the hardcoded splash version label). Re-synced onmainin25410382and then fixed at the root in4feb65c8(the label is now dynamic, so it can never drift again), see queued rows 1 and 20; shipping in v4.1.0xdg-openon the file, which OPENS it in the default app instead of revealing it in the file manager (unlike the Windows/select,and macOS-Rpaths that select it). Present in the v4.1.0 AeroShare feature. Fix is ready on branchfix/aeroshare-linux-reveal-file(reveal via D-Busorg.freedesktop.FileManager1.ShowItemswith a parent-folder fallback for minimal distros), gates green (fmt, clippy -D warnings, cargo test 2394, tsc), but NOT yet merged to main. Queued for v4.1.1.Status legend: 🔴 confirmed · 🟡 investigating · 🔵 planned / idea · 🟢 done / fixed (pending release) · ✅ released
Affected platforms
Maintained by the AeroFTP team. Current release v4.0.9, next v4.1.0. Patches accumulated here; each release line still gets its own tracker.
All reactions