Per-process proxy + voice-bypass for Discord. No drivers, no global VPN.
reDrover forces the Discord desktop client to send its TCP traffic through a user-specified HTTP or SOCKS5 proxy and applies optional mangling to outgoing UDP packets to bypass local voice-chat blocks. It runs entirely at the user-process level — no kernel driver, no system-wide VPN, no admin rights.
The Windows component is a version.dll next to Discord.exe (DLL hijack +
WinSock detours via MinHook). The Linux / macOS component is a small
shared library used via LD_PRELOAD / DYLD_INSERT_LIBRARIES.
This is a from-scratch reimplementation of hdrover/discord-drover in
Rust + iced (installer GUI) and C++20 (native shim). It is
designed around the brainstorm in docs/ISSUE-65-IDEAS.md
so that the ideas in upstream issue hdrover/discord-drover#65 can be
implemented incrementally.
- Features
- Quick start
- Configuration
- How it works
- Building from source
- Documentation
- Status
- Contributing
- License
- HTTP and SOCKS5 proxies for Discord's TCP (chat, REST, gateway, updater).
- HTTP Basic auth (RFC 7617).
- SOCKS5 username/password auth for UDP ASSOCIATE (RFC 1929).
- SOCKS5 UDP ASSOCIATE (RFC 1928 §7) — actual UDP-over-SOCKS5 relay, not just TCP.
- Pluggable voice-UDP strategies - the GUI exposes implemented
classic,split, andcustomvariants plusoffandforce_tcp_fallback. - Drop-in compatibility with
drover.inifrom the original Pascal project. - Self-propagation: when Discord auto-updates to a new
app-X.Y.Zfolder, the DLL re-installs itself. - Cross-platform native shim: same C++ core, Windows DLL or POSIX preload library.
- Iced GUI installer — pick a proxy, click Install, done.
- Live debug console on Windows via opt-in
AllocConsole. - Structured log file in the Discord folder for post-mortem troubleshooting.
- Download or build
reDrover.exeandversion.dll(see Building from source). - Drop both into the same folder (along with optional
drover.ini,drover-packet.bin, andstrategies/*.bin). - Close Discord.
- Run
reDrover.exe, fill in the proxy details, click Install. - Start Discord normally.
./scripts/build.sh
LD_PRELOAD=$PWD/build-output/libredrover_preload.so discordConfig lives in $XDG_CONFIG_HOME/redrover/drover.ini (default
~/.config/redrover/drover.ini).
./scripts/build.sh
DYLD_INSERT_LIBRARIES=$PWD/build-output/libredrover_preload.dylib \
DYLD_FORCE_FLAT_NAMESPACE=1 \
/Applications/Discord.app/Contents/MacOS/DiscordConfig lives in ~/Library/Application Support/redrover/drover.ini.
⚠️ macOS SIP may stripDYLD_*env vars for signed apps. Seedocs/PORTING.mdfor caveats.
drover.ini lives next to Discord.exe on Windows or in the platform
config dir on POSIX. Both the GUI installer and the native shim parse it.
[drover]
proxy = http://user:pass@127.0.0.1:1080 ; or socks5://… or empty for Direct
[udp]
strategy = classic ; off | classic | split | custom
prefix_delay_ms = 50
prefix_packets = 00, 01 ; hex bytes, each entry is one packet
split_first = 0 ; >1 splits the first 74-byte packet into N chunks
force_tcp_fallback = false ; intentionally break UDP so Discord falls back to TCP voice
[socks5]
udp_associate = false ; route voice UDP through SOCKS5 UDP ASSOCIATE
[logging]
level = info ; off | error | warn | info | debug | trace
file_enabled = true ; write the configured log file
file = drover.log
console = false ; Windows: AllocConsole + ANSI-color live tailSee docs/ROADMAP.md for how each knob maps to upstream
issue #65 ideas, and dist/drover.ini for the canonical
reference with comments.
┌──────────────────────┐
│ reDrover.exe (Rust) │
│ iced GUI installer │
└──────────┬───────────┘
│ writes
▼
┌──────────────────────┐
│ drover.ini │ ← single source of truth
└──────────┬───────────┘
│ read on every Discord launch
▼
┌──────────────────────────────┐ ┌──────────────┐
│ native shim (C++20) │ hooks WinSock → │ Discord.exe │
│ │ │ │
│ Windows: version.dll │ │ Chromium / │
│ (DLL hijack + MinHook) │ │ Electron │
│ POSIX: libredrover_* │ └──────────────┘
│ (LD_PRELOAD / DYLD_ │
│ INSERT_LIBRARIES) │
└──────────────────────────────┘
The Windows version is loaded because Discord links version.dll
implicitly via the file-version-info API family. Our DLL is mounted
next to Discord.exe; Windows' loader prefers same-folder DLLs and
calls our DllMain before any of Discord's code runs. We then forward
the 17 standard version.dll exports back to api-ms-win-core-version-l1-1-0
via PE export forwarders (no asm trampolines, works on x86 and x64).
For details see docs/ARCHITECTURE.md.
One-liner (Windows):
scripts\build.ps1One-liner (Linux / macOS):
./scripts/build.shBoth scripts produce a ready-to-ship build-output/ directory.
Tagged GitHub releases contain archives only: Windows x64, Linux x64,
Linux ARM64, and macOS ARM64 packages. The Actions Release workflow
can also be run manually with a tag matching the version in Cargo.toml.
| Platform | Toolchain |
|---|---|
| Windows | Visual Studio 2022 with C++ x86/x64 build tools, CMake 3.20+, Rust stable |
| Linux | clang 17+ or gcc 13+, CMake 3.20+, Rust stable |
| macOS | Xcode 15+ (Apple clang), CMake 3.20+, Rust stable |
gcc 11/12 doesn't have std::format. Upgrade to gcc-13 or switch to clang.
See docs/BUILDING.md for flags, troubleshooting, and CI.
| Document | What |
|---|---|
docs/ARCHITECTURE.md |
Module map, threading, data flow, design decisions |
docs/PORTING.md |
Cross-platform layout, how to run on Linux/macOS |
docs/BUILDING.md |
Build scripts, flags, compiler matrix |
docs/ROADMAP.md |
Mapping from upstream issue #65 ideas to source files |
AGENTS.md |
Briefing for AI agents and new contributors |
CONTRIBUTING.md |
How to add a feature, code style, PR process |
The project is functional but young. Known working:
- HTTP proxy with and without Basic auth (TCP).
- SOCKS5 TCP proxy via HTTP-CONNECT to SOCKS5 translation (NO_AUTH method).
- SOCKS5 UDP ASSOCIATE with and without user/pass auth.
- All
classic/custom/split/uae_*UDP strategies for voice bypass. - SOCKS5 UDP ASSOCIATE — sync receive path (most TCP responses, some UDP setups).
- Cross-platform compile on Windows / Linux / macOS.
Known gaps (with workarounds):
- Async
WSARecvFrom(Chromium's IOCP path) is not yet intercepted, so SOCKS5 UDP voice may not work end-to-end on Windows. Tracked indocs/ROADMAP.md. - The Iced GUI's Discord-folder discovery is Windows-only; on POSIX you launch via
LD_PRELOADmanually. - No code-signing for distributed binaries.
PRs welcome. The repo is set up so that most new features are a single
file change in dll/src/ (cross-platform core) plus a single field in
crates/redrover-config/src/. See CONTRIBUTING.md
for the checklist and code style.
MIT. Acknowledgements to:
- hdrover/discord-drover for the original concept and the wire-level decisions we kept compatible with.
- TsudaKageyu/minhook for the hooking primitives.
- iced-rs/iced for the GUI framework.