# orbisRPC โ Discord Rich Presence for PS4 (GoldHEN RPC)
by SirHumza & CyberMask367 ยท discord.gg/BWEyfcT7ZQ
Discord Rich Presence for the jailbroken PS4 โ every game, zero setup.
A background daemon that lives entirely on your console and posts what you're
playing to Discord: name, cover art, timer. No PC at runtime.
---
## Contents
- [What you get](#what-you-get)
- [How it works](#how-it-works)
- [Requirements](#requirements)
- [Install (5 minutes)](#install-5-minutes)
- [What you'll see](#what-youll-see)
- [Config](#config)
- [Support / Community](#support--community)
- [Troubleshooting](#troubleshooting)
- [Building](#building)
- [Developing](#developing)
- [Safety](#safety)
- [Credits](#credits)
- [License](#license)
---
## What you get
| | |
|---|---|
| ๐ฎ **Any games** | Names resolve on your console via Sony's TMDB โ CUSA, zero per-game setup. |
| ๐น๏ธ **Homebrew + retro** | Homebrew resolves via pkg-zone; PS1/PS2/PSP classics via a custom list. |
| ๐ผ๏ธ **Real cover art** | Game art served per title, PlayStation logo when idle. |
| โฑ๏ธ **True timers** | Survive reconnects and restarts, resume across quick game switches. |
| ๐ง **Self-learning** | First-seen titles are remembered, so later boots resolve instantly. |
| ๐ **Update notices** | The daemon spots newer releases and tells you โ you install the new build yourself. |
| ๐ฆ **Simple install** | Payload (`.elf`) install โ token โ presence. |
| ๐ **Your call what shows** | `show_firmware`, `show_idle`, `show_media`, `show_homebrew` โ all on by default, each toggled separately. |
## How it works
The PS4 runs one foreground app at a time, so a normal homebrew app gets
suspended the moment you launch a game. orbisRPC avoids that by running as
a **background payload daemon** while games run in the foreground.
```
PS4 (GoldHEN) Discord
โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ orbisRPC daemon โ TLS โ your profile โ
โ BigApp+TitleId โ game โ โโโโบ โ Playing Game โ
โ metadata/TMDB โ name โ โ [cover] [timer] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
```
1. The daemon asks the OS what's in front (`BigApp` โ `TitleId` โ one
call, so identity and state can't disagree).
2. Looks up its title + cover (config โ app.db โ local files โ Sony
TMDB โ pkg-zone for homebrew โ raw ID fallback).
3. Connects to the Discord gateway over TLS 1.2.
4. Sets your activity with an elapsed timer; clears it when the game exits.
Details: [`docs/DAEMON.md`](docs/DAEMON.md) ยท full index at [`docs/`](docs/)
## Requirements
- Jailbroken PS4 on firmware **from 5.05 upto 13.52**, GoldHEN running.
- A way to send the payload (elfldr on port 9021, or GoldHEN BinLoader
on 9090).
- A Discord account + your user token (see Install).
- Internet on the PS4 that can reach Discord (see Troubleshooting if not).
## Install (5 minutes)
> โ
**Released as 1.0.0.** Grab `orbisRPC-setup.pkg` from
> [releases](https://github.com/SirHumza/orbisRPC/releases/latest).
1. Install the PKG on the PS4.
2. Open **orbisRPC Setup** from the home screen.
3. Pick **INSTALL / UPDATE**. It copies the payload into
`/data/payloads/`, writes your config, and offers to add orbisRPC to the
GoldHEN auto-run queue so it starts on every boot. It also offers to add a
Sony TMDB exception to [nanoDNS](https://github.com/peterrsr/nanoDNS) if
you run it โ skip either prompt if you don't want it.
4. Enter your Discord token when asked. Don't know where the token comes
from? Follow [docs/TOKEN_SETUP.md](docs/TOKEN_SETUP.md) โ wrong tokens are
the #1 install failure.
5. Restart the console (or re-jailbreak). Launch a game and watch Discord.
After that the daemon starts on boot. The app's **UNINSTALL** entry removes
the payload and your configs again.
Installing the payload by hand instead
You can skip the PKG and run the daemon yourself:
1. Delete the `/data/orbisRPC` folder from your PS4 if you have one from an
earlier build.
2. Put `orbisRPC.elf` on the console at `/data/payloads/` (FTP it over, or
USB) โ that's where GoldHEN looks for payloads.
3. Launch it from the payload list. First run creates the config file, then
says there's no token yet.
4. Open `/data/orbisRPC/config.json` and put your account token in the
`"token": "SET_ME"` slot.
5. Re-run the payload from `/data/payloads`. Launch a game and watch Discord.
The installer is the better path โ it does the token, the auto-run entry and
the nanoDNS exception for you โ but the manual route works, and it's what you
want if you'd rather not install an app.
To start on boot by hand, add `orbisRPC.elf` to the auto-run queue in GoldHEN
settings.
โ
Firmware: confirmed working on 9.00 through 13.52 but older fimwares should work.
### What's new in 1.0.0
- **orbisRPC Setup** โ a real installer app with install/update, settings and
uninstall. Handles the token, GoldHEN auto-run, and the nanoDNS TMDB
exception.
- **In-app update check** โ both the app and the daemon notice a newer
release and tell you. Neither replaces the payload on its own; the installer
is what does that.
- **Community title list** โ [`config/custom.json`](config/custom.json)
resolves apps and homebrew pkg-zone doesn't carry. Anyone can contribute by
opening a pull request.
- Dropped the payload `.bin` validation path.
## What you'll see
| Where you are | Discord shows |
|---|---|
| In a game | `Playing ` + cover + elapsed timer (+ firmware line) |
| Home screen | `PlayStation 4` + logo (`Idling on Home Menu`) |
| Settings | `PlayStation 4` + `In Settings` (game timer underneath is kept) |
| Browser | `PlayStation 4` + `Using Web Browser` (game timer underneath is kept) |
| Netflix & co. | `Watching ` |
| Nothing to show | Presence clears |
## Config
Only `token` (your Discord user session token) is required โ
`/data/orbisRPC/config.json`. Everything else ships working. Full
reference: [`docs/CONFIG.md`](docs/CONFIG.md).
| Key | Default | Meaning |
|---|---|---|
| `token` | โ | Discord user session token (**required**) |
| `presence_state` | `"On PS4"` | Activity state line for games and the home screen |
| `presence_settings_text` | `"In Settings"` | Activity name while Settings is open |
| `poll_interval_s` | `12` | Detection cadence |
| `home_art` | project logo | Idle tile artwork (URL or uploaded asset key) |
| `pkgzone_enabled` | `true` | Ask pkg-zone.com for homebrew names โ sends the title id to a third party; set `false` to disable |
| `retro_enabled` | `true` | Ask the retro-games indexes for PS1/PS2/PSP names and covers |
| `show_firmware` | `true` | Show the `Firmware X.YY` line |
| `show_idle` | `true` | Post a presence on the home screen, Settings and the browser |
| `show_media` | `true` | Post media apps (Netflix, YouTube, Plexโฆ) as `Watching` |
| `show_homebrew` | `true` | Post homebrew titles. Retro classics are **not** affected |
| `debug` | `false` | Verbose per-poll logging |
A `false` visibility flag still detects the title โ it just stops telling
Discord about it, so a game underneath keeps showing. The exception is the home
screen: with `show_idle` off, a game that closes is cleared rather than left up,
since nothing is running underneath there.
Plus the self-learned `titles` map, which fills itself in as titles resolve.
## Support / Community
Questions, test-build feedback, bug reports: join the Discord โ
**[discord.gg/BWEyfcT7ZQ](https://discord.gg/BWEyfcT7ZQ)** โ and post in
`testers-chat`. No need to hunt for the link; this is it.
**Found an issue?** Come to the Discord server and report it to us โ
we'll take care of it.
โ ๏ธ **This is a beta.** Test builds are handed out on the Discord โ join the
server to get beta access.
## Troubleshooting
Short version here; the full symptom-first guide is
[`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md).
**Game cover not showing on Discord?** It's your DNS blocker. Disable it, or use
[nanoDNS](https://github.com/drakmor/nanoDNS) with an exception.
To add the exception, open the nanoDNS config at
`/data/nanodns/nanodns.ini` and find the exceptions list:
```ini
[exceptions]
feature.api.playstation.com
.stun.playstation.net
stun..playstation.net
ena.net.playstation.net
post.net.playstation.net
gst.prod.dl.playstation.net
```
Add `tmdb.np.dl.playstation.net` so it looks like this:
```ini
[exceptions]
tmdb.np.dl.playstation.net
feature.api.playstation.com
.stun.playstation.net
stun..playstation.net
ena.net.playstation.net
post.net.playstation.net
gst.prod.dl.playstation.net
```
Once you're done, save and restart your console.
Also set your PS4's DNS to `127.0.0.1` so traffic actually goes through
nanoDNS โ then reboot. (This is the step most people miss.)
**Still "can't connect to Discord" while the PS4 is online?**
1. Open the PS4 web browser and go to `discord.com` โ if that doesn't load,
it's your connection, not the payload.
2. Delete `/data/orbisRPC/log.txt`, restart the console, run the payload
again.
3. If it still fails, send the new `log.txt` in `testers-chat`.
**Known issues (test build)**
- Some homebrew (Apollo Save Tool, Cheats Manager, Homebrew Store) isn't
detected yet โ under investigation.
## Building
Two toolchains are involved. Point them at yours once per shell:
```bash
export OO_PS4_TOOLCHAIN="$HOME/OpenOrbis-PS4-Toolchain" # installer app
export PS4_PAYLOAD_SDK="$HOME/ps4-payload-sdk" # daemon payload
export PS4_SDK_SRC="$HOME/ps4-payload-sdk-src" # 13.52 firmware gate
```
Build the PS4 SDK from git once, before anything else:
```bash
./scripts/build_sdk_from_source.sh
```
Then, from the repo root:
| Command | Builds | Output |
|---|---|---|
| `make all` | payload โ stage into the app โ package | `output/orbisRPC-1.0.0.elf` + `output/orbisRPC-1.0.0.pkg` |
| `make payload` | daemon payload only | `output/orbisRPC-1.0.0.elf` |
| `make installer` | Setup PKG only | `output/orbisRPC-1.0.0.pkg` |
| `make elf` | compile + link the app, no packaging | โ |
| `make gfx` | artwork only (PNG โ BMP) | โ |
| `make clean` | remove build output | โ |
`make all` stages the freshly built payload into `installer/assets/` before
packaging, so the PKG never ships a stale ELF.
Host-side checks, no PS4 toolchain needed:
```bash
make -C tests test # unit tests
make -C tests asan # ASan/UBSan
python3 tests/e2e_consumer.py # contracts + linkage gate
```
โ ๏ธ **Build the SDK from git, not the release ZIP.** The SDK's CRT refuses to
start on firmware it does not list, and terminates the payload before `main()`
with no log line. The released SDK (v0.9) lists 13.50 but not 13.52, so a
ZIP-built payload cannot boot on 13.52. `PS4_SDK_SRC` is what enables the
build-time check for this; without it the build still succeeds and dies at
runtime. See [`docs/research/sdk-13.52.md`](docs/research/sdk-13.52.md).
Installer app internals: [`docs/INSTALLER.md`](docs/INSTALLER.md).
Build/test/CI details: [`docs/BUILDING.md`](docs/BUILDING.md).
### Adding a title to the community list
Names for apps pkg-zone doesn't carry live in
[`config/custom.json`](config/custom.json). Add one with:
```bash
python3 scripts/add_custom_title.py # asks for TITLEID, name, cover URL
python3 scripts/add_custom_title.py --list
python3 scripts/add_custom_title.py --remove ORPC00042
```
Then open a pull request. **The file must stay compact** โ `"id":"ORPC00042"`,
no space after the colon. The payload scans for that exact byte run, so
pretty-printing the file makes every lookup miss silently. The script writes it
correctly for you.
## Developing
- CI runs host tests, ASan, contract checks, the SDK payload build with a
linkage gate, and uploads the `.elf` as an artifact. Tagging `v*`
attaches it to a GitHub Release.
- Contributor notes: [`AGENTS.md`](AGENTS.md). Security notes:
[`SECURITY.md`](SECURITY.md).
- PRs need the host suite green with outputs pasted (see the PR template).
- Daemon changes need on-console proof: log lines + firmware tested.
## Safety
- A user session token grants full account access โ never share the config,
never commit a real token. CI scans for token-shaped strings and fails.
- Token-based presence is against Discord's ToS (standard practice for
headless presence tools; risk is yours).
## Credits
- **SirHumza** โ project founder, daemon core.
- **CyberMask367** โ firmware coverage to 13.52, homebrew and retro games resolving, presence flags, tester wrangling.
- Testers in `testers-chat` on DIscord โ every log file that made a fix possible.
- [OpenOrbis](https://github.com/OpenOrbis/OpenOrbis-PS4-Toolchain) - SDK/Toolchain used to make setup PKG
- [*PKG-ZONE*](https://pkg-zone.com) โ used for resolving metadata on hombrew apps
- [*PSX DATA CENTER*](https://psxdatacenter.com) โ source used to make custom json list in [`config`](config/) for resolving retro games
## License
To be finalized (MIT vs GPL). No GPL source is copied into this tree.