Releases: hbuddenberg/rdp-connect
Release list
v2.0.1 — Fix MONITOR_ID parsing with spaces
Fixed
- Indirect Expansion Crash on
MONITOR_ID: Fixed Bashset -euo pipefailcrash whenMONITOR_IDcontains spaces (e.g. monitor description strings like"ASUSTek COMPUTER INC XG27ACS...") during indirect variable expansion for canvas capping resolution overrides. - Single-Monitor Canonical Resolution: Enhanced single-monitor mode resolution matching to resolve description substrings against canonical monitor JSON for correct workspace and geometry calculation under both Hyprland and Niri.
v2.0.0 — Quickshell UI, Automated Installer & AUR Package
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
[2.0.0] — 2026-08-28
Added
- Native Quickshell Modal UI (
ui/shell.qml): Modern standalone applet matching the Omarchy 4 design system with 4px border radius, 2px dynamic accent border reading live fromcolors.toml, visual profile picker, monitor checkboxes, and hardware feature toggles (Audio, Clipboard, Drive, USB, Webcam). - Interactive Quickshell Selector Engine:
rdp-connectautomatically uses Quickshell as its primary graphical selector when run without arguments, applying configured options directly without duplicate prompts. - Multi-Launcher Hierarchy: Graceful fallback across launchers:
Quickshell→Walker→Wofi→Rofi. - Robust Autoinstaller (
install.sh): Unified installer with dependency checking, user/system mode support, Quickshell UI deployment, and permission hardening. - Arch Linux & AUR Packaging (
PKGBUILD,rdp-connect.install): Complete standard PKGBUILD recipe for AUR distribution with clean dependencies and license packaging. --version/-VCLI Flags: Added standard version display command.
Security
- Hardened Secret Isolation: Verified strict stdin credential piping to FreeRDP (
/from-stdin:force) preventing credential exposure in process tables (ps aux). - No Hardcoded Credentials: Ensured all repositories, tests, and documentation are strictly clean of private data.
v1.2.1
Fix VA-API driver auto-detection by removing hardcoded LIBVA_DRIVER_NAME=iHD.
v1.1.0 — Client selection, kill-on-relaunch, dynamic selector, Hyprland keybind
Major additions since v0.6.0
Multi-client support
- CLIENT selection (
--client x11|sdl|wayland+ profile keyCLIENT):x11(default):xfreerdp3— most stable for single-monsdl:sdl-freerdp3— supports 3-window multimon on Wayland (auto-setsFREERDP_WLROOTS_HACK=force+SDL_VIDEODRIVER=wayland+ grab flags + bitmap rendering)wayland:wlfreerdp3— native Wayland single-mon
- SDL multimon tuning: skip
/monitors:(SDL has own IDs),/gfxremoved (bitmap = lighter),/bpp:16
Kill-on-relaunch
- Running
rdp-connect <profile>when a session is active now kills the old instance (SIGTERM → SIGKILL the process group) and relaunches cleanly - Fixed:
exec 200>was truncating the PID file before reading it → peer PID was always empty
Dynamic profile selector (Super+Shift+R)
- Walker preferred (matching hyprcaffeine style), then wofi, then rofi
- Nerd Font icon + HOST + USER shown per profile
- Dynamic box sizing: height = (profiles × 45px + 80px), width = 1050px
- Excludes
.env.bak.*files (only real profiles) - Hyprland keybind
Super+Shift+R→uwsm-app -- rdp-connect
Default = single-mon
MONITOR_MODEdefault changed frommultitosingle(most stable under Hyprland)
Colored --help + migrator
- Rich-like ANSI colored
--help(respectsNO_COLOR+ TTY) --update-profilesnow adds ALL tunable keys (audio + monitor mode + layout)
Monitor layout config
MONITORS,MONITOR_ORDER,MONITOR_<id>,DYNAMIC_RESOLUTIONprofile keys--monitors,--monitor-order,--dynamic-resolutionCLI flags
Known limitations
- SDL3 multimon on wlroots: functional but unstable (FREERDP_WLROOTS_HACK + grab flags; "not responding" dialogs). Upstream: FreeRDP #12393.
- No fullscreen spanning: Wayland architecture prevents single surface crossing monitors.
- Audio redirect to client: Arch package lacks working backends. Use
AUDIO_REDIRECT=0(server playback via/audio-mode:1).
Full diff: v0.6.0...v1.1.0
v0.6.0 — Client selection (x11/sdl/wayland), single-mon default, full tunable config
Breaking change
Default MONITOR_MODE is now single (was multi). rdp-connect <profile> gives single-monitor fullscreen by default — the most stable mode under Hyprland/XWayland. Use --multi-mon or MONITOR_MODE=multi for multi-monitor.
New features since v0.5.0
- CLIENT selection —
--client <x11|sdl|wayland>+ profile keyCLIENT. Three FreeRDP clients:x11(default):xfreerdp3(XWayland, best for single-mon)sdl:sdl-freerdp3(SDL3, supports 3-window multimon on Wayland viaFREERDP_WLROOTS_HACK=force+SDL_VIDEODRIVER=wayland+ grab flags auto-set)wayland:wlfreerdp3(native Wayland, single-mon)
- Colored
--help— rich-like ANSI (respectsNO_COLOR+ TTY). --update-profiles— migrator now adds ALL tunable keys (audio + monitor mode + layout), not just monitor-layout.- Monitor layout config —
MONITORS,MONITOR_ORDER,MONITOR_<id>,DYNAMIC_RESOLUTION(+--monitors,--monitor-order,--dynamic-resolutionflags). - Lock-leak fix — engine processes + flock now release cleanly on exit.
Fixes
- FreeRDP 3.30 compatibility (5 flag issues + phantom empty-arg bug).
- Hyprland 0.56 Lua dispatcher migration (
hyprctl keyword/dispatchdeprecated). - Audio server-playback (
/audio-mode:1=INFO_REMOTECONSOLEAUDIO; xfreerdp3 help mislabeled). - Lock-leak (fd 200 inherited by children → flock never released).
Known limitations
- SDL3 multimon on wlroots: functional but unstable ("not responding" dialog; SDL3 can't maintain compositor ping/pong with 3 fullscreen windows). Upstream: FreeRDP issue #12393.
- No fullscreen spanning: Wayland architecture prevents a single surface from crossing monitor boundaries (all 3 clients affected).
- Audio redirect to client: broken in the Arch
freerdppackage (pipewire backend not compiled; pulse/alsa compiled but non-functional). UseAUDIO_REDIRECT=0(server playback) instead.
Full diff: v0.5.0...v0.6.0
v0.5.0 — FreeRDP 3.30 + Hyprland 0.56, audio server-playback, monitor config
Highlights
A full session making rdp-connect actually work on a current Arch + Hyprland stack (FreeRDP 3.30, Hyprland 0.56), plus profile-driven audio/monitor control and operational tooling. All additive — no breaking changes to existing profiles.
Fixes
- FreeRDP 3.30.0 compatibility — the engine's xfreerdp3 invocation targeted an older build and died with the opaque
setsid: child N did not exit normally: Success. Five root causes isolated empirically: dropped flags (/async-input,/async-transport,/camera), renamed/reconnect-max-retries:→/auto-reconnect-max-retries:, a phantom empty argv token from"${DPI_FLAGS[@]-}"(bash empty-array-gotcha), and the pipewire sound addin that fails to load on the Arch build. - Lock-leak — when xfreerdp3 exited, engine processes held the per-profile flock (fd 200 inherited by children + the engine blocked on pipe EOF), so the next run hit the "instancia activa" guard. Now fd 200 is closed in every child and the engine waits on the xfreerdp3 PID, not the pipe.
- Installer —
freerdp3→freerdp(correct Arch package name; the old name made./install-rdp-framework.shfail withtarget not found).
Features
- Audio server-playback —
AUDIO_REDIRECT=0(or--no-audio) emits/audio-mode:1(setsINFO_REMOTECONSOLEAUDIO) so the remote machine's audio plays on its OWN speakers (mstsc "Play on remote computer"). Note: the xfreerdp3/?help MISLABELS/audio-mode(:2disables,:1is server) — pinned to the source mapping. - Monitor layout config —
MONITORS(count),MONITOR_ORDER(id order),MONITOR_<id>(resolution, single mode),DYNAMIC_RESOLUTION(windowed, live resize via+dynamic-resolution). Flags:--single-mon/--multi-mon/--monitors/--monitor-order/--dynamic-resolution. Single-mode renders at native res (/size) so a 2K monitor isn't shown as HD. - Hyprland 0.56 Lua dispatcher migration —
hyprctl keywordand legacydispatch <x> <args>are deprecated on 0.55+; migrated tohl.dsp.*viahyprctl dispatch '<lua>'. A background helper polls for the window then moves/focuses/fullscreens it (the new API is action-based, needs the window to exist). - Verbose mode —
rdp-connect -vtees milestones + xfreerdp3 output to stderr (liblog_eventextracted for unit-testable tee). No more silent runs ending in an opaque setsid error. - Colored
--help— rich-like ANSI output (respectsNO_COLOR+ TTY; degrades to plain). --update-profiles— idempotently migrates existing profiles with the full tunable block (audio + monitor mode + layout), commented, with backup.
Tests
Suite grew with each change; new files installer-deps, freerdp3-flags, verbose-mode, audio-toggle, monitor-mode, monitor-config, hyprland-api, ui-helpers. All green; lint clean.
Full diff: v0.4.0...v0.5.0