What's Changed
A documentation-and-consistency pass driven by a user-guide audit: the CLI
reference and user guide are brought back in line with the code, two CLI flags
that were silently dropped now fail loudly, and the automatic-login timeout that
was reachable only by editing connections.toml gains a control in the
connection editor.
Added
- Login timeout is now editable in the connection editor —
login_timeout_secs(how long the automatic-login watcher waits for the device's prompt) was fully wired through the model and group inheritance but had no UI, so it could only be set by hand-editing theautomationsection ofconnections.toml. The connection editor's Automation tab now carries a Login Timeout (seconds) row in the Automatic Login group;0means the built-in default (10 s), matching the storedNone.
Fixed
-
A SPICE connection with a stored password failed outright in Flatpak with "connection type cannot be detected from URI" (issue #308) — a regression from the 0.21.2 fix in the same issue. That fix delivers the password to
remote-viewerthrough a.vvconnection file written to$XDG_RUNTIME_DIR, on the assumption that the sandbox and the host see that directory at the same path. They do not: Flatpak gives the sandbox its own runtime directory and keeps it on the host under/run/user/<uid>/.flatpak/<app-id>/xdg-run/. virt-viewer is a desktop application in its own right and is not bundled in the manifest, so it is found on the host and launched throughflatpak-spawn --host— where the path it was handed does not exist.remote-viewerthen falls back to reading the argument as a URI, cannot type it, and aborts. Setting the password source back to None was the only way to reconnect, since without a password no file is written and the plainspice://URI is used.The path handed to a host viewer is now translated to the host's own view of the file, and the translation is verified with a readability probe rather than assumed, so a Flatpak that arranges its runtime directory differently is detected instead of silently producing another unusable path. When no host-visible path can be confirmed, the launch drops back to the URI: the viewer asks for the password, as it did before 0.21.2, rather than failing to connect at all. Requires no new Flatpak permissions — the existing
--talk-name=org.freedesktop.Flatpakis what makes both the probe and the launch possible. Native and Snap installs were never affected, since there is no sandbox boundary to cross. A related leak is fixed with it: a connection file that was written but never handed over is now removed immediately, where previously a successful spawn released ownership to a viewer that had no way to read the file, leaving the password on disk for the rest of the session. -
--keyand--auth-methodwere silently dropped for non-SSH protocols —rustconn-cli add/updateaccepted these flags for every protocol but only applied them to SSH (and, foradd, SFTP), logging a warning and discarding them otherwise. A typo such as-P vnc -k id_rsaproduced a connection that quietly ignored the key. Both commands now reject the flags for any protocol other than SSH and SFTP with a clear error, andupdatenow also honours them for SFTP connections (previously ignored — a latent bug). -
--window-modereported SPICE as a supported protocol while ignoring it —Connection::supports_window_mode()returnedtruefor SPICE, but SPICE always uses an external viewer, so the setting has no observable effect. The docstring, CLI help, and reference all said "RDP and VNC only" while the code disagreed. SPICE is now excluded fromsupports_window_mode(), so the code, help text, and documentation agree.
Documentation
-
CLI reference and user guide realigned with the code (0.21.4 audit): version headers corrected to 0.21.4 (the CLI reference still read 0.18.11);
--audio-modeand--printerRDP flags documented in theadd/updatetables;webadded to the--protocolvalue list (help text and reference); the differing--mptcp/--skip-port-checksemantics onupdate(which accept an explicittrue/false) now explained;sync inventorycross-linked from the Cloud Sync subcommand table; the--backendhelp text expanded to the full list of eight backends; and the Split View shortcut table gained the missing Ctrl+Shift+R (Pop Pane to Tab) and Ctrl+Shift+J (Unsplit). -
.kirodevelopment rules audited and repaired —cargo-security-scancould not report the one thing it existed for: its inlinecargo deny check advisories 2>/dev/null || cargo audit 2>/dev/null || echo 'Neither … installed'conflated "the tool found an advisory" with "the tool is absent" (cargo-deny exits non-zero because it found one), while2>/dev/nulldiscarded the report itself — measured at 0 bytes on stdout against 96 on stderr. The logic moved tobin/cargo-advisory-scan.sh, which probes withcommand -v, keeps both streams, logs totarget/cargo-advisories.log, and invokes the barecargo-denybinary sorust-toolchain.tomlis not asked to resolve a toolchain for a lockfile parse — the reasonci.ymlalready callscargo-machetedirectly.scripts/check-ai-docs.shgained a third gate asserting every hook file has a row inhooks-map.md, after that map was found covering 15 of 16 (session-baselinehad been missing since 2026-08-26 in a file whose first line promises all of them).bash-serialization-guard's four block messages pointed at/tmpin seven places while the always-loadedshell-environment.mdrequirestarget/; they now agree, and the message's ownnohupexample carries thetimeoutthe guard demands of it.hooks-map.mdalso lost a stale false-positive claim (pgrep -f cargois not blocked — the guard needscargoplus a build verb, verified by probe) and a worked example built onrustconn/src/secret/, a directory that does not exist.bugfix-workflow.mdbecameinclusion: auto; the four runbooks that must staymanualare now listed with the reason indocs/AI_DEVELOPMENT.md. Removed two unreferenced tracked files from the repository root:gitlog.txt(agit logdump) andpackage-lock.json(an empty npm lockfile in a Rust workspace). -
Contributor-facing community files added — the four items GitHub's community-standards checklist reported as missing now exist:
CODE_OF_CONDUCT.md(Contributor Covenant 2.1, enforcement contact and a pointer to Security Advisories for vulnerabilities),CONTRIBUTING.md(development setup, the local equivalents of the twelve CI jobs, the crate-boundary andunsaferules that get a PR sent back, commit and changelog conventions, and the translation workflow with its three gates), three issue forms under.github/ISSUE_TEMPLATE/(bug report, feature request, translation) with aconfig.ymlrouting vulnerabilities to Security Advisories and questions to Discussions, and.github/PULL_REQUEST_TEMPLATE.mdmirroring the Definition of Done. Three labels were created to go with them —i18n, applied automatically by the translation form, plusdependenciesandci, which.github/dependabot.ymlhas been requesting since it was written without ever getting them: Dependabot drops a label that does not exist in the repository, so all sixteen of its pull requests from#226onwards landed unlabelled. Nothing in the build or the shipped application changes.
Dependencies
- Updated: aws-lc-rs 1.18.0 → 1.18.1, aws-lc-sys 0.44.0 → 0.45.0. Semver-compatible updates from
cargo update;cargo check --all-targetsis clean against the refreshed lock file.
Installation
Flatpak (Recommended)
flatpak install flathub io.github.totoshko88.RustConnSnap
sudo snap install rustconnDebian/Ubuntu (.deb from this release)
sudo dpkg -i rustconn_0.21.4_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (.rpm from this release)
sudo dnf install rustconn-0.21.4-1.fc44.x86_64.rpmAppImage
chmod +x RustConn-0.21.4-x86_64.AppImage
./RustConn-0.21.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