Skip to content

Repository files navigation

SteamViewer.NET

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.

Download

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.

Features

  • 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

Quick Start

Prerequisites

  • .NET 8 SDK
  • Windows 10/11 (for Windows build)

Run in Debug Mode

# 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.0

Debug Credentials

In 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.

How It Works

  1. Host starts and registers with the signaling server (WebSocket)
  2. Viewer connects using the Host's ID and password
  3. Host approves the connection
  4. UDP hole-punch establishes a direct peer-to-peer link (with TURN relay fallback)
  5. Host captures the screen via DXGI Desktop Duplication
  6. Video is encoded with FFmpeg (libx264 high444) and QOI (lossless settle frames), encrypted with AES-256-GCM, and streamed over a custom UDP transport
  7. Viewer decodes and renders frames on a canvas via WebView2

Architecture

┌─────────────┐     WebSocket      ┌─────────────────┐
│    Host     │◄──────────────────►│ Signaling Server│
│  (MAUI App) │                    │   (ASP.NET)     │
└──────┬──────┘                    └────────┬────────┘
       │                                    │
       │ UDP P2P (AES-256-GCM)              │ WebSocket
       │                                    │
       ▼                                    ▼
┌─────────────┐                    ┌─────────────────┐
│   Viewer    │◄──────────────────►│ Signaling Server│
│  (MAUI App) │                    └─────────────────┘
└─────────────┘

Project Structure

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)

Tech Stack

  • .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)

Known Limitations

  • Single-monitor testing: Full-screen capture creates infinite mirror effect. Use window capture instead.
  • macOS: Requires macOS workload to build. Use SteamViewer.Windows.sln on Windows.

Acknowledgments

SteamViewer was built by studying and learning from many open-source projects. We're grateful to these communities:

Remote Desktop & Input

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

Honorable Mentions (early streaming research)

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

Video & Encoding

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

Network & Error Correction

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

Utilities

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.

Built With

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).

License

MIT

Contributing

Contributions welcome! Please open an issue or pull request.

About

Cross-platform remote desktop application built with .NET 8, MAUI Blazor, DXGI capture, FFmpeg H.264, QOI codec, and a custom UDP transport.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages