A portable remote desktop and support tool built with .NET 8 MAUI Blazor. No installation required - run the executable, share your ID and password, and connect. Supports full system-level elevation including UAC prompts, Secure Desktop, and lock screen access.
Grab the latest release from GitHub Releases. Single portable executable - no installation needed.
Windows SmartScreen: The binary is not yet code-signed. Right-click the exe → Properties → check "Unblock" → OK, then run.
- Portable - Single executable, no installation, no account required
- Full Elevation - Control UAC prompts, Secure Desktop, and lock screen remotely
- Native Keyboard Capture - Win32 low-level hook with raw scan codes (Sunshine pattern), AltGr handled correctly
- P2P Connection - Direct UDP with NAT traversal and TURN relay fallback
- Low Latency - DXGI capture with hardware-accelerated H.264 encoding
- Encrypted - AES-256-GCM end-to-end encryption (HKDF key derivation, per-frame nonce), BLAKE3 password hashing
- File Transfer - Clipboard sync and chunked file transfers
- Multi-Session - Connect to multiple machines in tabbed sessions
- Auto-Reconnect - Saved credentials with automatic reconnection
- .NET 8 SDK
- Windows 10/11 (for Windows build)
# Start signaling server
dotnet run --project src/SteamViewer.Server
# In another terminal, start the app (two instances)
dotnet run --project src/SteamViewer.App -f net8.0-windows10.0.19041.0In DEBUG builds, fixed credentials are used to skip the connect dialog during testing.
The values live in Home.razor behind #if DEBUG and are not present in Release builds.
- Host starts and registers with the signaling server (WebSocket)
- Viewer connects using the Host's ID and password
- Host approves the connection
- UDP hole-punch establishes a direct peer-to-peer link (with TURN relay fallback)
- Host captures the screen via DXGI Desktop Duplication
- Video is encoded with FFmpeg (libx264 high444) and QOI (lossless settle frames), encrypted with AES-256-GCM, and streamed over a custom UDP transport
- Viewer decodes and renders frames on a canvas via WebView2
┌─────────────┐ WebSocket ┌─────────────────┐
│ Host │◄──────────────────►│ Signaling Server│
│ (MAUI App) │ │ (ASP.NET) │
└──────┬──────┘ └────────┬────────┘
│ │
│ UDP P2P (AES-256-GCM) │ WebSocket
│ │
▼ ▼
┌─────────────┐ ┌─────────────────┐
│ Viewer │◄──────────────────►│ Signaling Server│
│ (MAUI App) │ └─────────────────┘
└─────────────┘
SteamViewer.NET/
├── src/
│ ├── SteamViewer.Server/ # WebSocket signaling server
│ ├── SteamViewer.App/ # MAUI Blazor client
│ ├── SteamViewer.Client.Core/ # Core client logic
│ ├── SteamViewer.Common/ # Shared protocol/models
│ ├── SteamViewer.Platform.Windows/
│ └── SteamViewer.Platform.macOS/
├── tests/
├── SteamViewer.Windows.sln # Windows-only solution
└── SteamViewer.NET.sln # Full solution (requires macOS workload)
- .NET 8 with C# 12
- MAUI Blazor - Cross-platform UI
- DXGI Desktop Duplication - Native screen capture
- FFmpeg (libx264 high444) - H.264 video encoding/decoding
- QOI - Lossless image codec for settle frames + Secure Desktop capture
- Custom UDP transport - Direct peer-to-peer with NAT traversal and TURN relay fallback
- AES-256-GCM - End-to-end transport encryption (HKDF key derivation, per-frame nonce)
- BLAKE3 - Password hashing
- ASP.NET Core - WebSocket signaling server (handshake only; no media)
- Single-monitor testing: Full-screen capture creates infinite mirror effect. Use window capture instead.
- macOS: Requires macOS workload to build. Use
SteamViewer.Windows.slnon Windows.
SteamViewer was built by studying and learning from many open-source projects. We're grateful to these communities:
| Project | License | What We Learned |
|---|---|---|
| Sunshine | GPL-3.0 | Input injection, DXGI video pipeline, RTP/FEC |
| RustDesk | AGPL-3.0 | SendInput, virtual desktop handling, reboot/lock screen persistence |
| FreeRDP | Apache-2.0 | SendInput, split move+click, multi-monitor |
| Barrier | GPL-2.0 | Input injection, UIPI bypass, DPI handling |
| Synergy/Deskflow | GPL-2.0 | Desktop-switch retry, SendSAS |
| TurboVNC | GPL-2.0 | Automatic Lossless Refresh, region classification |
| SPICE | LGPL-2.1 | Per-image auto codec selection, video stream detection |
| Apache Guacamole | Apache-2.0 | Clipboard text sync, drive redirection |
We started with WebRTC and replaced it with our own DXGI + QOI + FFmpeg stack over a custom UDP transport - the jitter buffer was unmanageable for low-latency remote desktop. SIPSorcery remains in the tree as a scoped STUN-only TURN message helper. These projects shaped the early design and are credited for that.
| Project | License | What We Learned |
|---|---|---|
| SIPSorcery | BSD-3 | .NET STUN/TURN client (still used, STUN-only); WebRTC reference during early prototyping |
| Selkies-GStreamer | MPL-2.0 | Low-latency streaming techniques, playout-delay handling |
| Neko | Apache-2.0 | Separate A/V streams to bypass browser sync |
| Pion WebRTC | MIT | Flow-control design reference during early WebRTC prototyping (no longer in tree) |
| PairDrop | GPL-3.0 | P2P file transfer patterns |
| Moonlight | GPL-3.0 | RTSP/RTP latency benchmarks |
| Project | License | What We Learned |
|---|---|---|
| FFmpeg.AutoGen | LGPL-2.1 | FFmpeg P/Invoke bindings, DLL loading patterns |
| Sdcb.FFmpeg | MIT/GPL | FFmpeg NuGet runtime packaging |
| LittleBigMouse | GPL-3.0 | Physical coordinates, EDID, DPI |
| Project | License | What We Learned |
|---|---|---|
| Haivision SRT | MPL-2.0 | 2D XOR matrix FEC, hybrid FEC+ARQ |
| UDPspeeder | MIT | Reed-Solomon FEC over UDP, adaptive group sizes |
| ReedSolomon.NET | MIT | Erasure coding for .NET |
| UDT | BSD | UDP bulk data transfer, congestion control |
| Project | License | What We Learned |
|---|---|---|
| Vanara | MIT | Win32 P/Invoke wrappers |
| VirtualFileDataObject | MIT | Virtual file clipboard (IDataObject) |
We also studied proprietary protocols (Parsec BUD, Citrix HDX, Microsoft RDP/RemoteFX, NoMachine NX) for design insights.
This project was developed with Claude Code by Anthropic.
Honorable mentions to the code-quality and security tools that kept the codebase healthy:
- CodeScene - per-function code-health analysis that turned "this feels messy" into located, measurable refactor targets.
- GitHub Copilot code review - automated diff auditing that surfaced real structural issues.
- CodeQL - semantic security analysis / code-scanning in CI.
- SonarCloud - continuous code-quality and security analysis (bugs, code smells, security hotspots).
MIT
Contributions welcome! Please open an issue or pull request.