Releases: bitbound/ControlR
v0.22.79.0 Release
Breaking Changes:
Major Changes:
Quality and bandwidth knobs
There are now auto-quality, manual quality, and bandwidth controls that users can adjust. These were implemented for the Avalonia Viewer too.
Defaults can be set on the User Settings page, and they can also be changed mid-session.
Permission pre-flight checks for Mac and Wayland
Security restrictions on Mac and Wayland require the user to explicitly grant permission for remote control to work. The permission flow was previously done inline with the "start remote control" attempt. It made the handshake kind of awkward and unintuitive.
Now there are explicit pre-flight checks and the ability to explicitly request access. It's also more clear now when attempting to start a remote control session, but the permissions still haven't been granted on the other side.
Terminal and remote file system for Avalonia Viewer
Implemented the terminal and remote file system features into the native Avalonia Viewer library. They have full feature-parity with the web versions.
Explicit "Include untagged" option on the dashboard
There's now an explicit option to include untagged devices in the scope. If untagged devices are being hidden by the current scope, there's an alert indicator.
Device alias
Added editing controls for the device alias and wired it up to the main grid.
Other changes:
- All binaries embedded in the single-file agent EXE are now signed by hooking into the
GenerateSingleFileBundleMSBuild target. - Updated MudBlazor from v8.x to v9.x.
- Added UI automation tests.
- Made user preferences more ergonomic in the
ControlrApiclient. - Added periodic background cleanup of expired agent installer keys.
- Added configuration for retention period of installer key usage history.
- Cleaned up user preferences and tenant settings.
- Established a pattern for effective preference resolution for preferences that can be overridden by tenant-wide settings.
- Fixed a clipboard issue on X11.
Full Changelog: v0.21.59.0...v0.22.79.0
v0.21.59.0 Release (Required Update)
Breaking Changes:
This update is required and can't be skipped! Please read carefully.
This update has temporary agent migration flows that can't be skipped. If this version is skipped (after another is released), agents will not be able to auto-update. I've tried to make the migration seamless, but a reboot or agent reinstall might be required in some cases.
I'm hoping there won't be many more disruptive changes between now and v1.0. However, making these changes now ensures more stability at v1.0 and beyond.
Two major things changed:
- A separate installer executable now handles installing both the agent and the desktop client.
- Previously, the agent itself handled the installation. The desktop client was embedded in the agent and was extracted at runtime.
- This structure allows for proper notarization on Mac and reduces the agent binary size.
- The "instance ID" is now configurable and defaults to being excluded.
- An instance id is used on the remote device to differentiate agent installations.
- It's used in the installation path, logs path, service name, etc.
- Previously, it defaulted to the agent's hostname (e.g. demo.controlr.app).
- This is an advanced use case that most people will never need, so this should have never been the default.
- Now it defaults to being completed omitted and is configurable in Tenant Settings.
What you need to do.
- After updating, if you want to continue using the same instance ID, go into Tenant Settings and adjust the settings.

