Zero-Copy Hardware H.264/AV1 Β· QUIC TLS 1.3 + Built-in WireGuard/Disco Mesh Β· Zero-Trust HuJSON Policy & TOTP MFA Β· QuickSupport & Fleet RMM
About / Sobre (EN / PT-BR) Β· Status Β· Quick start Β· Architecture Β· Projects & Roadmap (PROJECTS.md) Β· Detailed Plan (docs/plan.md) Β· Official Wiki Β· Community (COMMUNITY.md) Β· Discussions Β· Contributing Β· Security
π¬π§ English: OmegaDesk is a sovereign, self-hosted remote desktop, zero-trust mesh access, and fleet RMM platform written from scratch in 100% safe, modular Rust (17 workspace crates). Designed as a full-stack open-source replacement for TeamViewer, AnyDesk, BeyondTrust, and ScreenConnect, OmegaDesk unifies five proven architectural pillars in a single cohesive codebase:
- Sunshine-Grade Zero-Copy GPU Video Pipeline: Captures frames via
DXGI Desktop Duplication(WGC -> GDIfallback) and encodes H.264 directly from GPU resident textures (ID3D11VideoProcessor+MFCreateDXGISurfaceBufferacross Intel Quick Sync, NVIDIA NVENC, and AMD AMF), achieving 60 FPS at 24.5 ms end-to-end latency (11 mshardware encode). - Tailscale-Style Magicsock & DERP Relay Mesh: Nodes enroll with
omegadesk-server, resolve peers by human-readable*.omeganames (office-pc.omega), punch through NATs via STUN +disco, fall back toomegadesk-relayin1.5 s, and bind QUIC TLS 1.3 directly to Ed25519/X25519 device identities. - Headscale/Tailscale
HuJSONZero-Trust Policy & PAM Gate: Enforces identity-filtered netmaps, per-session TOTP MFA ("action": "check"),.odrecsession recording, dynamic video watermarks, clipboard byte quotas, OS posture checks, and JSON Lines security audit logs. - TeamViewer-Style 9-Digit QuickSupport & Windows
LocalSystemService: Single-executableomegadesk-quicksupport(123 456 789+ ephemeral password + console consent prompt), plusomegadesk-servicefor unattended access across Windows Session 0, login screens, UAC prompts, and privacy blanking (WDA_EXCLUDEFROMCAPTURE+IddCxvirtual displays). - MeshCentral/TacticalRMM-Style Fleet Management & WebCodecs Browser Gateway: Built-in
WebCodecsH.264 browser access (--web-listen) and CLI fleet RMM (omegadesk-server admin) with 15-minute hardware/OS/process inventory, automated threshold alerts, and remote PowerShell/shscript scheduling.
π§π· PortuguΓͺs (pt-BR): O OmegaDesk Γ© uma plataforma soberana e auto-hospedada (self-hosted) de acesso remoto de baixa latΓͺncia, rede mesh Zero-Trust e gerenciamento de frota (RMM) escrita do zero em Rust puro (17 crates). Projetado como alternativa aberta e auditΓ‘vel ao TeamViewer e AnyDesk, o OmegaDesk combina captura de tela via hardware (DXGI + codificaΓ§Γ£o GPU zero-copy NVENC/QuickSync/AMF a 60 FPS e 24,5 ms de latΓͺncia ponta a ponta), transporte QUIC (TLS 1.3) sobre malha STUN/Disco + Relay DERP (*.omega), polΓticas Zero-Trust em HuJSON com MFA TOTP por sessΓ£o e gravaΓ§Γ£o .odrec, executΓ‘vel ΓΊnico QuickSupport de 9 dΓgitos, serviΓ§o Windows LocalSystem (tela de login/UAC e monitor virtual IddCx), cliente nativo + navegador (WebCodecs) e RMM integrado.
| Pillar / Capability | OmegaDesk (Rust 1.90+) |
TeamViewer / AnyDesk | RustDesk (OSS Core) | Sunshine / Moonlight |
|---|---|---|---|---|
| 1. Licensing & Sovereignty | 100% Open Source (AGPL-3.0), full self-hosted server, relay, ACLs & RMM included |
Proprietary SaaS, cloud-tethered control plane | OSS core (AGPL-3.0), enterprise ACL/web console in commercial Pro tier |
Open source (GPL-3.0), single-host game streaming |
| 2. Video & Capture Pipeline | Zero-Copy D3D11 GPU texture -> Hardware H.264 (NVENC/QSV/AMF) + Adaptive QoS (24.5 ms E2E) |
Proprietary desk codec | Hardware/software H.264/H.265/AV1 | Zero-copy GPU game capture |
| 3. Transport & NAT Mesh | QUIC (TLS 1.3) + Noise IK + Tailscale-style magicsock (STUN + disco + 1.5s DERP relay + *.omega DNS) |
Proprietary TCP/UDP cloud routers | Custom TCP/UDP (hbbs/hbbr ID/relay servers) |
Raw UDP + RTSP (manual port forwarding or external VPN) |
| 4. Zero-Trust Policy & PAM | Built-in HuJSON policy engine (groups, tagOwners, netmap filtering, TOTP MFA, .odrec recording, DLP, watermark) |
Enterprise conditional access add-on | Commercial Pro console | Host PIN pairing only |
| 5. QuickSupport & Service | omegadesk-quicksupport (9-digit ID + consent) + Windows LocalSystem UAC/Login worker + IddCx virtual display |
QuickSupport executable + service | Client/host mode + service | Service mode |
| 6. Built-In Fleet RMM & Web | Native omegadesk-server admin RMM (inventory, alerts, remote scripts, schedules) + WebCodecs browser gateway |
Separate paid RMM add-on | Separate commercial console | Configuration web UI only |
Warning
OmegaDesk is in early development. Phases 0 and 1 of the roadmap are done: it works on a local network today, connecting by IP address, certificate fingerprint and password. Phase 2 (coordinator, relay and mesh) is implemented end to end: agent and client enroll with a coordinator and connect by name through NAT traversal or the relay, verified in-process and in a two-machine test over Tailscale (a clean test across two distinct public NATs is still pending). From Phase 3, QuickSupport works end to end (nine-digit ID, temporary password, console consent prompt), and the native agent and client synchronize text clipboards, transfer files, switch monitors and adapt video quality. The browser client (Phase 4) connects through the coordinator's web gateway with keyboard, mouse and H.264 video, verified in-process; its latency against the native client is not measured yet. Phase 5 (policies, per-connection MFA, recording, DLP and audit) is wired into the coordinator, the agent and the client and verified in-process; approval workflows and session sharing are still library code. Phase 6 (RMM) works end to end from the command line: agents report inventory, the coordinator evaluates checks and runs scripts, and omegadesk-server admin operates the fleet; there is no web dashboard yet. Audio, chat, terminal and LAN mode remain unwired, and the compatibility layers (Phase 7) exist only as library crates that no binary uses yet; the plan lists their known defects. It is not ready for production use.
What works today:
- Screen capture with DXGI Desktop Duplication on Windows, including hardware cursor compositing and rotated monitor support (
90Β°,180Β°,270Β°). - Hardware H.264 encoding through Media Foundation (Intel Quick Sync, NVIDIA NVENC, AMD AMF) with a zero-copy D3D11 GPU texture pipeline (
ID3D11VideoProcessor+MFCreateDXGISurfaceBuffer), plus automatic fallback to OpenH264 in software. - QUIC transport (TLS 1.3) with certificate pinning and a mandatory access password.
- Remote keyboard and mouse using physical scancodes, so any keyboard layout works (ABNT2 included). Multi-monitor aware.
- Native client that shows a live latency breakdown in the title bar.
- Mesh mode: a self-hosted coordinator (
omegadesk-server) hands out addresses and names (office-pc.omega), nodes find each other with STUN anddiscohole punching, fall back to a DERP-style relay (omegadesk-relay) in 1.5 s and upgrade to a direct path as soon as one validates. TLS is bound to the device identity the coordinator distributes, so there is no fingerprint to copy. - QuickSupport: the person who needs help runs one executable, reads a nine-digit ID and a temporary password to the technician and accepts a consent prompt; the technician connects with
omegadesk-client 123 456 789. The ID lives in the coordinator only while the program runs, and ten wrong passwords rotate the password. - Clipboard text synchronized in both directions (SHA-256 echo suppression;
--no-clipboardto disable). - File transfer in both directions on dedicated QUIC streams:
--send-file, drag a file onto the client window,--receive-diron either side. Transfers resume from a partial file and are SHA-256 verified before the file gets its final name; nothing is ever overwritten. - Multi-monitor: the agent lists its monitors; in the client press
Ctrl+Alt+Shift+1..9,N(next) orP(previous) to switch the streamed display. - Adaptive video quality: the client acknowledges every frame and the agent lowers the bitrate first, then the frame rate, when the path congests (RustDesk
video_qosmodel);--bitrate-mbpsand--fpsare the ceilings. - RMM (command line): every mesh agent reports its inventory (OS, CPU, memory, drives, NICs, logged-on user, running processes and services, pending Windows reboot) at enrollment, every 15 minutes and on change; the coordinator evaluates checks (CPU, memory, disk, process, service, script exit code, offline), opens and resolves alerts, runs saved or ad-hoc PowerShell/
sh/cmdscripts with a timeout (queued while a device is offline), keeps schedules, issues deployment links and persists it all to a JSON state file.omegadesk-server admin devices|alerts|run|...is the operator interface.
First measurement (Intel Core Ultra 5 135U, 1920Γ1080, agent and client on the same machine): 60 fps and 24.5 ms end-to-end latency. Host processing takes 15 ms (11 ms of it encoding), plus 0.2 ms network, 6 ms decode and 3 ms draw.
You need Rust 1.90 or newer. On Windows you also need the Visual Studio C++ Build Tools.
On the machine you want to access (Windows for now):
cargo run --release -p omegadesk-agent -- --listen 0.0.0.0:7070The agent prints a certificate fingerprint and a one-time access password. On the machine you connect from:
cargo run --release -p omegadesk-client -- 192.168.0.10:7070 --fingerprint <fingerprint> --password <password>Useful flags:
| Flag | Where | Effect |
|---|---|---|
--encoder auto|hardware|software |
agent | Choose the video encoder (default: hardware with software fallback) |
--display N |
agent | Share monitor N (0 is the primary one) |
--bitrate-mbps N / --fps N |
agent | Video bitrate and frame rate cap |
--no-input |
agent | Share the screen only; ignore keyboard and mouse |
--password / OMEGADESK_PASSWORD |
agent, client | Fixed password (agent) or the password to send (client) |
--view-only |
client | Watch only; do not send keyboard and mouse |
--no-clipboard |
agent, client | Do not synchronize the text clipboard |
--send-file PATH |
agent, client | Send a file to the peer right after connecting (repeatable); the client also sends files dropped on its window |
--receive-dir DIR |
agent, client | Where received files are stored (default: Downloads/OmegaDesk under the user profile) |
--server, --server-key, --preauth-key |
agent, client | Join the mesh through a coordinator (see below) |
--relay-only |
agent, client | Mesh mode: never attempt direct paths |
--web-listen, --web-root, --web-allowed-host, --web-behind-tls |
server | Serve the browser client and proxy browsers to agents (see below) |
--totp-secret / --generate-totp-secret |
agent | TOTP secret for sessions the policy marks "action": "check" (see policies below) |
--recordings-dir |
agent | Where .odrec recordings of sessions marked "record": true are written |
--audit-log |
agent, server | Append security events as JSON Lines |
--totp |
client | One-time code for an MFA-gated agent (otherwise asked on the terminal) |
--policy |
server | HuJSON policy file, re-read when it changes |
Keyboard shortcuts in the client window: Ctrl+Alt+End or Ctrl+Alt+Delete sends the Secure Attention Sequence to the remote machine; Ctrl+Alt+Shift + 1..9 streams the n-th remote monitor, Ctrl+Alt+Shift+N / P the next or previous one (the title bar shows display 2/3). Letters rather than arrows, because GPU vendor hotkeys (Ctrl+Alt+Arrow on Intel) intercept the arrow combinations before any window sees them.
Run a relay (any machine with a public address; it answers STUN on the same UDP port) and a coordinator. Both need the same 32-byte ticket secret:
cargo run --release -p omegadesk-relay -- --listen 0.0.0.0:8443 --ticket-secret-hex <64 hex>
# prints the relay public key
cargo run --release -p omegadesk-server -- --listen 0.0.0.0:8080 --ticket-secret-hex <64 hex> \
--relay "relay.example:8443=<relay key>;stun=relay.example:8443"
# prints server_key (128 hex) and bootstrap_preauth_key (odk_...)Then enroll the agent and connect from the client by name:
cargo run --release -p omegadesk-agent -- --name office-pc --server coord.example:8080 --server-key <128 hex> --preauth-key odk_...
cargo run --release -p omegadesk-client -- office-pc.omega --server coord.example:8080 --server-key <128 hex> --preauth-key odk_... --password <password>The coordinator can also serve a browser client and proxy it to an agent over the mesh. Build the page once (Node 22 or newer), then start the server with --web-listen:
cd web && npm ci && npm run build && cd ..
cargo run --release -p omegadesk-server -- --listen 0.0.0.0:8080 --ticket-secret-hex <64 hex> \
--relay "relay.example:8443=<relay key>;stun=relay.example:8443" \
--web-listen 127.0.0.1:18123Open http://localhost:18123, type the agent name (office-pc) and its access password. The gateway joins the mesh as web-gateway.omega, sends the agent the same Hello the native client would, and streams H.264 to a WebCodecs decoder in the page; keyboard and mouse go back the same way. WebCodecs requires a secure context, so for anything other than localhost put the gateway behind a TLS-terminating reverse proxy (Caddy, nginx) and pass --web-behind-tls --web-allowed-host desk.example. The browser part is WebSocket-only for now.
On Windows the agent can install itself as a LocalSystem service so remote
access keeps working at the login screen, across the UAC secure desktop, the
lock screen and session switches, with no one logged in. From an elevated
(Administrator) prompt:
# Register the auto-start service (points at this executable).
omegadesk-agent service install
omegadesk-agent service start
# ... later ...
omegadesk-agent service stop
omegadesk-agent service uninstallThe service (SYSTEM) launches a capture/input worker in the active console
session using that session's winlogon.exe token, follows the input desktop so
it can capture and inject on the secure desktop, and offers a privacy mode that
blanks the local screen (a fullscreen WDA_EXCLUDEFROMCAPTURE overlay) while
the remote operator keeps working. service run is the Service Control Manager
entry point and is invoked by Windows, not manually. On Linux and macOS these
subcommands report that the service is Windows-only.
The coordinator also prints a quicksupport_preauth_key: a reusable, ephemeral key for the support tenant. The person who needs help runs (the three values can also come from OMEGADESK_SERVER, OMEGADESK_SERVER_KEY and OMEGADESK_PREAUTH_KEY, so they can be baked into a wrapper or installer):
cargo run --release -p omegadesk-quicksupport -- --server coord.example:8080 --server-key <128 hex> --preauth-key odk_<quicksupport key>It prints Your ID: 123 456 789 and Password: abc123. The technician connects with the ID (digits with or without spaces) and the password; the end user is asked on the console to allow the session (y, n, or a to allow that technician for five minutes without asking again):
cargo run --release -p omegadesk-client -- 123 456 789 --server coord.example:8080 --server-key <128 hex> --preauth-key odk_... --password abc123Closing QuickSupport ends the session and frees the ID. --view-only lets the technician watch without controlling the mouse and keyboard.
Without a policy every machine of a tenant sees every other one and the access password is the only check. With omegadesk-server --policy policy.hujson each node receives only the peers it may reach (Headscale's model: a peer you may not reach is not in your netmap, so there is no identity to connect to), and every visible peer carries the decision for a remote session towards you, which the agent enforces. The file uses the Tailscale/Headscale policy/v2 format (groups, tagOwners, hosts, acls, ssh) plus a sessions block, and is re-read when it changes on disk:
Machines get their tags from the pre-auth key they enroll with and their owner from --bootstrap-user (or create_preauth_key_for_user). An agent whose sessions require MFA needs --totp-secret (--generate-totp-secret prints one with its otpauth:// URI for the authenticator app; codes are HMAC-SHA256, 6 digits, 30 s); the client passes --totp <code> or types it when asked. Sessions marked record need --recordings-dir; the agent refuses them otherwise. --audit-log on both binaries appends one JSON object per event (enrollments, denials, MFA, DLP, recordings).
The coordinator also prints an admin_token and listens on 127.0.0.1:8081 for the local admin API (--admin-listen, --admin-token, --state-file to persist the RMM state). Every mesh agent reports its inventory automatically; the operator works from the same host as the coordinator:
export OMEGADESK_ADMIN_TOKEN=<admin_token>
omegadesk-server admin devices # status, CPU/memory/disk, open alerts
omegadesk-server admin device show office-pc # full inventory, alerts, recent script results
omegadesk-server admin checks add --id disk-c --kind disk --target 'C:' --max-percent 85 --tenant default --severity critical
omegadesk-server admin scripts add --name "Clean temp" --shell powershell --file clean.ps1
omegadesk-server admin run office-pc --script clean-temp
omegadesk-server admin schedules add --name "Nightly" --tenant default --script clean-temp --interval daily --site hq
omegadesk-server admin results --device office-pc
omegadesk-server admin links create --tenant default --site hq --expires-in 86400
# prints an odl_... token; install the agent with it instead of a pre-auth key:
omegadesk-agent --server coord.example:8080 --server-key <128 hex> --deployment-token odl_... omegadesk-agent omegadesk-client
ββββββββββββββββββββββββββββββββ QUIC (TLS 1.3) βββββββββββββββββββββββββββββ
β capture β codec β transport ββββ video stream ββββΊβ transport β decode β draw β
β (DXGI) (MF / OpenH264) β β (OpenH264) β
β input βββββββββ control stream: ping, keys, mouse, keyframe requests βββββββββββ€
β (SendInput) β β keyboard and mouse (winit)β
ββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββ
| Crate | What it does |
|---|---|
omegadesk-protocol |
Session messages (protobuf), framing, codec negotiation |
omegadesk-identity |
Device keys (ed25519/x25519), device ID, OS keychain storage |
omegadesk-capture |
Screen capture (DXGI -> WGC -> GDI fallback chain) |
omegadesk-codec |
H.264 encoders (Media Foundation, OpenH264) and decoder |
omegadesk-input |
Keyboard and mouse injection (USB HID β scancodes) |
omegadesk-transport |
QUIC transport with certificate pinning or identity-bound TLS |
omegadesk-noise |
Noise IK control channel bound to device identities |
omegadesk-mesh |
Sans-I/O NAT traversal: STUN, disco, relay fallback, tunnel encryption |
omegadesk-control |
Node-side client of the coordinator (enrollment, netmap, tickets) |
omegadesk-magicsock |
The mesh as a QUIC socket: direct or relayed, virtual peer addresses |
omegadesk-relay |
DERP-style packet relay with single-use tickets and STUN |
omegadesk-server |
Coordinator: keys, tenants, netmap stream, *.omega names, RMM service and local admin API |
omegadesk-rmm-agent |
Agent side of RMM: inventory collection, heartbeat, script execution |
omegadesk-agent |
The service that shares a machine (also a library: the session reused by QuickSupport) |
omegadesk-service |
Windows LocalSystem service and per-session worker (unattended access across the login screen and UAC) |
omegadesk-quicksupport |
Single-executable quick support: nine-digit ID, temporary password, consent prompt |
omegadesk-client |
The app you use to connect |
The full design, from the WireGuard mesh to the web client, is in docs/plan.md. docs/language.md explains why we chose Rust.
| Phase | Deliverable | Status (β done Β· πΆ implemented, field validation pending Β· π§© library only Β· β¬ not started) |
|---|---|---|
| 0 | Foundation: workspace, CI on three platforms, license policy, protocol, identity | β Done |
| 1 | First image on screen: capture, hardware encoding, QUIC, input, β€ 30 ms on LAN | β Done |
| 2 | Mesh network and coordination server: NAT traversal, relay, internal DNS | πΆ Agent and client join the mesh (--server), connect by name.omega, traverse NAT with STUN + disco and fall back to the relay in 1.5 s; verified in-process and in a two-machine test, clean two-public-NAT test pending |
| 3 | Remote access product: Windows service, login/UAC screens, clipboard, files, audio | πΆ QuickSupport, text clipboard, resumable file transfer, multi-monitor switching and adaptive video QoS are wired end to end; Windows service and privacy mode exist but the service worker does not yet route the QUIC session; audio, chat, terminal, FEC and LAN mode remain unwired; open findings: #27 |
| 4 | Web dashboard and browser client | πΆ Browser client works end to end through omegadesk-server --web-listen (WebSocket gateway on the mesh, WebCodecs H.264, keyboard and mouse, latency readout), verified in-process and in CI; the policy model and connection manager are still library only, no dashboard, no WebTransport, latency against the native client not measured; open findings: #28 |
| 5 | Security, session recording and privileged access | πΆ HuJSON policies filter every node's netmap at the coordinator and the agent enforces the compiled session grant: per-connection TOTP step-up with lockout, posture, clipboard limits, watermark, .odrec recording and JSON Lines audit on both ends, all verified in-process; approval tickets, live session sharing and the search UI remain library-only |
| 6 | Remote monitoring and management (RMM) | πΆ Agents report inventory and heartbeats, the coordinator evaluates checks, raises alerts, dispatches scripts and schedules, issues deployment links and persists to a state file; operated with omegadesk-server admin. No web dashboard, no agent self-update, Windows Update counts not scanned |
| 7 | RDP/VNC compatibility, virtual displays, MCP server, Linux/macOS/mobile | πΆ A real IddCx virtual display driver (drivers/idd, vendored signed QuickDesk driver) is wired into the agent (--virtual-display <WxH@hz>, --privacy); still no IronRDP dependency, no MCP server, no Linux/macOS capture; open findings: #31, #33 |
Contributions are welcome. Every change goes through a pull request and is reviewed by the maintainer. Read CONTRIBUTING.md before you start. It covers the workflow, the commit sign-off (DCO) and the code standards. Please follow our Code of Conduct. See also COMMUNITY.md and PROJECTS.md.
Please do not open public issues for security problems. Report them privately as described in SECURITY.md.
OmegaDesk is licensed under the GNU Affero General Public License v3.0. The license allows code under AGPL-3.0, GPL-3.0, GPL-2.0-or-later, Apache-2.0, MPL-2.0, MIT and similar licenses to be incorporated. Code under GPL-2.0-only or proprietary licenses must not be copied into this repository. deny.toml enforces the dependency policy in CI.

{ "groups": { "group:helpdesk": ["alice@example.com"] }, "tagOwners": { "tag:servers": ["group:helpdesk"] }, "sessions": [ { "action": "check", // "accept", or "check" = TOTP step-up on every connection "src": ["group:helpdesk", "tag:helpdesk"], "dst": ["tag:servers"], "record": true, // the agent writes an .odrec recording "clipboard": { "copy": 65536, "paste": 0 }, // bytes per transfer; 0 blocks; omit = unlimited "watermark": true, // "user | client IP | session | time" composed into the video "posture": { "minOs": { "windows": "10.0.19045" }, "networks": ["100.64.0.0/10"] } } ] }