Repository navigation
v0.23.12
What's Changed
Added
- Sidebar row spacing and text size are now adjustable, independent of Compact interface (#379) — a user with 200+ hosts asked to tighten the gap between connections and groups and to control the sidebar font, because Compact interface appeared to change nothing in the list. It genuinely did not: the per-row vertical rhythm was a GTK widget margin (
set_margin_top/bottom(7)on each row's content box insidebar/view.rs), and a GTK4 widget margin is added outside the CSS box and cannot be overridden by a stylesheet — so Compact'swindow.compact listview > rowrule was dead code with no visible effect. Density now lives where CSS can reach it. Two new Settings ▸ Interface ▸ Appearance controls: Sidebar row spacing, a 0–12px slider (default 7, reproducing the old spacing exactly, so existing configs look unchanged until moved) that drives.navigation-sidebar > rowpadding through a dedicated live CSS provider; and Sidebar text size (Small / Medium / Large), a class scoped to the row label alone (.sidebar-row-label) so icons, group arrows and status indicators keep their metrics — a label-only class rather than awindowfont-size, which cascades unpredictably into VTE and em-based metrics in GTK4. Both apply instantly (no restart), are remembered across restarts and are applied from the first frame without opening Preferences. The two controls are fully independent of Compact interface, which now tightens window chrome only; the superseded (and ineffective) compact list-row CSS was removed. (rustconn-core/src/config/settings.rs,rustconn/src/sidebar/view.rs,rustconn/src/app.rs,rustconn/src/dialogs/settings/ui_tab.rs,rustconn/src/dialogs/settings/mod.rs,rustconn/assets/style.css)
Changed
- Quick Connect uses idiomatic Adwaita rows — the Host, Username, Password and Port fields were bare GTK widgets dropped into action-row suffixes, which read differently from the connection editor and name dialog. They are now
AdwEntryRow/AdwPasswordEntryRow/AdwSpinRowwith floating title labels, so the Quick Connect form matches the rest of the app. (rustconn/src/window/edit_dialogs.rs)
Fixed
- Quick Connect is now keyboard-first — the dialog opened with focus on nothing, and because Connect is a header button, pressing Enter in a field did nothing, so a connection needed the mouse. The Host field is now focused on open, and the three text fields activate the Connect button as the dialog default, so Enter connects from any field (the empty-host guard still no-ops when nothing is typed). (
rustconn/src/window/edit_dialogs.rs) - Split-pane color 1 (green) and 5 (red/pink) now match across the panel border, tab stripe and sidebar marker — the three surfaces that identify the same split pane drew from two slightly different palettes: the panel left-border and its header tint used
#2ec27e/#e01b24while the tab stripe and sidebar marker followed the authoritativeSPLIT_COLOR_VALUES(#33d17a/#f66151). The panel colors are aligned to the shared palette so one pane reads as one color everywhere. (rustconn/assets/style.css) - The sidebar "connecting" status icon has a single, correct color — the
.status-connecting(and.status-connected/.status-failed) rules were defined in bothstyle.css(at application priority) andsidebar_types.rs(at a higher user priority that always won), so thestyle.css"connecting = accent + opacity pulse" rule was dead and the state actually rendered as the warning color. The dead duplicates were removed, leavingsidebar_types.rsas the single source of truth; no visible change. (rustconn/assets/style.css) - Monitoring: the activity timer spins grey out when they do nothing — in Settings ▸ Monitoring, the Default Quiet Period and Default Silence Timeout spins stayed active even for the Off and Command modes, which ignore both values. They now follow the Default Mode (sensitive only for Activity / Silence), gated by the same
MonitorMode::uses_timerspredicate the activity coordinator uses, applied on load and live on mode change. (rustconn/src/dialogs/settings/monitoring_tab.rs) - Three user actions that failed silently now report the failure — a code audit found the same swallowed-error pattern the 0.23.8–0.23.10 releases fixed piecemeal: a user-triggered save or delete that only logged via
tracingand left the user with no feedback (the project's error-feedback rule requires a modal dialog for a save/delete failure, never logs alone). Three live sites were fixed to the canonical pattern already used by the Tunnels dialog delete path (alert::show_error) and the smart-folder actions. (1) Saving a tunnel in the Visual Tunnel Builder —save_tunnel_to_statewrote the tunnel and then dropped anysave_settingserror intotracing::error!, closing the wizard as if it had succeeded, so the tunnel would silently vanish on next launch; it now returns the error to both callers (the normal Save and the "Save Anyway" running-tunnel path), which show a modal Could Not Save Tunnel and leave the wizard open so the user can retry. This is the exact bug the 0.23.8 release fixed for the tunnel delete path but never for the sibling save path — a root-cause fix across both call sites. (2) Deleting a snippet from the Snippets manager logged a failed delete and then rebuilt the menu and list as if it had worked, so a failed delete looked successful (the snippet stayed/returned); it now shows a modal Could Not Delete Snippet and skips the rebuild when nothing changed. (3) Toggling hardware video acceleration (OpenH264) in Settings ▸ Clients persisted the switch with a log-only failure path while its two sibling actions in the same handler already surfaced errors; it now shows an error toast when the setting cannot be saved. (rustconn/src/dialogs/tunnel_builder/mod.rs,rustconn/src/window/snippets.rs,rustconn/src/dialogs/settings/clients_tab.rs)
Documentation
- Corrected two user-guide inaccuracies and documented the new controls — the guide stated the Sidebar width spin ranges 260–500px when the code allows 180–500; it now matches. The Appearance section documents the new Sidebar row spacing and Sidebar text size controls, and the Quick Connect section documents its focus-on-open and Enter-to-connect behaviour. A stale "34px" header-icon-button size in code comments was corrected to the real 32px. (
docs/USER_GUIDE.md,rustconn/src/window/ui.rs,rustconn/src/app.rs)
Dependencies
- Updated: zip 8.6.0 → 9.0.2 (a direct dependency, the one held-back major that is ours alone to move; it pulled constant_time_eq 0.4.2 → 0.6.1, lzma-rust2 0.16.5 → 0.21.0, zstd 0.13.3 → 0.14.2 and zstd-safe 7.3.0 → 8.1.0), plus the semver-compatible aws-lc-rs 1.18.1 → 1.18.2, aws-lc-sys 0.45.0 → 0.46.0, libz-sys 1.1.29 → 1.1.30 and syn 3.0.8 → 3.0.9. zip 9's one breaking change that touched us is
ZipFile::name()now returningResult<Cow<str>, ZipError>instead of&str(a non-UTF-8 entry name is surfaced rather than lossily decoded); the single affected call site in the Royal TS importer was updated to default an undecodable name to empty. No security advisories affected (cargo deny check advisoriesclean). CLI download versions all current (TigerVNC pinned at 1.16.2); the RustCrypto release-candidate family (aes-gcm, ecdsa, rsa) and the out-of-range majors (x509-cert 0.2 → 0.3, picky-krb 0.12.4 → 0.12.5) remain held back — all three are pinned transitively by the ironrdp/sspi stack (x509-cert byironrdp-pdu, picky-krb and the RustCrypto RCs bysspi 0.21.3viapicky), so they cannot move without bumping ironrdp itself; picky-krb 0.12.5 also still breaks the pinned sspi 0.21.3 (itsGssApiMessageErrorvariant), exactly as in 0.23.1–0.23.11. The Flatpak/Flathub manifests are in sync (GNOME runtime 51, FreeRDP 3.32.1, cJSON 1.7.19, OpenH264 2.6.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.23.12_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (.rpm from this release)
sudo dnf install rustconn-0.23.12-1.fc44.x86_64.rpmAppImage
chmod +x RustConn-0.23.12-x86_64.AppImage
./RustConn-0.23.12-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
Verifying your download
Every binary on this release (deb, rpm, AppImage, Flatpak) is covered two ways.
Plain checksums — download SHA256SUMS alongside the asset, then:
sha256sum -c SHA256SUMSSigned build provenance (SLSA, via Sigstore) — proves the file was built by this
workflow from this commit:
gh attestation verify RustConn-0.23.12-x86_64.AppImage --repo totoshko88/RustConn(The snap is signed by the Snap Store; the macOS build is delivered via the Homebrew tap.)