- If you want to use the new defaults and not have an instance ID appended to service names and such, you will need to uninstall existing agents, then do a fresh new install.
Again, I apologize for the inconvenience and will try to keep them to a minimum.
Changes:
- MacOS desktop app is now properly notarized.
- Organized and published NuGet packages for all the projects referenced internally by the Avalonia Viewer.
- Refactored display management to make physical/logical coordinates clearer.
- Reworked the diffing and encoding, so the changes between frames are broken up into smaller regions, sent through a multi-threaded encoding pipeline, then sent in a batch to the viewer.
- Resulted in higher FPS and lower bytes-per-frame when there are multiple dirty regions across the screen.
- Added multi-targeting to DesktopClient, allowing access to MacOS APIs via net10.0-macos target, instead of using hard-coded p/invokes.
- This will make the transition from CoreGraphics to ScreenCaptureKit a lot easier and less brittle.
- Created a separate installer and reworked the installation and auto-update flows.
- Reworked MacOS publishing using the new macos tooling, which produces a .app bundle.
- Added support for Docker Secrets.
- Added option for whether to use "instance id" for agent installations and ability to customize it per tenant.
- Instance ID is used to distinguish agent installations and allows for multiple agents from different servers to be installed on the same endpoint machine.
- Added memory-backed FakeFileSystem implementation of IFileSystem for improved test scenarios.
- Added alphabetical tag sorting and ability to view only untagged devices.
- Added autoscroll function to
CodeViewBlazor component.
Full Changelog: v0.20.88.0...v0.21.59.0
v0.20.88.0 Release
Breaking Changes:
- While not a breaking change for existing servers, the template/example compose file has changed significantly due to support for Docker Secrets.
- As a result, setup instructions for new instances has changed.
- Docker Secrets are completely optional, and existing servers using environment variables will continue working.
Changes:
- Added support for Docker Secrets (see readme)
- Fixed memory leak in Mac DesktopClient.
- Fixed (hopefully) an issue that could cause multiple DesktopClients to get launched into the same Windows session in some cases.
- Added user preferences for default view mode and "open in new tab".
- Opening a device in the same tab will load faster, since it doesn't have to re-initialize Blazor WebAssembly.
- After navigating to a device in the same tab, a back button will be available to take you directly back to the dashboard.
Full Changelog: v0.20.86.0...v0.20.88.0
v0.20.86.0 Release
Breaking Changes:
Changes:
- Fixed DesktopClient extraction directory on Linux.
- Fixed HorizontalAlignment for ThemeButton.
- Rearranged radio buttons for installer key types.
- Add $ProgressPreference back into PowerShell install to prevent slow downloads on Windows.
Full Changelog: v0.20.85.0...v0.20.86.0
v0.20.85.0 Release
Breaking Changes:
- The Kiota-generated API client in
ControlR.ApiClienthas been completely replaced with a custom-made version. - Rollback to previous server version isn't fully supported.
- UserPreferences and PersonalAccessTokens will be lost if server is downgraded back to previous version.
- This is due to having their tenant relationship removed, leaving only the user relationship (i.e. they should follow the user regardless of tenant they're in).
Changes:
- Rebuilt
ControlR.ApiClientto allow better reuse of DTOs and interfaces. - Added Physical/Virtual/Auto keyboard input modes.
- Mac binaries are now signed with a real Apple developer cert (notarization will follow soon).
- Added mouse cursor transfer on Mac.
- Fixed an issue with scaled displays on Mac and Wayland.
- Added ability to set custom Postgres port and database name.
- Created ControlR.Viewer.Avalonia, which is a cross-platform NuGet package containing a native Avalonia control for the viewer. This allows for embedding the ControlR viewer in Avalonia desktop applications.
Avalonia Viewer
Screencast_20260304_120113.webm
Full Changelog: v0.19.2.0...v0.20.85.0
v0.19.2.0 Release
Changes:
- Added navigation and pages/views to the DesktopClient.
- Active connections are now show, with the ability to disconnect a viewer.
- This is a work-in-progress. More functionality will be added later.
- Improved privacy screen.
- The black screen is opened in a higher Z band (UiAccess), allowing it to cover the Start menu.
- Temporarily disable Aero Peek feature during remote control, which can override UiAccess.
- Various minor refactors and fixes.
Full Changelog: v0.18.22.0...v0.19.2.0
v0.18.22.0 Release
Okay, I have to admit, I'm super excited about this update! I've personally wanted a few of these features for a long while, but just never had the time to work on them.
I'm also filling out the roadmap, so there's a lot of exciting stuff coming!
Please keep an eye out for issues with the label feedback_requested, since I'm hoping to gather a sufficient amount of user feedback before making some of these implementation decisions. There are a few on there already! 🙂
Breaking Changes:
- Not exactly breaking, but the docker-compose file was updated with new properties related to Aspire (the server logs/metrics dashboard).
- There is a new extension field and YAML anchor at the top:
x-aspire-public-url: &aspirePublicUrl "http://localhost:18888" - The ControlR service uses this new anchor and the existing Aspire token anchor:
- There is a new extension field and YAML anchor at the top:
# The access token for the Aspire Dashboard, where server logs and telemetry can be viewed.
ControlR_AspireDashboard__Token: *aspireToken
# The public URL for the Aspire Dashboard's web interface.
ControlR_AspireDashboard__PublicWebUrl: *aspirePublicUrl
- Together, these allow ControlR to launch you directly into the Aspire interface.
- The Aspire service also uses the new anchor.
aspire:
image: mcr.microsoft.com/dotnet/aspire-dashboard:13.1
# ... existing code...
environment:
Dashboard__Frontend__BrowserToken: *aspireToken
Dashboard__Frontend__PublicUrl: *aspirePublicUrl
Changes:
- Added view-only mode, which is changeable before and during remote control.
- New zoom controls while in "Scale" view mode (used to be called "Original").
- Added "follow cursor" option while in Scale view mode.
- The viewport will auto-pan/scroll as your cursor reaches the edges.
- Added virtual layout representation of remote screens.
- Added "privacy screen" feature. (Windows only. Blacks out the remote physical monitor.)
- Added "block user input" feature. (Windows only.)
- Added remote log streaming.
- Icon no longer appears in the dock on MacOS when Desktop Client is minimized to tray.
New Features Video:
(Obviously, you can't see the privacy screen, since you'd need to be looking at the physical monitor.)
features.mp4
Full Changelog: v0.17.20.0...v0.18.22.0
v0.17.20.0 Release
Changes:
- Moved VNC relay to the Device Access layout (see screenshot).
- Added "Connect", "Disconnect", and "Test" buttons for VNC relay.
- Relaced deprecated MSBuild-based API client generation with Kiota.
- Published new API client to NuGet.
- Fixed multi-monitor pointer coordinates on Wayland.
- Added authn and authz support to websocket relay to supplement the access tokens.
- Replaced IPC protocol with StreamJsonRpc + MessagePack formatter.
- Minor fixes and refactors.
Full Changelog: v0.16.28.0...v0.17.20.0
v0.16.28.0 Release
Changes:
- Fixed API calls during server-side rendering by conditionally switching to backend service implementations.
- Fixed chat responses due to mishandled async response type in IPC library.
- Allow
MaxFileTransferSizeto override multipart body length limit.- This applies to file upload API endpoint.
Full Changelog: v0.16.22.0...v0.16.28.0
v0.16.22.0 Release
Changes:
- Added management of Installer Keys.
- Added option to encrypt Data Protection keys using X509 certificate.
- Added
EnableNetworkTrustoption for easier forwarded headers configuration when the service is only reachable via trusted proxy. - Added endpoint for file uploads to device.
- Switched to global WASM as the default render mode.
- Added WASM bundle download % to the loading indicator.
- Refactored Mac's permission granting flow to align with Wayland's.
- Allow Wayland permissions to be re-granted (e.g. after display changes).
- Marshal screen frames as
MemoryViewin Blazor's JS interop for improved performance and memory utilization. - Various cleanup and refactoring.
Full Changelog: v0.16.1.0...v0.16.22.0