Disclaimer: This is an AI-assisted project developed using OpenAI Codex.
Headless Remote Play device pairing for PlayStation 5
Generate the PIN and Account ID entirely through an elfldr terminal.
A small PS5 payload that initializes the system Remote Play service, generates
a real eight-digit pairing PIN, reads the foreground user's Base64 Account ID,
and returns everything through the same elfldr connection used to launch it.
Headless LinkDev is a focused fork of LinkDev. It preserves the original project history while replacing the graphical BigApp with one direct, terminal-only payload.
No web page, TV output, SDL application, hbldr stage, notification, or separate logging connection is required for pairing.
Note
Firmware 12.70 has been paired successfully with chiaki-ng. Other firmware versions are currently unverified by this project.
$ make send PS5_HOST=192.168.1.100
[RemotePlayPair] Initializing Remote Play...
[RemotePlayPair] READY | PIN: 12345678 | Account ID: AbCdEfGhIjk= | Timeout: 300s
[RemotePlayPair] Pairing completed successfully
- One PS5 payload source file:
main.c. - One build artifact:
headless-linkdev.elf. - A host self-test for Account ID encoding and registry slot calculations.
- A GitHub Actions workflow for checks, builds, artifacts, and tagged releases.
- No vendored SDK, Sony binaries, UI framework, or runtime dependency bundle.
| Capability | Status | Notes |
|---|---|---|
| PS5 firmware 12.70 | Verified | Hardware pairing completed successfully |
| PIN generation | Verified | Uses sceRemoteplayGeneratePinCode |
| Account ID output | Verified | Base64 value accepted by chiaki-ng |
| elfldr stdout | Verified | Upload and payload output share port 9021 |
| Pairing completion | Verified | Success is detected before the payload exits |
| Other firmware | Unverified | Hardware reports are welcome |
- A jailbroken PS5 with
elfldrlistening on port9021. - The target user logged in and active in the foreground.
socaton the sending computer.- PS5 Payload SDK when building from source.
Run these commands from WSL or Linux at the repository root:
export PS5_PAYLOAD_SDK=/opt/ps5-payload-sdk
make test
make format-check
makeThe PS5 build produces headless-linkdev.elf. Generated ELF files are
ignored by Git.
Replace <PS5-IP> with the console's address:
make send PS5_HOST=<PS5-IP>The equivalent direct command is:
socat -t 99999999 - TCP:<PS5-IP>:9021 < headless-linkdev.elfKeep the terminal connected while pairing. The PIN expires after 300 seconds; send the payload again to generate a new one.
Open the discovered console or manually register a PS5 using the values printed in the terminal:
| Field | Value |
|---|---|
| Host | PS5 IP address |
| Console | PS5 |
| PSN Account-ID | Base64 Account ID printed by the payload |
| Remote Play PIN | Eight-digit PIN printed by the payload |
Complete registration before the timeout. See the chiaki-ng registration guide for the current client UI flow.
The payload sets the global Remote Play registry flag and, when available, the
foreground user's Remote Play flag to 1. It reads the user's Account ID but
does not replace it, fake-activate the account, or modify save data.
The payload runs for one registration attempt and exits after success, a pairing error, or the five-minute timeout.
| Output or symptom | Meaning |
|---|---|
| Nothing appears | Keep socat connected and confirm elfldr is listening on port 9021 |
Failed to identify the foreground user |
Log into the intended PS5 user and leave it active |
Incorrect PIN |
Send the payload again and enter all eight digits of the new PIN |
Incorrect Account ID |
Copy the Base64 value exactly, including a trailing = |
Pairing expired |
Send the payload again to start a new five-minute attempt |
| Path | Purpose |
|---|---|
main.c |
Payload and bounded host self-test |
Makefile |
Test, format, PS5 build, and elfldr send targets |
.github/workflows/build.yml |
CI artifact and tagged release workflow |
CONTRIBUTING.md |
Validation and pull-request checklist |
THIRD_PARTY_NOTICES.md |
Upstream attribution |
| Project | Role |
|---|---|
| LinkDev | Parent project and original PS5 pairing implementation |
| ActRemoteLink | Direct Remote Play API implementation used for the headless payload |
| ps5-remoteplay-get-pin | Earlier headless PIN-generation research |
| OffAct | Offline account and registry research |
| PS5 Payload SDK | Prospero compiler, linker, headers, and ELF runtime |
| chiaki-ng | Open-source Remote Play client used for pairing validation |
The SDK is a build-time prerequisite and is not copied into this repository.
See THIRD_PARTY_NOTICES.md before redistributing
modified builds.
The build workflow runs formatting, the host self-test, and the PS5 build on every push and pull request. Successful builds upload the ELF as a workflow artifact.
Tags beginning with v build the tagged commit, create a GitHub Release with
generated notes, and attach headless-linkdev.elf:
git tag v1.0.0
git push origin v1.0.0Rerunning a tag workflow replaces the existing ELF asset.
Forks with automatic tag workflows disabled can publish the same existing tag manually:
gh workflow run build.yml --ref master -f release_tag=v1.0.0Leaving release_tag blank runs the checks and uploads a workflow artifact
without creating a release.
See CONTRIBUTING.md for the development checks and
PS5-validation expectations.
Headless LinkDev is licensed under the
GNU General Public License v3.0 or later. Third-party work retains
its respective attribution; see THIRD_PARTY_NOTICES.md.
This project is not affiliated with Sony Interactive Entertainment, PlayStation, or chiaki-ng. Use it only with hardware and accounts you own.