Helio
Stream a computer's desktop and its games to another computer, inside one
post-quantum WireGuard tunnel.
Helio is the app: it plays your other computers, and with hosting on (a
switch, off until you turn it on) it lets them play this one, through
Helio Host, the host. Both run on macOS, Windows and Linux.
- Moonlight-class streaming: HEVC or H.264, hardware encode and decode,
HDR and YUV 4:4:4, loss repaired by reference invalidation, frame pacing
at the client display's exact rate, stereo to 7.1 sound, controllers with
rumble. At 3024x1890, 120 fps and 100 Mbit/s it showed 115.6 fps, against
110.0 for Moonlight + Apollo (a fork of Sunshine with the same video
path) on the same machines
(benchmarks).
- Post-quantum: every packet travels in pq-boringtun (WireGuard with
ML-KEM-768), and pairing is a hybrid SPAKE2 + ML-KEM PIN exchange.
- A virtual display at the client's exact mode on Windows, macOS and
Linux (GNOME and KDE under Wayland) hosts, so nothing is scaled or
letterboxed. On Windows, turning hosting on installs its driver (SudoVDA)
and the controllers' (ViGEmBus).
- From anywhere, without port forwarding: hosts are found through
sealed records on the BitTorrent DHT, and NATs are punched from both
sides, with one exception.
- The clipboard, both ways: text, images, files and folders.
- Permissions per device, as Apollo has them: whether it may see the
screen, use the keyboard, mouse or controllers, copy and paste each way,
start apps, take over or watch agents
(docs/usage.md).
- AI agents can use your hosts as clients of their own — from Helio, or
from any MCP client — held to rules the host enforces
(docs/ai-agents.md).
Getting started
- Install Helio on both computers, the one to stream and
the one you sit at (the host, Helio Host, comes inside it): download it for
macOS, Windows or Linux from
helio.mihaicristian.dev,
on a Mac with Homebrew
(
brew tap mihaicristianfarcas/helio https://github.com/mihaicristianfarcas/helio,
then brew install --cask helio), or build it from source.
- On the host, turn hosting on in Helio (setup asks, or Settings →
Hosting). On the other computer open Helio, click the host, and type
the PIN it shows into the host's Helio (This computer → Devices).
- Click the host again to stream. Ctrl+Alt+Shift+Q ends the stream
(usage). While hosting is on, Helio's icon in the menu
bar or the taskbar's notification area says what the host is doing;
Helio says when there is an update.
Status
| Client | Host |
|---|
| macOS 14+ | Helio.app: the best-tested client | Helio Host, inside Helio.app: works; stereo, or 5.1/7.1 with a surround output (macOS); no controllers |
| Windows 10/11 | Helio.exe: works; less tested than macOS | Helio Host, a Windows service: the best-tested host (best with an NVIDIA GPU; without one, H.264 in software; turning hosting on installs SudoVDA for the virtual display, on x64 PCs) |
| Linux | works under X11 and Wayland; tested in a container | works under X11 and Wayland; a virtual display on GNOME and KDE, elsewhere the screen as it is, scaled; no controllers |
What is verified and what is not, and how:
docs/verification.md. Feature by feature against
Moonlight + Sunshine: docs/parity.md.
Known limitations
- No phone, tablet or TV clients. Helio is for desktops: macOS, Windows
and Linux.
- The Linux downloads are for Ubuntu 24.04 on x86_64 and the
distributions built on it. Elsewhere,
build from source.
- Windows hosts encode in hardware only on NVIDIA. On any other GPU they
encode H.264 in software, with no HEVC, AV1, HDR or 4:4:4
(Windows).
- Linux hosts have a virtual display only on GNOME and KDE under
Wayland. Under X11 and on other Wayland desktops they stream the screen
as it is, scaled to the client
(Linux).
- No controllers on a macOS or Linux host. Only Windows hosts take them
(macOS,
Linux).
- SmartScreen may stop the Windows installer. Helio is signed, but
SmartScreen also asks for a reputation, which a signature does not give:
choose More info, check the publisher, then Run anyway
(what it should say).
- No relay. When both sides are behind symmetric NAT, punching through
fails and nothing relays the stream: forward UDP 47800 to the host on its
router (networking).
This is the beginning of the README. Read the rest at the original. Read the full README ↗