Remote desktop built on Moonlight and Sunshine. Stack and specification.
A company's Windows workstation arrives as a video stream in the browser or in a native window of the GGS desktop app: over WebTransport straight from our own data server, never by way of the API.
In development
As of October 2026
Browser or desktop app
WebCodecs in a worker
Data server
Go · WebTransport
Stream bridge
moonlight-common-c
Windows workstation
Sunshine
At a glance
The key figures of the remote desktop, backed by the code.
Up to 3840 × 2160
Resolution, 1920 × 1080 at 60 frames per second by default
Sunshine integration
WebTransport
Over QUIC with TLS 1.3; picture and sound never pass through the API
Data plane in Go
Self-hosted
Our own data server, Windows workstations with Sunshine
Architecture
How a session runs
From the click on “Connect” to the workstation being locked.
Sign in
Sign in
Sign-in goes through the website, in the desktop app as well, using the same accounts.
Pick a computer
Pick a computer
In the list of computers you have been granted, one click on “Connect” is enough.
Check and ticket
Check and ticket
The API checks rights and policy, reserves the workstation and issues a one-time ticket that is valid for 60 seconds and bound to the session and the server.
Connect
Connect
The session window opens a WebTransport connection over QUIC to the data server and presents the ticket.
Stream
Stream
Each session has its own process talking to Sunshine on the workstation. Picture and sound are passed through without re-encoding and decoded in the app.
End
End
Closing the window ends the session. The workstation is locked, and only then is it free again.
The stack
Six parts with clear boundaries: the API steers, the data server streams, the app shows.
Browser and desktop app
In the browser or in the desktop app (Electron and React): WebTransport and WebCodecs run in a worker, sound in an AudioWorklet.
Data plane
A service in Go with quic-go and webtransport-go. It checks tickets, enforces policy and runs the sessions.
Stream bridge
moonlight-common-c with ENet and nanors, as a process of its own per session. It speaks GameStream to Sunshine.
Control plane
TypeScript on Bun with Elysia and Better Auth: session brokering, rights, policies and audit. Data in PostgreSQL, occupied seats in Redis.
Contracts
Protobuf with buf and Connect RPC: the same messages across every language boundary.
Workstation
Windows 11 Pro with Sunshine from the stable releases. Sunshine captures the screen, encodes it and plays back the input.
Picture and sound as a video stream.
Straight from your own data server.
Never through the API.
Specification
Picture
- Codec
- H.264
- More codecs
- HEVC and AV1Planned
- Resolution
- up to 3840 × 2160, 1920 × 1080 by default
- Frame rate
- 60 frames per second by default
- Colour
- Rec. 709, 4:2:0
- Bitrate
- derived from resolution and frame rate, 2 to 100 Mbit/s
- Encoding
- on the workstation by Sunshine: NVENC, AMF, Quick Sync or software
- Decoding
- WebCodecs in the browser and in the desktop app, tuned for low latency
- Policies
- resolution, frame rate and bitrate can be capped per group
Sound
- Codec
- Opus, 48 kHz
- Channels
- stereo
- Microphone
- not transmitted
Input
- Keyboard
- by key position; the workstation's layout applies
- Mouse
- absolute, or relative with pointer lock, five buttons
- Mouse wheel
- vertical and horizontal
- Fullscreen
- with keyboard lock; shortcuts go to the workstation
- Ctrl+Alt+Del
- not transmitted
- Clipboard, files, devices
- through an agent on the workstationPlanned
- Touch and game controllers
- not intended
Transport
- Protocol
- WebTransport over HTTP/3 (QUIC)
- Data path
- picture, sound and input directly between app and data server, never through the API
- Re-encoding
- none; the data server passes Sunshine's stream through
- Reconnecting
- within a grace period, 90 seconds by default
- Relay and NAT traversal
- for sites without a direct connectionPlanned
Security
- Sign-in
- the website's accounts, including OIDC, LDAP and groups
- Rights
- per group and computer; policies are merged restrictively
- Tickets
- single-use, valid for 60 seconds, bound to session and server, signed with Ed25519
- Encryption
- TLS 1.3 with a pinned certificate to the data plane; the link to the workstation is fully encrypted
- Pairing
- with Sunshine, automatic, with nothing for users to do
- Isolation
- a process of its own per session
- End of session
- locks the workstation
- Audit
- session events are logged, picture, sound and clipboard never
Platforms
- macOS
- Apple silicon and Intel
- Windows
- x64 and ARM64
- Linux
- x64, as AppImage and deb
- Browser
- Chrome and Edge, without an app of its own
- Mobile
- not intended
- Workstation
- Windows 11 Pro with Sunshine
- Data server
- container image, self-operated
Licences
- Stream bridge
- moonlight-common-c under the GPL-3.0, separated from the rest of the server as a process of its own
- ENet, nanors
- MIT
- Sunshine
- GPL-3.0; not shipped, installed from the official releases
- Desktop app
- contains no GPL code
Status
- Built
- control plane with session brokering, tickets, rights, policies and audit; data plane with reconnecting; automatic pairing; the session in the browser and in the desktop app's session window
- Tested
- end to end against Sunshine in a Linux container and in a Windows VM
- Open
- a test on workstation hardware with a GPU, and production operation; latency figures follow after that
- Planned
- clipboard, files and devices; HEVC, AV1 and beyond 4K; relay and NAT traversal
Questions about the remote desktop
Answered briefly; the details are in the specification.