What's Changed
Added
-
Portable encrypted file backend — cloud-syncable credential storage (issue #293) — a new secret backend keyed by a passphrase you choose instead of by the machine, so one file holds your passwords and opens on every device you own, Linux and macOS alike. Configured in Settings ▸ Secrets: pick a path inside whatever folder your cloud client syncs, choose a passphrase, and optionally have it remembered locally. Existing passwords can be copied into the portable file in one step, keeping the originals as the local fallback.
rustconn-cli secret get/set/deletework with it too.The file uses AES-256-GCM with a key-encryption-key / data-encryption-key split derived from Argon2id. Concurrent edits resolve as last-writer-wins; there is no passphrase recovery. Both limits are documented in the user guide.
-
Settings ▸ Secrets ▸ Copy Passwords… — move stored passwords between any two backends — a dialog with From/To selectors covering all eight backends, progress reporting, and the ability to stop mid-batch. Reports what arrived, what had no stored password, and what failed, by name. Refuses when two entries would collide in the destination rather than silently overwriting.
-
Settings ▸ Secrets ▸ Change Passphrase… — re-encrypts every credential in the portable file under a new passphrase. All-or-nothing: a single unreadable entry aborts and leaves the file unchanged.
-
Passphrase strength indicator — the setup row warns when a passphrase is weak. Advice only, never a refusal; not shown when opening an existing file.
-
Create File button in Settings — creating the portable file is now an explicit step with confirmation, rather than a side effect of the first credential save. On a second machine it verifies that the passphrase opens the file the sync client delivered.
Fixed
-
Terminal starts at correct size instead of 24×80 (issue #294) — programs that check geometry only at startup (
mc,htop) now see the real window dimensions immediately. -
Keyboard shortcuts help dialog shows user overrides (issue #295) — the window was built from a compile-time array and always showed defaults. It now reads the effective accelerators, including remapped bindings, and lists eleven non-rebindable shortcuts that were previously missing.
-
macOS: Dock showed a generic tile instead of RustConn's icon — set at runtime via AppKit when no
.appbundle is behind the process. Lives in a newrustconn-dock-syscrate. -
macOS: Homebrew formula's
.apphad no bundle identity — the wrapper script lost the bundle context, causing a generic Dock tile and missing tray icon. The bundle now holds the real binary directly. -
~in Settings path fields was taken literally —~/Dropbox/rustconn.encnow expands correctly for the KeePass database, key file, pass store and portable file paths. -
Empty row visible in the Portable Encrypted File settings group — the status row was always present but hidden wrong, leaving a blank band. Also fixed: status messages from different sources (keyring warning, file creation, copy result) no longer erase each other.
-
Portable file could be overwritten during setup on a second machine — a file arriving from the sync client during the half-second Argon2 derivation was discarded. The path is now re-checked before the rename.
-
Saved passphrase reported as stale when it no longer opens the file — previously said "Incorrect passphrase", now says "The saved passphrase no longer opens the portable file" with guidance to update it in Settings.
-
Selecting the portable backend made the machine-bound store unreachable — credentials in
credentials.encbecame unreadable immediately after switching, before the user could run Copy Credentials. Fixed. -
Wrong passphrase read as "no stored password" — a mistyped passphrase in Settings now surfaces as an explicit error instead of silently falling through to a password prompt.
Improved
-
Backend selector redesigned — now an
AdwComboRowwith descriptions explaining each option's trade-offs. Both file backends show file status (path, credential count, or error state). -
Fallback toggle is now an
AdwSwitchRow— was a checkbox naming "libsecret" on all platforms; now says "macOS Keychain" on macOS. -
rustconn-cli --backendacceptsencrypted-fileandportable— the machine-bound file backend was previously unreachable from the CLI without changing Settings first. -
Transfer failures named in a dialog, not a disappearing toast — entries that could not be copied are listed by name with guidance, rather than reported as a count in a transient notification.
Security
-
Passbolt CLI error messages no longer contain the submitted password —
go-passbolt-cliquotes its arguments in error output; those are now scrubbed before logging. -
Bitwarden CLI no longer logs saved passwords at debug level — the base64-encoded item (containing the plaintext) was logged on every
bw create/edit. Only the verb is logged now. -
Vault parse errors no longer quote credential values — serde's
Displayincluded the rejected token, which could be a password stored as a JSON number. Parse errors now report position and category only. -
Intermediate plaintext copies are wiped on drop — five code paths across Passbolt, 1Password, KeePass and the portable store left
expose_secret().to_string()in bareStringinstead ofZeroizing. Fixed. -
Portable store data key no longer left in an unwiped stack slot — the
[u8; 32]isCopy, so wrapping the copy inZeroizingleft the original unprotected. Now filled in place. -
Credential store temp files are created
0600— previously chmod'ed after the write, leaving a window where the KDF salt and wrapped key were world-readable. Temp names are also randomised and opened withO_EXCL. -
Concurrent writes no longer lose entries — a mutex now spans the full read-modify-write cycle. Cross-machine writes remain last-writer-wins.
-
Portable file size and entry count capped before parsing — 8 MiB / 10 000 entries. Argon2 cost ceilings reduced to 256 MiB / 12 iterations.
-
KeePass bulk transfer has a per-entry timeout — a hung
keepassxc-clino longer blocks the entire batch indefinitely.
Localisation
-
Georgian (ka) added — PR #296 — full catalogue contributed by Ekaterine Papava. RustConn now ships 17 locales.
-
Eighty-five new strings for the Secrets rework translated in all 17 locales — merged with
--no-fuzzy-matchingto avoid incorrect guesses that render as English while counting as translated. Ukrainian reviewed against the project style guide.
Documentation
docs/USER_GUIDE.md— new "Portable Encrypted File" section covering setup, passphrase choices, and limitations.docs/ARCHITECTURE.md— key hierarchy, untrusted-header handling, and cloud-sync ceiling.docs/CLI_REFERENCE.md— new--backendaliases and passphrase prompting behaviour.
Dependencies
- Updated: zvariant 5.14.0→5.15.0, zvariant_derive 5.14.0→5.15.0, zvariant_utils 4.1.0→4.2.0
Installation
Flatpak (Recommended)
flatpak install flathub io.github.totoshko88.RustConnSnap
sudo snap install rustconnDebian/Ubuntu (.deb from this release)
sudo dpkg -i rustconn_0.20.4_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (.rpm from this release)
sudo dnf install rustconn-0.20.4-1.fc44.x86_64.rpmAppImage
chmod +x RustConn-0.20.4-x86_64.AppImage
./RustConn-0.20.4-x86_64.AppImagemacOS (Homebrew)
brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.appAll dependencies (GTK4, libadwaita, VTE, Adwaita icons) are installed automatically.
Requires macOS 13 (Ventura) or later.
OBS Repositories
Packages available at: https://build.opensuse.org/package/show/home:totoshko88:rustconn/rustconn
# Debian 13 (Trixie)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/ /' \
| sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/Release.key \
| gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn
# Ubuntu 24.04 LTS (Noble)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/ /' \
| sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/Release.key \
| gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn
# Ubuntu 26.04 LTS (Resolute)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/ /' \
| sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/Release.key \
| gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn
# Fedora 44
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_44/home:totoshko88:rustconn.repo
sudo dnf install rustconn
# Fedora 43
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_43/home:totoshko88:rustconn.repo
sudo dnf install rustconn
# openSUSE Tumbleweed
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Tumbleweed/ rustconn
sudo zypper ref && sudo zypper in rustconn
# openSUSE Leap 16.0
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Leap_16.0/ rustconn
sudo zypper ref && sudo zypper in rustconnArch Linux (AUR)
yay -S rustconnFreeBSD (Ports)
pkg install rustconnFull installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md