Skip to content

Repository files navigation

ProsperoLight icon

ProsperoLight

A native Moonlight client for PlayStation 5 homebrew
Stream Sunshine applications with hardware video decoding, low-latency input, selectable stereo or 5.1 surround audio, and a controller-first interface.

PlayStation 5 H.264 and HEVC 60, 90, and 120 FPS Stereo and 5.1 Opus audio RmlUi GPL-3.0-or-later

Demo available by clicking the image below.

ProsperoLight Games screen configured for 4K HDR

Highlights

  • Native PS5 hardware streaming through VideoDec2 and AGC at 1080p, 1440p, and 2160p, with independently selectable 60, 90, and 120 FPS stream targets.
  • Smoother 4K120 presentation with bounded decode/presentation overlap: a wired HEVC test reduced stale-frame skips from 24.3% to zero. See the before/after measurements and limits.
  • 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, independent frame-rate selection, and bitrate presets from 10 to 500 Mbps.
  • Selectable 48 kHz stereo or 5.1 surround 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.

Project foundation

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.060
Version source sce_sys/param.json
Writable data /download0 only

Features

  • Discover Sunshine hosts on the LAN or add an IPv4 address manually.
  • Remember up to eight PCs, pairing identities, and stream preferences under /download0 across 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 1080p, 1440p, and 2160p. Select 60, 90, or 120 FPS independently of resolution and bitrate; live 1440p/90 and 2160p/120 Sunshine sessions are hardware-validated.
  • Present decoded GPU surfaces directly through AGC, with edge-to-edge and television-safe display modes. At 60 FPS, 1440p is GPU-scaled into a 3840x2160 target and 2160p is presented 1:1. High-refresh streams retain the same 4K output geometry: 1440p is GPU-scaled to 4K, while 2160p/120 is presented through the PS5's native 3840x2160 119.88 Hz output path.
  • 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 any available resolution and frame-rate selection when the Sunshine host advertises support.
  • Decode Moonlight Opus audio and output selectable 48 kHz stereo or 5.1 surround 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.

Current status

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 at 60 FPS. Bounded live sessions additionally confirm 2560x1440 at 90 FPS and 3840x2160 at 120 FPS from Sunshine. An isolated hardware oracle additionally confirms native 3840x2160 119.88 Hz VideoOut presentation at 119.88 FPS.

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.

Important

Wired Ethernet is strongly recommended for reliable streaming, particularly at 1440p or 2160p, 90 or 120 FPS, and higher bitrates. Wi-Fi can work, but interference and variable latency may cause dropped frames or input delay.

Requirements

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-18

The 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 doctor

Compressed .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.

Build

# Production release image; also assembles the complete title folder.
make ffpfsc

# Faster folder-only development build.
make

Outputs are written to:

dist/PPSA99002/           complete title folder
dist/PPSA99002.ffpfsc     compressed installation image

Useful development gates are:

make test       # C++ unit/runtime, presentation ownership, report, and tooling checks
make test-stream-performance # Host-only scalar/SIMD FEC and Opus compatibility
make lint       # formatting, static analysis, metadata, asset, and shell checks
make check      # lint + every host test + complete folder build
make ffpfsc     # production folder + compressed image

An optional make ffpkg target remains available for local development. The .ffpkg output is intentionally excluded from GitHub Actions and Releases. See Package formats.

GitHub Actions and releases

The Build workflow runs on every push to main, pull request, version tag, and manual dispatch. It:

  1. checks out all pinned submodules;
  2. installs the public Linux/PS5 build prerequisites;
  3. validates metadata and the release tag;
  4. runs lint, GoogleTest, runtime-allocation, presentation/report guards, Python integration checks, and host-only scalar/SIMD FEC and Opus comparisons;
  5. independently reproduces and verifies runtime/libc.prx;
  6. builds PPSA99002.ffpfsc and archives the complete app folder as PPSA99002.zip; and
  7. generates SHA256SUMS for both release formats and uploads all three files as the Actions artifact.

A tag matching the exact contentVersion verifies that build-time checksum again, then publishes the .ffpfsc image, app-folder .zip, and SHA256SUMS. .ffpkg builds are never attached to a release.

Update an installed copy

  1. Download either PPSA99002.ffpfsc or PPSA99002.zip from the latest GitHub release and verify it with SHA256SUMS.
  2. Fully close ProsperoLight.
  3. For the image form, replace the existing PPSA99002.ffpfsc in the directory scanned by ShadowMountPlus. For the folder form, extract PPSA99002.zip and upload its complete PPSA99002 directory to /data/homebrew/, producing /data/homebrew/PPSA99002/eboot.bin. Do not upload the ZIP itself.
  4. Restart ShadowMountPlus cleanly or restart the PS5, then wait for ShadowMountPlus to rediscover the title before launching it.
  5. Launch ProsperoLight and confirm the new version below the title in the top bar.

Do not relaunch immediately after replacing the same pathname: ShadowMountPlus may still have the previous image mounted. Keeping the title ID as PPSA99002 preserves the title's /download0 pairing and settings data; /app0 comes from the replacement image, while Shell presentation metadata may remain cached.

Deploy

For an already-running PS5 FTP service, stage the development folder with:

make deploy PS5_HOST=192.168.1.100

Fully 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=ffpfsc

ProsperoLight never changes PS5 system settings or configures a loader. See Deployment for the safe development loop and removal behavior.

Pairing and first stream

  1. Start Sunshine on a PC connected to the same trusted LAN. Wired Ethernet for both the PC and PS5 is strongly recommended.
  2. Open ProsperoLight and choose a discovered PC, or select Add PC and enter its IPv4 address.
  3. Select Pair PC, then enter the displayed PIN in Sunshine within two minutes.
  4. Open Games, choose Desktop or another advertised application, and press Cross.
  5. Use Select + L1 to end the stream and return to ProsperoLight.

Pairing credentials and settings are title-scoped. Installing under a different title ID intentionally requires pairing again.

Tip

For the smoothest 90 or 120 FPS result, choose the resolution, frame rate, codec, and bitrate before launching the Sunshine application. If you change them after returning to the launcher, stop the active application first and then launch it again so Sunshine creates a fresh capture/encoder session. Tune bitrate upward case by case; a higher value can reduce smoothness at 4K or high frame rates even when the network link is fast.

Controls

Launcher

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

Streaming

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.

Source layout

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.

Versioning

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.060
git push origin main 01.000.060

Keep 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.

Documentation

Document Purpose
Changelog User-visible changes in each published version
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
Performance Round 2 Offline A/B candidates, measurements, and hardware promotion gates
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

Credits, third-party software, and licenses

ProsperoLight exists thanks to the maintainers and contributors of:

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.

About

An unofficial Moonlight port (game streaming) for PS5

Resources

Contributing

Stars

61 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages