A GOOD PLACE TO START
A shared screen.
A few simple steps.
Get connected, build for your platform, and understand what goes into distributing Desk Viewer.
Your first connection
- Install the complete app bundle on both computers. You do not need Flutter or Node.js on a computer that only runs a packaged app.
- Open Desk Viewer and wait for Online. Each device should show a different nine-digit ID.
- The host privately shares their device ID and current session password with the person connecting.
- The viewer enters those details and sends a request. The host must review and accept it, then select a screen if prompted.
- The session starts in view-only mode. The host can allow remote control using the visible sharing controls.
- Stop sharing from either device. The host's password changes after the session ends; a new session requires fresh approval.
Keep the host present. This app supports attended help. It does not offer unattended access, and a saved device never stores its session password.
Install Desk Viewer for Windows
Version 1.0.0 · Windows x64 · 17.7 MB. Download Setup and check the file before opening it. The installer includes the application, plugins, and required data folder.
Check your download here
Select the installer you downloaded. Your browser calculates its SHA-256 on this computer; the file is never uploaded.
Published SHA-256
a90b31afb6989eef2b3f000ec8b52b969c5c6d302d1b6e077eaec3ad4a6b192aDownload checksum · Download PowerShell verifier
Or verify with PowerShell
Save the installer and checksum in the same folder. Open PowerShell in that folder and run:
$installer = Get-Item -LiteralPath '.\DeskViewer-Setup-1.0.0.exe'
$expected = ((Get-Content -LiteralPath ($installer.FullName + '.sha256') -Raw).Trim() -split '\s+')[0]
if ($expected -notmatch '^[a-fA-F0-9]{64}$') { throw 'Invalid checksum file.' }
$actual = (Get-FileHash -LiteralPath $installer.FullName -Algorithm SHA256).Hash
if ($actual -ne $expected) { throw 'SHA-256 mismatch. Do not run this file.' }
'SHA-256 matches.'The separate verifier embeds the expected hash and exits with code 1 on a mismatch. Save it beside the installer, inspect it, and run .\Verify-DeskViewer.ps1 if your PowerShell policy permits scripts.
This release is unsigned. A matching checksum confirms that your file matches the published release. It does not establish publisher identity or prove the software is safe. If the checksum differs, do not run the file.
Run Setup
- After a matching check, open the installer and follow the setup steps.
- Launch Desk Viewer from the Start menu. Install the same release on the second computer.
- To update an existing copy, quit Desk Viewer from its tray menu first, then run Setup again.
- To remove it, use Windows Settings → Apps → Installed apps → Desk Viewer → Uninstall.
If the app reports a missing Visual C++ runtime, use the Microsoft link in the Windows source build section below. See Your first connection once both apps are running.
Windows
Windows is the primary tested platform. Build on Windows with Flutter stable, Dart 3.12.2 or later, Git, and Visual Studio's Desktop development with C++ workload and Windows SDK.
cd app flutter pub get flutter build windows --release
Distribute the entire app/build/windows/x64/runner/Release folder: desk_viewer.exe, all DLLs, native assets, and the data folder. Extract the entire ZIP before launching. Copying only the executable will not work.
The destination computer may also need the matching Microsoft Visual C++ Redistributable. A normally launched host can control applications at its own privilege level; UAC's secure desktop and Ctrl+Alt+Del are not supported.
Make a portable package
From the repository root, the included PowerShell helper builds and packages the complete app and writes a SHA-256 checksum:
powershell -NoProfile -File scripts/package-windows.ps1
For a wider release, sign the executable and an installer or MSIX package with your publisher identity. Test installation and uninstallation on a clean Windows computer.
macOS
Build on a Mac with Flutter, Xcode, its command line tools, and CocoaPods. The macOS source needs native build and permission testing before a release is advertised.
cd app flutter pub get flutter build macos --release
Keep the complete .app from app/build/macos/Build/Products/Release. For direct distribution, sign with a Developer ID identity, package, notarize, and staple the notarization ticket using Apple's tooling. The app's supplied runner is non-sandboxed for local input injection; review this before choosing a store distribution route.
The host must grant Screen Recording for sharing and Accessibility for control in System Settings. Reopen the app if requested, then use the Host capabilities card to check permissions.
See Flutter's macOS release guide and Apple's notarization guidance.
Linux
Build on the Linux distribution you intend to support, with Flutter, Clang, CMake, Ninja, pkg-config, GTK development files, libsecret, and AppIndicator support. Remote control on X11 also needs X11, XTest, and XRandR libraries.
cd app flutter pub get flutter build linux --release
Distribute the complete app/build/linux/x64/release/bundle folder. Package it as a tar archive, or prepare a distribution-specific package and declare its runtime dependencies. Validate on a clean machine; libraries and tray support vary.
Wayland hosts stay in view-only mode and require a working screen-capture portal. X11 control depends on the desktop environment and libraries. Both need testing on the intended target system.
The app needs a way to meet
The website serves information and download links. The desktop app separately needs a reachable WebSocket signaling server, and restrictive networks can also require a TURN relay.
Before distribution: the current client endpoint is ws://signaling.brightonkofu.com, fixed in app/lib/models/app_settings.dart. Put signaling behind trusted TLS, change that constant to your working wss:// address, and rebuild. The desktop Settings screen cannot override it.
Deploy the included Node.js server as one always-running instance. Use Node.js 24 or later, npm ci, and npm start, or the supplied Docker image. A TLS reverse proxy should pass WebSockets and expose /health. A server restart clears its in-memory sessions.
For TURN, configure coturn and signaling with the same strong shared secret. Keep that secret on the server; clients receive temporary credentials. Test over two different networks and verify the relay route in session statistics.
The repository includes server deployment examples, a TURN guide, and a security review. A generic static website host does not replace the signaling service or TURN relay.
From a build to a release
Start with a controlled pilot. The repository's security review identifies trusted signaling, unauthenticated registration, unsigned bundles, and missing verified updates as remaining release work. A published website is not evidence that the desktop app is production ready.
- Choose a release version in
app/pubspec.yamland record which source revision produced it. - Deploy and verify WSS signaling, and configure TURN for the networks you need. Rebuild with the correct endpoint.
- Build on each target operating system. Test actual sharing, input permission, revocation, rejection, disconnect, and reconnection on two computers.
- Sign Windows releases; sign and notarize macOS releases. Verify all native dependencies and include required license notices.
- Create complete, versioned packages and SHA-256 checksums. Publish them through GitHub Releases or another download service you control.
- Update the website's download links to the tested artifacts. Keep release notes and checksums alongside each version.
- Test the downloaded artifact on a clean computer without Flutter or Node installed. Provide manual update instructions until a verified updater exists.
For this repository, use docs/DISTRIBUTION.md for the complete release steps and SECURITY.md for the outstanding security findings.
What the app does
| Capability | Current behavior |
|---|---|
| Screen sharing | Attended sessions with password validation, local approval, and visible sharing controls. |
| Remote input | Explicitly granted by the host. OS permissions and platform limits apply. |
| Address book & history | Stored locally. Session passwords are not retained. |
| Audio, clipboard & files | Not implemented. |
| Unattended access & recording | Not implemented. |
The product images on this website are captures of the Windows application. They show Home, the empty Address Book, and Settings; they do not depict an active remote session.