REPO Steam P2P
Replaces R.E.P.O.'s Photon cloud with direct Steam P2P. Host runs a built-in virtual server; connection ladder: Steam P2P -> ZeroTier -> Steam relay. Native proximity voice, stable lobbies, no port forwarding.REPO Steam P2P
Replaces R.E.P.O.'s Photon cloud networking with direct peer-to-peer over Steam, with a built-in virtual Photon server on the host. No port forwarding, no Photon cloud, native proximity voice.
How it works
-
The host runs a built-in virtual LoadBalancing/Game/Voice server in-process (no external server, no Photon cloud).
-
The client finds the host automatically and connects through a fallback ladder:
- Steam P2P (LAN direct) — same-network host discovered automatically (~1–5 ms).
- ZeroTier — if the host publishes a ZeroTier IP in the Steam lobby and the tunnel answers a probe.
- Steam relay — Steam SDR as the last resort (pure-internet play).
-
Photon datagrams are carried over Steamworks SDR / plain UDP by a custom transport (ENET v16-compatible), including voice frames.
Features
- Native proximity voice — speakers are linked to avatars: 3D positional audio, mouth animation, works like the vanilla game.
- Stable sessions — ping keep-alive, reliable-command retransmission, ghost-session eviction only for actually dead peers, single-voice-client enforcement.
- First-join fix — the lobby scene, room geometry and voice objects are properly replayed from the room cache when you join.
- ForceVoiceTransmit config (default off) — optional open-microphone override that ignores mute/PTT state.
Installation
Mod manager (recommended)
Install with Thunderstore Mod Manager or r2modman — the BepInEx dependency is pulled automatically.
Manual
- Install BepInExPack into the game folder.
- Drop
BepInEx/plugins/RepoSteamTransport.dllintoBepInEx/plugins/. - Run the game.
Both players need the mod. The host creates the lobby through Steam as usual; clients join through Steam as usual.
Configuration
BepInEx/config/local.repoversteam.transport.cfg
| Key | Default | Description |
|---|---|---|
Role |
Auto |
Auto resolves host/client from the Steam lobby. |
HostSteamId |
— | Client override: connect to this SteamId directly. |
HostAddress |
— | Client override: direct IP (skips the ladder, ladder step 0). |
ZeroTierAuto |
true |
Allow the ZeroTier fallback step (2/3). |
ForceVoiceTransmit |
false |
true = open microphone (always transmit, ignores mute/PTT). |
PhotonCompat |
true |
Serialization compatibility shim (keep on). |
Verbose |
false |
Detailed transport logging for diagnostics (very spammy). |
Troubleshooting
- Ping shows 130 → drops to 14 — that's Steam SDR route optimization in the first minute; normal.
- "Ladder 3/3" in the log — no LAN/ZeroTier path was available, so the Steam relay was used; everything still works.
- No voice — check the in-game mic is selected and not muted (Settings → Audio); make sure
ForceVoiceTransmitisfalseif you want the game's own Push to Talk to control transmission. - Diagnostics — set
Verbose = trueand re-run; the log will show the full ladder, session and voice-event trace.
Credits & Licenses
Parts of this mod are derived from and modified from
REPO-SelfHostedPhoton
(Copyright (c) 2025 zyxterus, MIT License). The original copyright notice and the full
MIT license text are included in THIRD-PARTY-NOTICES.md and
LICENSE-REPO-SelfHostedPhoton.txt in this package.
Changelog
1.4.0
- Protocol hardening: duplicate-fragment protection, delivery modes preserved (voice and positions no longer block RPCs), no per-event operation responses, outbound batching, bounded room cache with view-aware cleanup.
- Stability: reworked connect/disconnect state machine (background connect ladder, Steam calls on the main thread, peer-silence based disconnects, one-frame grace after long loading frames, immediate eviction of dead relay connections).
- Security: lobby-membership check for relay connections, host token handshake for direct UDP/LAN, ports only open while hosting, pre-auth session/byte limits, rate-limited logging.
- LoadBalancing semantics: join properties merged, nested actor properties in the join response, property echo and CAS, master-key write protection, room redirect/capacity rules, targeted voice routing.
- Field fixes: late-join state re-send targets only the joining player, microphone storm guard works in the default config, Photon debug logging only with Verbose = true.
- Config: PhotonCompat = false now forces V16 with a warning (it corrupted events before).
1.3.0
- Protocol hardening: per-channel reliable ordering, ENET fragment reassembly in both directions, capped retransmission with backoff, wrap-safe timers, bounded room cache.
- Non-blocking connect ladder: joining and reconnecting no longer freeze the game for seconds.
- Late-join state re-send: fixes clients stuck on the loading screen when joining an already-running session.
- Microphone error storm guard: a broken mic device no longer stalls the game (falls back to listen-only).
- New config keys: LobbyAuthCheck (lobby-membership check, fail-open) and full disable via Enabled = false.
- Quieter logging: Photon debug output only with Verbose = true
1.1.3
- Added third-party license notices (MIT) for REPO-SelfHostedPhoton:
THIRD-PARTY-NOTICES.md,LICENSE-REPO-SelfHostedPhoton.txt.
1.1.0
- Connection ladder: Steam P2P (LAN direct) → ZeroTier (with reachability probe) → Steam relay.
- Voice: native speaker linking, sender mapping fixes, duplicate-voice-client enforcement, listen-only clients supported.
- First-join lobby fix (scene/geometry/voice-object cache replay, AddToRoomCacheGlobal).
- Self-hosted Photon compatibility shim merged into the main plugin.
- Quiet release logging (
Verboseconfig flag).
1.0.0
- Initial working release: virtual server transport, native voice, stable sessions.
