Disclaimer: This is an AI-assisted project developed using OpenAI Codex.
A native Moonlight client for PlayStation 5 homebrew
Stream Sunshine applications with hardware video decoding, low-latency input,
stereo audio, and a controller-first interface.
Demo available by clicking the image below.
- Native PS5 hardware streaming through VideoDec2 and AGC at 1080p60, 1440p60, and 2160p60.
- H.264 High, HEVC Main, and HEVC Main10 HDR10 support at every available resolution.
- Low-latency DualSense, physical USB keyboard and mouse, controller-driven mouse mode, and an on-screen password keyboard.
- Automatic Sunshine discovery, manual-IP fallback, persistent multi-PC pairing, application artwork, and launch/resume/stop controls.
- Persistent stream preferences, edge-to-edge or TV-safe presentation, and bitrate presets from 10 to 500 Mbps.
- 48 kHz stereo Opus audio, native launcher sound effects, live performance metrics, and graceful connection recovery.
ProsperoLight is a native PS5 client for the open Moonlight/Sunshine streaming protocol. Its RmlUi launcher discovers and pairs with Sunshine hosts, browses their applications, and starts a native streaming session. Video access units are decoded by PS5 VideoDec2 and the resulting GPU-visible surfaces are presented by AGC without copying decoded pixels through a CPU framebuffer.
Important
ProsperoLight does not run on an unmodified retail console. It is intended for consoles you own with an already configured, compatible homebrew loader. This repository does not include an exploit, proprietary Sony SDK, system module, encryption key, firmware file, or game asset.
Important
Built on the PS5 Native App Boilerplate.
ProsperoLight preserves the template's C++20 structure, .hpp interfaces,
reproducible clean-room runtime, native FSELF tooling, tests, safe folder
deployment, and release automation.
Important
Controller input work is documented in PS5 Native Gamepad Input Research. The companion repository records recovered native APIs, low-latency examples, and DualSense behavior that informed ProsperoLight's controller integration.
Important
Video work is documented in PS5 Hardware Video Decoding Research. The companion repository records VideoDec2, HEVC, HDR10, zero-copy AGC, resolution, and performance findings that informed the streaming presenter.
Important
Audio work is documented in PS5 Audio Decoding Research. The companion repository records codec, AJM, hardware/firmware offload, and output-path research that informed ProsperoLight's audio integration.
The client uses the established moonlight-common-c protocol implementation rather than reimplementing the wire protocol. The launcher, stream coordination, PS5 input/audio/video integration, UI, and build tooling are maintained in this repository.
| Identity | Value |
|---|---|
| Shell title | ProsperoLight |
| Title ID | PPSA99002 |
| Category | Game |
| Current version | 01.000.040 |
| Version source | sce_sys/param.json |
| Writable data | /download0 only |
- Discover Sunshine hosts on the LAN or add an IPv4 address manually.
- Remember up to eight PCs, pairing identities, and stream preferences under
/download0across application restarts. - Pair with a two-minute PIN dialog and unpair through explicit two-press confirmation.
- Browse up to 64 advertised Sunshine applications with paged artwork, launch/resume feedback, and active-application stop controls.
- Decode H.264 High and HEVC Main streams through VideoDec2 at 1080p60, 1440p60, and 2160p60. All three modes are hardware-validated; broader higher-resolution compatibility remains beta.
- Present decoded GPU surfaces directly through AGC, with edge-to-edge and television-safe display modes. The presenter uses native 1080p scanout for 1080p streams, bilinear GPU scaling from 1440p to a 3840x2160 target, and 1:1 presentation from 2160p to a 3840x2160 target.
- Select bitrate presets up to 500 Mbps. The best setting depends on the host, encoder, network, and selected codec rather than link speed alone.
- Enable HEVC Main10 HDR10 output at 1080p60, 1440p60, or 2160p60 when the Sunshine host advertises support.
- Decode Moonlight Opus audio and output 48 kHz stereo through PS5 AudioOut.
- Forward low-latency DualSense controls, with controller/mouse switching and a stream keyboard that works at Windows sign-in.
- Forward a physical USB keyboard and mouse directly to Sunshine during a stream, including modifiers, navigation/function keys, five mouse buttons, and vertical/horizontal scrolling.
- Show Moonlight-style stream metrics for resolution, codec, frame rates, packet loss, network/host latency, and decode time.
- Recover from connection failures and return from a stream to the launcher without leaving a stale session running.
- Use original 4K launcher artwork, icon, loading presentation, and selection music in a controller-first RmlUi interface.
- Play distinct opening, navigation, action, setting, back, success, error, and stream-start cues through the native PS5 SDL audio backend.
The complete 1080p60 path—pairing, application launch, VideoDec2/AGC video, stereo audio, DualSense input, mouse mode, Windows sign-in keyboard, metrics, return-to-launcher, relaunch, and cleanup—has been exercised on PS5 hardware with Sunshine. Hardware runs also confirm HEVC 1440p-to-4K filtered GPU presentation and native HEVC 2160p-to-4K presentation with the metrics HUD.
ProsperoLight is still alpha software. HEVC, 1440p, 2160p, HDR, very high bitrates, network recovery, and long gameplay sessions need broader validation across GPUs, Sunshine configurations, networks, TVs, firmware versions, and homebrew loaders. See the evidence and open acceptance items in Validation.
Build from Linux, WSL, or a Linux CI runner. On Ubuntu, Debian, or WSL:
sudo apt update
sudo apt install curl git make pkg-config python3 python3-venv tar unzip wget \
clang-18 clang-format-18 clang-tidy-18 lld-18The build downloads and verifies its public PS5 Payload SDK, zlib, GoogleTest,
and packaging inputs below ignored .deps/ directories. Initialize the pinned
streaming sources after cloning:
git submodule update --init --recursive
make doctorCompressed .ffpfsc output requires Python 3.9 or newer with venv support.
The optional local .ffpkg target additionally requires .NET 8 or newer.
Nothing is installed globally by the project build.
See Getting started and Native tooling for clean-machine setup details.
# Production release image; also assembles the complete title folder.
make ffpfsc
# Faster folder-only development build.
makeOutputs are written to:
dist/PPSA99002/ complete title folder
dist/PPSA99002.ffpfsc compressed installation image
Useful development gates are:
make test # C++ unit/runtime tests and Python tooling regressions
make lint # formatting, static analysis, metadata, asset, and shell checks
make check # lint + every host test + complete folder build
make ffpfsc # production folder + compressed imageAn optional make ffpkg target remains available for local development. The
.ffpkg output is intentionally excluded from GitHub Actions and Releases.
See Package formats.
The Build workflow runs on every push to
main, pull request, version tag, and manual dispatch. It:
- checks out all pinned submodules;
- installs the public Linux/PS5 build prerequisites;
- validates metadata and the release tag;
- runs lint, GoogleTest, runtime-allocation, and Python integration checks;
- independently reproduces and verifies
runtime/libc.prx; - builds
PPSA99002.ffpfsc; and - generates
SHA256SUMSand uploads both files as the Actions artifact.
A tag matching the exact contentVersion verifies that build-time checksum
again, then publishes exactly the .ffpfsc image and SHA256SUMS. Folder and
.ffpkg builds are never attached to a release.
For an already-running PS5 FTP service, stage the development folder with:
make deploy PS5_HOST=192.168.1.100Fully close ProsperoLight before deploying. The deployer writes only the
current title below /data/homebrew, uploads through temporary names, and
publishes eboot.bin and sce_sys/param.json last. Upload the complete folder;
eboot.bin alone is not a valid deployment.
To test the packaged form instead:
make deploy PS5_HOST=192.168.1.100 DEPLOY_FORMAT=ffpfscProsperoLight never changes PS5 system settings or configures a loader. See Deployment for the safe development loop and removal behavior.
- Start Sunshine on a PC connected to the same trusted LAN.
- Open ProsperoLight and choose a discovered PC, or select Add PC and enter its IPv4 address.
- Select Pair PC, then enter the displayed PIN in Sunshine within two minutes.
- Open Games, choose Desktop or another advertised application, and press Cross.
- Use
Select + L1to end the stream and return to ProsperoLight.
Pairing credentials and settings are title-scoped. Installing under a different title ID intentionally requires pairing again.
| Input | Action |
|---|---|
| D-pad / left analog stick | Move focus or change the selected PC/application/setting |
| Cross | Activate, pair, launch, resume, or change a setting |
| Circle | Return to the PCs page |
| Square | Stop the active Sunshine application |
| Triangle | Refresh the selected Sunshine host |
| L1 / R1 | Change between PCs, Games, and Settings |
| Options | Open Settings |
| Input | Action |
|---|---|
Select + R1 |
Toggle the metrics overlay |
Select + L1 |
End the stream and return to ProsperoLight |
Select + Square |
Toggle mouse/controller mode |
Select + Triangle |
Toggle ProsperoLight's stream keyboard |
| Physical USB keyboard | Forward keys and modifiers directly to Sunshine |
| Physical USB mouse | Move, click, and scroll directly on the Sunshine host |
| Either analog stick in mouse mode | Move the pointer |
| Cross / Circle / Square in mouse mode | Left / right / middle mouse button |
| L1 / R1 in mouse mode | Mouse X1 / X2 button |
| D-pad in mouse mode | Vertical / horizontal scroll |
| D-pad while keyboard is open | Move between keys |
| Cross while keyboard is open | Type the selected key |
| Triangle while keyboard is open | Toggle Shift |
| Square while keyboard is open | Send Backspace |
| Options while keyboard is open | Send Enter and close the keyboard |
| Circle while keyboard is open | Close the keyboard |
The stream keyboard contains every printable US-ASCII character used by standard passwords. It is not currently a multilingual or Unicode input method. Keyboard text is sent directly as Moonlight key events and is not stored by ProsperoLight or written to its configuration.
src/main.cpp SDL2/RmlUi lifetime and stream handoff
src/moonlight_app.cpp launcher state, navigation, and feedback
src/moonlight_backend.cpp pairing, app listing, artwork, and control
src/moonlight_discovery.cpp LAN discovery
src/moonlight_config.cpp /download0 host and preference persistence
src/moonlight_stream.cpp Moonlight session, VideoDec2, audio, input
include/moonlight_physical_input.hpp USB-HID to Moonlight input mapping
src/native_agc_present.cpp zero-copy AGC presentation and overlays
src/gamestream/ retained Moonlight-compatible C boundary
include/*.hpp application-owned public interfaces
platform/ps5/ narrow Moonlight PS5 compatibility adapters
third_party/ pinned Moonlight, mbedTLS, and Opus sources
ui/ RML, RCSS, fonts, icons, and chrome assets
sce_sys/ launcher metadata, 4K artwork, icon, music
runtime/libc.prx generated clean-room loader runtime
tooling/native/ native ELF/FSELF and runtime build tools
tests/ GoogleTest and Python host regressions
docs/ architecture, setup, testing, and evidence
Application-owned code is C++20 with .hpp interfaces. The retained
src/gamestream C code and pinned upstream dependencies preserve their native
language and public headers; they are dependency boundaries, not a second
application architecture. See Architecture and
Porting notes.
sce_sys/param.json is the only application identity and
release-version source. Its PS5-format contentVersion is injected into the
top bar, checked against the release tag, and used as the GitHub Release name.
Do not add a v prefix.
# After updating param.json and passing all local gates:
git tag 01.000.040
git push origin main 01.000.040Keep PPSA99002, conceptId, and contentId stable for updates to this title.
Changing the title ID creates a separate PS5 application and separate pairing
storage. See Configuration.
| Document | Purpose |
|---|---|
| Getting started | Clean-machine prerequisites and first build |
| Architecture | Launcher, protocol, video, audio, and input flow |
| Configuration | Identity, versioning, settings, and build variables |
| Testing | Host test boundaries and commands |
| Validation | Hardware acceptance checklist and recorded evidence |
| Deployment | Safe folder/image staging and smoke tests |
| Package formats | Folder, .ffpkg, and .ffpfsc outputs |
| Troubleshooting | Common build, launch, and runtime failures |
| Platform notes | PS5 filesystem, loader, and presentation constraints |
| Runtime shim | Clean-room libc.prx scope and reproduction |
| Presentation assets | Icon, backgrounds, and selection audio |
| Contributing | Change, test, and release requirements |
| Notices | Dependency, asset, and license attribution |
ProsperoLight exists thanks to the maintainers and contributors of:
- Moonlight and Sunshine for the open streaming protocol ecosystem;
- PS5 Native App Boilerplate and the PS5 Payload SDK for the reproducible native foundation and public target integration;
- RmlUi, SDL2, and FreeType for the launcher interface;
- mbedTLS and Opus for secure protocol and audio support;
- MkPFS, UFS2Tool, LLVM/Clang, Python, zlib, and GoogleTest for build, packaging, and validation tooling.
The original ProsperoLight artwork and selection music are distributed under the project license. Complete revisions, checksums, copyright notices, and third-party terms are recorded in NOTICE.md and the corresponding source trees.
ProsperoLight is distributed under GPL-3.0-or-later. PlayStation and PS5 are trademarks of Sony Interactive Entertainment. Moonlight and Sunshine retain their respective project identities. ProsperoLight is an independent homebrew project and is not affiliated with or endorsed by Sony Interactive Entertainment, Moonlight, or Sunshine.
This project was developed with assistance from OpenAI Codex, including some original interface artwork. Project maintainers reviewed and validated the resulting code, tests, documentation, dependencies, and generated assets.
