R.E.P.O.
Install with App

Details

Latest version
1.4.0
Last Updated
First Uploaded
Downloads
1.5K
Likes
1
Size
103KB
Dependants
Edited · Nov 10, 2026

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:

    1. Steam P2P (LAN direct) — same-network host discovered automatically (~1–5 ms).
    2. ZeroTier — if the host publishes a ZeroTier IP in the Steam lobby and the tunnel answers a probe.
    3. 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

  1. Install BepInExPack into the game folder.
  2. Drop BepInEx/plugins/RepoSteamTransport.dll into BepInEx/plugins/.
  3. 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 ForceVoiceTransmit is false if you want the game's own Push to Talk to control transmission.
  • Diagnostics — set Verbose = true and 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 (Verbose config flag).

1.0.0

  • Initial working release: virtual server transport, native voice, stable sessions.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.