The RDP session pipeline never accounted for display scale: it
requested a desktop canvas sized in Qt logical pixels (never
multiplied by devicePixelRatio()), and FreeRDP_DesktopScaleFactor/
DeviceScaleFactor were read but never actually set anywhere. On a
HiDPI monitor this meant the remote session rendered assuming a
96 DPI / 100% display, and the resulting canvas got stretched
locally — ClearType's subpixel hinting doesn't survive that kind of
resampling, producing distorted glyph shapes and color fringing
rather than plain blur.
RdpDisplayWidget now reports physical pixel dimensions and the real
devicePixelRatio (recomputed on resize and on screen changes, e.g.
dragging the window to a different-DPI monitor). RdpSessionBackend
maps that to the nearest FreeRDP-legal scale value ({100, 140, 180},
per MS-RDPEDISP and FreeRDP's own reference client) and sets it at
both connect time and on every dynamic resize, including the
FreeRDP_MonitorOverrideFlags required for the values to actually be
honored rather than silently ignored.
While testing this against real infrastructure, found and fixed two
related (pre-existing, not caused by this change) resize issues:
- A stale-frame race where the old frame could be drawn at the wrong
scale for a moment after a resize, before a correctly-sized one
arrives — now the frame is cleared during that transition instead.
- No debounce on outgoing resize requests — every single resize event
fired an immediate request to the server, which can visibly
contribute to host-side redraw glitches during rapid layout churn
(e.g. right after connecting). Coalesced into one request per burst,
plus an explicit refresh-rect request after each resize completes
as a best-effort nudge for hosts that don't fully repaint on their
own.
A separate, deeper issue was also found during testing (the remote
guest's actual resolution sometimes not changing despite the resize
channel reporting success) and is tracked separately, not fixed here.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
OrbitHub
OrbitHub is a cross-platform native desktop app for managing and launching remote sessions from one place.
It is implemented in C++17 with Qt6 Widgets and built with CMake.
Supported target platforms:
- Windows
- Linux
- macOS
Current Status
OrbitHub is in active development.
- Milestones completed: M0-M5, and M7-M9
- Current milestone: Milestone 10 (v1.0 Stabilization)
- Deferred milestone: Milestone 6 (VNC Fully Working)
- Latest checkpoint tag:
v2026.9.8.3 - VNC implementation milestone (M6) is currently deferred
Progress and milestone details:
Latest release (installers for Windows, Linux, and macOS):
User Guide:
- docs/USER_GUIDE.md (also available as a PDF attached to each release, and in-app via
Help -> User Guide)
Screenshots
Profiles organized into folders, with protocol, host, and tags shown at a glance. (Sample data shown; not real hosts.)
An interactive SSH terminal session in a tab, with the event log below.
An embedded RDP session in a tab.
Implemented Features
Profile Management
- SQLite-backed profile storage
- Create, edit, delete profiles
- Protocol-aware profile validation (SSH/RDP/VNC)
- Profile search and sorting
- Tags support
- Folder/subfolder support
ListandFoldersprofile views- Right-click profile tree actions:
- New Folder
- New Connection
- Drag-and-drop profile moves between folders with persistence
Session Experience
- Multi-tab session window
- Auto-connect on tab open
- Disconnect on tab close
- Session state indicators on tabs
- Timestamped event log with filtering and export
SSH
- Embedded interactive terminal (in-app typing)
- Theme support (
Dark,Light,Solarized Dark) - Password and private-key auth flows
- Known-hosts policy support
RDP
- Embedded in-window RDP rendering surface (no external launcher)
- Keyboard/mouse input forwarding
- Resize handling and resolution renegotiation
- Domain-aware authentication support
- RDP security/performance profile options
App UX
- App icon and themed About dialog
Filemenu:- New Profile
- New Folder
- Quit
Helpmenu:- About OrbitHub
Build and Run
Detailed platform instructions:
Quick start (Linux/macOS with Ninja):
cmake -S . -B build -G Ninja
cmake --build build
./build/orbithub
Packaging
Detailed packaging instructions for all platforms:
Linux (.deb):
./packaging/linux/build-deb.sh
Linux (Flatpak):
./packaging/flatpak/build-flatpak.sh
Windows (Inno Setup installer):
.\packaging\windows\build-installer.ps1
macOS (.dmg):
./packaging/macos/build-dmg.sh
Dependencies
Core dependencies:
- Qt 6 (Widgets, SQL)
- CMake 3.21+
- C++17 toolchain
Protocol/runtime dependencies:
- SSH client (
ssh) available onPATHfor SSH sessions
Bundled/vendored third-party components:
- KodoTerm
- libvterm
- FreeRDP/WinPR
Licensing
Project license:
- MIT (see LICENSE)
License links:
- MIT License: https://opensource.org/licenses/MIT
- GNU LGPLv3: https://www.gnu.org/licenses/lgpl-3.0.html
- Apache License 2.0: https://www.apache.org/licenses/LICENSE-2.0
Important third-party license notes:
- Qt6 is dynamically linked in this project build setup.
- Qt6 is used under LGPLv3 terms in this project build setup.
- KodoTerm and libvterm are MIT-licensed.
- FreeRDP/WinPR is Apache-2.0 licensed.
Repository license files:
- Project: LICENSE
- KodoTerm: third_party/KodoTerm/LICENSE
- FreeRDP: third_party/FreeRDP/LICENSE
See in-app Help -> About OrbitHub for license links and third-party inventory.
Repository Structure
src/- application source codedocs/- build guide, spec, and progress trackingthird_party/- vendored third-party dependenciesbuild/- local build output (generated)
Notes
- Passwords are requested at connect time and are not stored in the profile database.
- This repository currently prioritizes integrated SSH and RDP workflows while VNC implementation is pending.


