System

Architecture

One shared Rust core with thin per-OS layers, a stateless signaling tier, a relay that only forwards ciphertext, and a browser console. Built to run under 500 endpoints in year one, and to scale the signaling and relay tier out later without a rewrite.

  customer network                         your infrastructure (AU)
 ┌───────────────────┐                    ┌──────────────────────────────┐
 │  Windows / macOS  │   443 outbound     │   signaling  (stateless WS)  │
 │  ┌─────────────┐  │ ─────────────────▶ │   rendezvous, no session     │
 │  │  service    │  │                    │   state in process           │
 │  │  (Session 0)│  │                    └───────────────┬──────────────┘
 │  └──────┬──────┘  │                                    │
 │         │ spawns  │        DTLS-SRTP (ciphertext)      ▼
 │  ┌──────┴──────┐  │        ICE / STUN ──▶ direct   ┌───────────────┐
 │  │   session   │  │ ═══════════════════════════════│  coturn relay │
 │  │   helper    │  │        TURN fallback           │  ciphertext   │
 │  │ capture+in  │  │                                │  only         │
 │  └─────────────┘  │                                └───────┬───────┘
 └───────────────────┘                                        │
                                                              ▼
                                            ┌──────────────────────────────┐
                                            │  Next.js control plane        │
                                            │  passkey/TOTP · RBAC · audit  │
                                            │  browser: WebCodecs decode    │
                                            └───────────────┬──────────────┘
                                                            │
                                            ┌───────────────┴──────────────┐
                                            │  Postgres  (control plane)    │
                                            └──────────────────────────────┘

Setting up a session

Six steps, each one authorised.

01

Enrol

The agent installs, generates its keypair in the platform keystore, and enrols with a single-use, rate-limited token. The server pins its public key.

02

Rendezvous

Agent and console meet at the stateless signaling service over a WebSocket. No session state is held in the process, so signaling scales horizontally.

03

Authorise

The session is cryptographically authorised per connection. RBAC and tenant checks run before any media is negotiated.

04

Connect

ICE gathers candidates via STUN. Where a direct path fails, self-hosted coturn relays. The relay only ever sees DTLS-SRTP ciphertext.

05

Capture and encode

DXGI Desktop Duplication on Windows, ScreenCaptureKit on macOS, behind one capture trait. Frames stay on the GPU until hardware encode (H.265, then H.264).

06

Decode and control

The browser consumes the media track and decodes with WebCodecs. Input, clipboard, and files travel over encrypted data channels, behind the consent indicator.

Windows split

Service plus session helper

A SYSTEM service in Session 0 owns enrolment, keys, networking, and updates. It cannot capture the interactive desktop, so a helper is launched into the active console session to capture and inject. Session changes are tracked with WTSGetActiveConsoleSessionId and session notifications, and the helper is relaunched on switch, lock, or RDP transitions.

macOS grant

TCC handled two ways

Managed Macs receive PPPC configuration profiles via MDM, keyed to the Developer ID team identifier, granting Screen Recording and Accessibility to the signed bundle. Unmanaged Macs get a guided first-run flow that deep-links to the right System Settings pane and verifies the grant before the agent reports ready.

Architecture decision records, the data model, and the agent-to-server protocol are all documented in full.

Documentation →