This fork connects shadPS4 to a private shadNet server so Bloodborne players can use either the game's traditional online co-op flow or the experimental seamless mode. The host rings the Beckoning Bell and a guest rings the Small Resonant Bell in both modes.
This README is written for players. The person running the server should also follow the shadNet server guide.
Important
Use the matching releases of this shadPS4 fork and the shadNet fork. The upstream public builds do not contain all of this project's P2P changes.
All players and the shadNet server must use the same mode. Completely close the launchers, shadPS4 processes, and server before changing modes.
Traditional mode keeps Bloodborne's normal area, boss, level, bell, death, and
session restrictions. Start QtLauncher or BBLauncher normally. Do not set
SHADPS4_BLOODBORNE_SEAMLESS_COOP, and have the server owner set
BloodborneSeamlessCoop=false in shadnet.cfg.
If the variable was set in the current terminal, remove it before starting the launcher:
unset SHADPS4_BLOODBORNE_SEAMLESS_COOPIn Windows PowerShell, close the terminal that enabled seamless mode or run:
Remove-Item Env:SHADPS4_BLOODBORNE_SEAMLESS_COOP -ErrorAction IgnoreSeamless mode bypasses the known bell availability checks and lets shadNet match players in different maps. For a cross-map summon, the guest is moved to the host's map before Bloodborne completes its normal room join. The server owner must enable seamless mode as described in the shadNet README, and every player must start their launcher with this environment variable:
SHADPS4_BLOODBORNE_SEAMLESS_COOP=1
On Linux, start the launcher from a terminal. Replace the path with the actual QtLauncher or BBLauncher executable:
SHADPS4_BLOODBORNE_SEAMLESS_COOP=1 /path/to/QtLauncher.AppImageOn Windows, open PowerShell in the launcher folder and run:
$env:SHADPS4_BLOODBORNE_SEAMLESS_COOP = "1"
./QtLauncher.exeSubstitute the BBLauncher executable when using BBLauncher. On macOS, run the executable inside the application bundle so it inherits the variable:
SHADPS4_BLOODBORNE_SEAMLESS_COOP=1 /Applications/QtLauncher.app/Contents/MacOS/QtLauncherKeep that terminal open while playing. Starting the launcher normally from a desktop icon will not inherit a variable set only in another terminal. The reverse-engineering trace and capture variables are optional diagnostics and are not required for seamless mode.
Seamless mode is still experimental. Bell use and cross-map guest placement are working, but lantern travel after a co-op session has already formed is not yet complete because Bloodborne can still suppress the lantern interaction prompt. Back up saves before testing it.
- A Windows or Linux PC capable of running Bloodborne in shadPS4.
- A legal dump of Bloodborne and any required system files. This project does not provide game or PlayStation firmware files.
- The same compatible game version as the other players. The currently tested Bloodborne target is CUSA03173 version 01.09.
- This fork's shadPS4 build and its QtLauncher.
- A unique account created on the group's shadNet server.
- Tailscale installed and joined to the server owner's tailnet.
- Normal Internet access for the Bloodborne community HTTP service.
The downloaded shadps4.exe, AppImage, or native shadps4 binary is the
emulator core. Double-clicking it directly may only show a message that it is a
CLI application. Add it to a launcher and start Bloodborne through that
launcher.
Extract or move the custom build to a permanent folder first. Do not move it
after adding it because the launcher saves its full path. On Windows, keep all
DLL files supplied with the build beside shadps4.exe.
- Open QtLauncher.
- Click Version Manager.
- Click Add Custom.
- Select this fork's
shadps4.exeon Windows, AppImage on Linux, or nativeshadps4executable. - Enter a clear name such as
Bloodborne P2P. - Close Version Manager and confirm
Bloodborne P2Pis selected in the version selector on QtLauncher's main window. - Launch the existing Bloodborne entry normally.
On Linux, make an AppImage executable before adding it:
chmod +x /path/to/shadps4-bloodborne-p2p.AppImageDragging the executable onto QtLauncher also opens the custom-version flow.
BBLauncher can also use a local custom core:
- Open BBLauncher and click Manage Builds.
- Click Add Local Build. Do not download an upstream build for this setup.
- Select this fork's
shadps4.exe, AppImage, or nativeshadps4executable. - Name it
Bloodborne P2P. - In Installed Builds, check the box beside
Bloodborne P2P. Only one build should be checked. - Close Manage Builds and confirm the selected build path on the main window.
- Set the Bloodborne install folder if BBLauncher has not already found it.
Do not create an empty user folder beside the custom executable. Such a folder
enables portable mode and can make the launcher use different users and saves.
Existing portable users should keep using their existing user folder.
The server owner runs this on the shadNet machine:
tailscale ip -4It prints an address beginning with 100., such as 100.101.102.103. That is
the server Tailscale IP. Replace the example address throughout this guide
with the real one.
| Place | Value |
|---|---|
| shadPS4 Server | 100.101.102.103:31313 |
| shadPS4 WebAPI Server | http://100.101.102.103:31315 |
host_overrides.json summon URL |
http://100.101.102.103:31315 |
shadNet Host setting, on the server |
0.0.0.0 |
Do not put 0.0.0.0 in shadPS4. Do not use the server's public Internet IP.
127.0.0.1 only works when shadPS4 and shadNet run on the same computer.
The server owner must invite every player to the same tailnet. Bloodborne's game traffic is peer-to-peer, so sharing only the server device is not enough.
- Open the Tailscale admin console.
- Select Users, then Invite external users.
- Enter each player's email address or copy an invitation link.
- Give players the Member role.
- Send the invitation and the server Tailscale IP to the players.
Invitation links expire, so create a new one if an old link no longer works.
- Install Tailscale from the official download page.
- Accept the server owner's invitation.
- Sign in to Tailscale on the computer that will run shadPS4.
- Confirm that the server appears in
tailscale status. - Test it with
tailscale ping 100.101.102.103, using the real server IP.
No router port forwarding is needed. If the operating system asks for firewall access, allow Tailscale and shadPS4 on private networks.
Ask the server owner for your own NP ID and password. Do not reuse another player's account; two players cannot sign in with the same account at once.
There is no web signup page. First, the server owner chooses a registration key. shadNet does not generate it. It is simply a private signup code you invent, such as a long phrase with no spaces. It is not a player's password and is not needed after that player's account has been created.
In build/shadnet.cfg, set your own value:
RegistrationSecretKey=YOUR_OWN_LONG_PRIVATE_CODEReplace YOUR_OWN_LONG_PRIVATE_CODE with a value only the server owner knows.
Leave that value in the configuration to prevent uninvited account creation.
On the shadNet computer, open a second terminal while the server is running and build its bundled registration tool:
cd /path/to/shadnet-p2p/clientsample
cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallelCreate one account for each player. Replace YOUR_OWN_LONG_PRIVATE_CODE below
with the exact value entered in build/shadnet.cfg:
./build/shadnet-sample 127.0.0.1 31313 register HunterOne CHOOSE_A_PASSWORD hunter1@example.com YOUR_OWN_LONG_PRIVATE_CODE
./build/shadnet-sample 127.0.0.1 31313 register HunterTwo CHOOSE_ANOTHER_PASSWORD hunter2@example.com YOUR_OWN_LONG_PRIVATE_CODENP IDs must be unique and contain 3 to 16 letters, numbers, hyphens, or
underscores. Emails must also be unique. The created profiles are stored in
build/db/shadnet.db; the server owner should back up this file while shadNet
is stopped. Full server-side instructions are in the
shadNet README.
If RegistrationSecretKey is left empty, omit the final argument from the
registration command. That opens registration to anyone who can reach the
server, so it is not recommended for an ongoing server.
The local shadPS4 username and the online shadNet account are different. Enter the registered NP ID and that player's player password. Never enter the server registration key in a launcher.
- Open User Manager.
- Select the user that will launch Bloodborne. The default user is shown in bold; click Set Default User first if the wrong row is bold.
- Click ShadNet..., or right-click the row and choose ShadNet Settings....
- Enable Enable ShadNet for this user.
- Enter the registered name in Account ID (NPID).
- Enter that account's player password in Password.
- Click Save, then close User Manager.
The ShadNet column should now show On followed by the NP ID.
- Select Bloodborne, then click the shadPS4 Settings icon.
- Open the User / shadNet Settings tab.
- Confirm Username is the intended local/default shadPS4 user.
- Enable Enable shadnet for current user.
- Enter the registered NP ID in shadNet ID.
- Enter that account's player password in shadNet Password.
- Click Save.
The NP ID is the online name shadNet uses. It is separate from the local shadPS4 profile name.
Use the server owner's Tailscale IP. In QtLauncher, open Settings, then its network/shadNet settings. In BBLauncher, open shadPS4 Settings, then User / shadNet Settings; the network controls are on the right side.
| Setting | Value |
|---|---|
| Network connected | Enabled |
| shadNet | Enabled |
| Server | 100.101.102.103:31313 |
| WebAPI Server | http://100.101.102.103:31315 |
| Signaling Info | Leave blank |
| UPnP | Disabled for the Tailscale setup |
Use the same server values on every player's PC, including the PC that also runs shadNet. Restart shadPS4 after changing network or user settings.
BBLauncher's Create Host Override File button currently creates only the community-service override and can overwrite an existing file. Do not use that button for this private server. Create the complete two-entry file in the next section manually. Also ignore Open shadNet Registration Page; accounts for this private server are created by its owner as described above.
Close shadPS4 completely before editing this file. The filename uses an
underscore: host_overrides.json.
Create it in the shadPS4 user-data folder for your operating system:
| System | File location |
|---|---|
| Linux | ~/.local/share/shadPS4/host_overrides.json |
Linux with XDG_DATA_HOME |
$XDG_DATA_HOME/shadPS4/host_overrides.json |
| Windows | %APPDATA%\shadPS4\host_overrides.json |
| macOS | ~/Library/Application Support/shadPS4/host_overrides.json |
| Portable setup | user/host_overrides.json beside the launcher |
The directory is created after shadPS4 has been run once. Put this exact JSON
in the file, replacing the example 100. address with the server Tailscale IP:
{
"https://ss4.scej-network.jp:20443": "http://thehuntersdream.com",
"http://thehuntersdream.com:18671/summon_messenger": "http://100.101.102.103:31315"
}Do not change the first URL or remove :18671/summon_messenger from the second
key. Every player needs this file. Restart shadPS4 after creating or changing
it; host overrides are loaded once when the emulator starts.
Before starting Bloodborne, keep Tailscale connected and make sure shadNet is running. Open this address in a browser, with the real server IP:
http://100.101.102.103:31315/status
A working server returns:
{"ok":true,"service":"shadnet-webapi"}Start Bloodborne and choose online play. The shadNet server console should show
your NP ID authenticating rather than Login failed.
- Set the same matchmaking password in Bloodborne on all players. This is strongly recommended for testing with a specific friend.
- Make sure all players are in compatible, normally co-op-enabled areas.
- The world host rings the Beckoning Bell.
- The guest rings the Small Resonant Bell.
- Wait for Bloodborne to match and connect the peers.
In traditional mode, a greyed bell or crossed-out bell icon means Bloodborne considers the current state or area ineligible. The Sinister Resonant Bell also keeps the game's normal invasion rules.
In seamless mode, the host and guest may begin on different maps. Ring the host's Beckoning Bell first, then the guest's Small Resonant Bell. Leave both bells active while the server prepares the guest's destination and completes the normal matchmaking flow. If the host travels before discovery, wait for the host to finish loading before the guest rings. Established-session lantern travel is not yet supported.
- Confirm all PCs appear in
tailscale statusand cantailscale pingone another. - Confirm shadNet reports listeners on
0.0.0.0:31313, UDP0.0.0.0:31314, and0.0.0.0:31315. A127.0.0.1listener is not reachable by friends. - Allow shadNet through the server firewall: TCP
31313, UDP31314, and TCP31315on the Tailscale/private network. - Allow shadPS4 through each player's firewall. Its P2P UDP port is assigned at
runtime unless
SHADPS4_P2P_PORTis explicitly set.
- Use a unique account that exists in this server's database.
- Check NP ID spelling and password capitalization.
- Confirm the shadPS4 and shadNet builds use the same protocol version.
- Ask the owner whether the server database was moved or replaced.
- Recheck the underscore in
host_overrides.jsonand validate the JSON. - Confirm
/statusworks from every player's PC. - Restart shadPS4 after editing the override file.
- Confirm all players use the same game version, matchmaking password, and a normally eligible in-game area.
- Look for
loaded 2 host override entriesin the shadPS4 log.
End users should use a paired release build when one is available. Developers can clone this fork with its submodules:
git clone --recursive https://github.com/Wozzardman/shadp2p.git
cd shadp2pThen follow the platform build guide:
The shadps4 executable built by this repository is the emulator core and may
identify itself as a CLI application. Use the compatible QtLauncher for the GUI
and network/user settings.
The Bloodborne P2P and seamless work is experimental. Keep backups of saves and
expect incomplete emulator or network behavior. Reverse-engineering notes live
in documents/bloodborne-seamless-re.md.
This fork is based on the shadPS4 emulator and remains licensed under GPL-2.0-or-later. Bloodborne is owned by its respective rights holders.
Note
This README was generated by ChatGPT and reviewed against the configuration and networking code in this repository.