A precision game-streaming host for Moonlight.
Linux & AMD-first capture, transport, and host control engineered for predictable local-network latency.
Install · Interface · Architecture · Configuration · Build · Changelog
SolarFlare is a self-hosted game-streaming server for Moonlight clients. It combines a low-latency Linux data path with an original observatory-style Web UI for pairing devices, managing applications, tuning the host, and diagnosing the complete streaming pipeline.
| Primary use | High-quality game and desktop streaming across a trusted local network |
| Host focus | Linux x86-64, with native tuning for modern AMD and Intel CPUs |
| Client protocol | Moonlight / NVIDIA GameStream-compatible transport |
| Control plane | Responsive HTTPS interface at https://localhost:47990 |
| Current release | v2026.718.5-solarflare |
Important
SolarFlare preserves the executable name, service identifier, ports, state
format, and configuration directory used by Sunshine so existing Moonlight
pairings remain compatible. User-facing product identity is SolarFlare;
compatibility identifiers such as sunshine, SUNSHINE_CLIENT_*, and
~/.config/sunshine intentionally remain unchanged.
| System | SolarFlare approach |
|---|---|
| Host control | A purpose-built observatory interface with persistent desktop navigation, compact mobile controls, command search, and unified diagnostics |
| Network path | Link-aware pacing, optional busy polling, expanded ENet buffers, DSCP tagging, and adaptive bitrate controls |
| Scheduling | Capture-thread affinity, controlled real-time scheduling, native CPU tuning, and optional boot-time performance services |
| Video | NVENC tuning profiles, per-application encoder overrides, headless display paths, and hardware-aware capture selection |
| Audio | Low-latency PipeWire hints plus optional AGC, voice activity detection, ducking, noise gating, and Opus controls |
| Operations | Scoped API tokens, trusted-subnet pairing, local client catalog, structured logs, and focused regression coverage |
SolarFlare exposes these capabilities as individual controls. Defaults are chosen for compatibility, and each tuning path can be disabled independently when comparing behavior on a particular host.
The interface is designed as a host instrument panel rather than a collection of generic settings pages. Motion is reserved for interaction and state changes; there are no ambient looping effects.
flowchart LR
ML["Moonlight client"] <-->|"encrypted GameStream transport"| NET["SolarFlare network path"]
CAP["Display capture"] --> ENC["Hardware / software encoder"] --> NET
AUD["Audio capture + optional FX"] --> NET
UI["Observatory Web UI"] --> CFG["Host configuration"]
CFG --> CAP
CFG --> ENC
CFG --> AUD
CFG --> NET
The fork-specific path is concentrated in four areas:
- Capture: X11, KMS, PipeWire/portal, headless compositor, and optional Hermes-KMS paths are selected according to the build and host environment.
- Encode: NVENC presets and per-application overrides tune latency, lookahead, adaptive quantization, and frame structure without changing the Moonlight protocol.
- Transport: Link-speed detection, pacing, socket buffers, busy polling, QoS marking, and adaptive bitrate respond to local-network conditions.
- Control: The HTTPS UI, API scopes, pairing rules, and diagnostics expose host state without placing cloud services in the streaming path.
See SolarFlare configuration for fork controls and the complete configuration reference for inherited host options.
The published sunshine-x86_64 asset is a stripped Linux x86-64 executable.
It is intended for updating an existing SolarFlare source installation, where
/usr/local/assets and the user service are already present. A fresh machine
should use the source installer so the Web UI, desktop files, shaders, udev
rules, and service unit are installed with the binary.
The source tree retains inherited cross-platform code, but the SolarFlare release and performance profile documented here are maintained for Linux.
git clone --recursive https://github.com/vindeckyy/Solar-Flare.git
cd Solar-Flare
./scripts/cachyos-build.sh
systemctl --user enable --now app-dev.lizardbyte.app.Sunshine.serviceThe installer detects Arch/CachyOS, Debian/Ubuntu, Fedora-family, openSUSE, and Bazzite hosts. Read the porting guide before using an unsupported distribution or building a portable binary.
systemctl --user stop app-dev.lizardbyte.app.Sunshine.service
sudo curl --fail --location \
--output /usr/local/bin/sunshine \
https://github.com/vindeckyy/Solar-Flare/releases/latest/download/sunshine-x86_64
sudo chmod 0755 /usr/local/bin/sunshine
sudo setcap 'cap_sys_admin,cap_net_bind_service,cap_net_raw,cap_dac_read_search+ep' \
/usr/local/bin/sunshine
systemctl --user start app-dev.lizardbyte.app.Sunshine.serviceThen open https://localhost:47990, accept the host-local certificate, and
pair a Moonlight client using its PIN.
systemctl --user --no-pager status app-dev.lizardbyte.app.Sunshine.service
getcap /usr/local/bin/sunshine
journalctl --user -u app-dev.lizardbyte.app.Sunshine.service -n 50 --no-pager
curl --insecure --output /dev/null --write-out '%{http_code}\n' \
https://localhost:47990/An unauthenticated curl request should return 401; the browser login page
becomes available after credentials are configured.
Configuration remains at ~/.config/sunshine/sunshine.conf, with application
definitions in ~/.config/sunshine/apps.json.
| Area | Representative controls | Documentation |
|---|---|---|
| Network | busy_poll_us, rate_cap_pct, enet_4mib_buffer, dscp_qos |
Fork controls |
| Scheduling | cpu_pinning, gpu_governor |
Scheduling behavior |
| Capture | headless_virtual_display, skip_wayland_correlation |
Capture controls |
| Video | nvenc_tuning_preset, adaptive bitrate, codec and quality controls |
Complete reference |
| Audio | pipewire_latency_ms, sf_audio_*, sf_opus_* |
Audio FX |
| Access | Scoped API tokens, trusted subnets, pairing, origin policy | API · Security |
For a minimal per-application encoder override:
{
"name": "Competitive profile",
"cmd": "steam steam://rungameid/730",
"encoder-preset": 0
}Preset values are -1 for the host default, 0 for latency, 1 for
balanced, and 2 for quality.
The project uses CMake, Ninja, Vite, and GoogleTest. Keep build directories
under the cmake-build- prefix.
git submodule update --init --recursive
cmake -S . -B cmake-build-release -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_DOCS=OFF \
-DBUILD_TESTS=OFF
cmake --build cmake-build-release --target sunshine web-ui -j2To run the test suite:
cmake -S . -B cmake-build-tests -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DBUILD_TESTS=ON \
-DBUILD_DOCS=OFF
cmake --build cmake-build-tests --target test_sunshine -j2
./cmake-build-tests/tests/test_sunshine --gtest_brief=1Platform-specific dependencies and compiler requirements are documented in Building and Porting SolarFlare.
| Path | Purpose |
|---|---|
src/ |
Streaming host, transport, capture, encode, audio, and configuration |
src_assets/common/assets/web/ |
SolarFlare observatory interface |
tests/ |
Unit, integration, regression, and documentation contracts |
packaging/ |
Platform packaging and optional Linux performance services |
scripts/ |
Build, release, screenshot, and maintenance tooling |
docs/ |
User, operator, developer, and inherited configuration references |
| Document | Use it for |
|---|---|
| Getting started | Inherited platform background and client prerequisites |
| SolarFlare configuration | Fork-specific network, scheduling, audio, and capture controls |
| Complete configuration | Every inherited host option |
| Porting | Distribution packages, toolchains, and manual builds |
| Troubleshooting | Capture, encoder, audio, networking, and input diagnostics |
| API | Automation and scoped host access |
| Security | Supported versions and private vulnerability reporting |
| SolarFlare changelog | Fork release and implementation history |
- Security: report SolarFlare-specific vulnerabilities privately through GitHub Security Advisories.
- Contributions: read CONTRIBUTING.md and the development guide before opening changes.
- License: SolarFlare is distributed under GPL-3.0-only.
- Upstream: the GameStream foundation and inherited platform work come from LizardByte/Sunshine. Internal compatibility names are retained where changing them would break clients, configuration, packaging, or update paths.
Own the host. Instrument the path. Stream without the cloud.





