- app.go: App struct with stub bindings (RunCheck/StartEngine/
StopEngine/GetStatus/Version) — emits check:result, check:done,
engine:status, stats:update events. Real backend lands in Phase 1.
- run.go: wails.Run() with frameless 480x640 fixed window, Classic
dark bg matching theme.
- embed.go: //go:embed all:frontend/dist for the Vite build output.
- frontend/: Vite + React project derived from `wails init -t react`.
Removed default template assets and wired Classic variant from
docs/design/v2/.
- components/Classic.jsx: variant 1 with custom title bar
(drag region, sun/moon theme toggle, min/close hooked to
Wails WindowMinimise/Quit).
- components/shared.jsx: useDrover hook adapted to call Wails
bindings and listen on backend events instead of mock SCENARIOS.
Added IconSun + IconMoon for the title-bar toggle.
- App.jsx: owns mode state, wraps setMode in
document.startViewTransition so the title-bar toggle gives a
circle-reveal sweep from the cursor.
- style.css: clean reset (overflow hidden, no scrollbars, brand
background) — replaces the wails-react-template defaults.
- wailsjs/go/gui/App.js: hand-written bindings since our App
struct lives in package gui rather than the standard top-level
main; `wails generate module` would have written package main
bindings here.
- build/: standard wails artifacts (icon, manifest); will be
consumed by `wails build` once we wire it through CI.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drover-Go
Discord proxy / DPI bypass tool. Routes Discord traffic through a SOCKS5 proxy via kernel-level packet capture (WinDivert), bypassing the limitations of in-app proxy settings and surviving Discord auto-updates.
What it solves
Discord doesn't support proxies for voice/video traffic. Existing DLL-injection tools (drover, discord-voice-proxy) modify Discord.exe, which:
- triggers antivirus heuristics (unsigned DLL injecting into a popular app),
- breaks every time Discord auto-updates,
- doesn't proxy
Update.exeitself, so the updater fails when Discord servers are blocked.
Drover-Go uses WinDivert — a Microsoft-signed kernel driver — to capture packets at the network stack level. No modification of Discord, works for any Discord variant (Stable/Canary/PTB/Vesktop), survives auto-updates, minimal AV detection.
Status
Pre-alpha. See implementation plan for details.
How it works
Discord.exe (unmodified)
↓ TCP/UDP
WinDivert.sys (kernel filter)
↓ matched packets
drover.exe (Go)
├── TCP redirect to local SOCKS5 listener → SOCKS5 CONNECT → upstream proxy
└── UDP encapsulation (RFC 1928) → SOCKS5 UDP ASSOCIATE → upstream proxy
For UDP voice that's blocked even via SOCKS5 (DPI on the proxy's TCP control channel), drover-go injects a fake QUIC initial packet (à la zapret-discord-youtube) before forwarding — DPI sees "QUIC to Google" instead of Discord media.
Requirements
- Windows 10 1903+ or Windows 11 (x64). ARM64 not supported by WinDivert.
- Administrator privileges for first run (driver install).
- Upstream SOCKS5 proxy with UDP ASSOCIATE support (e.g.
mihomo,sing-box).
Install
Download the latest release from releases:
drover-vX.Y.Z-setup.exe— installer with Start Menu shortcut, registers in Apps & Features for clean uninstall.drover-vX.Y.Z-windows-amd64.zip— portable, just unzip and run.
Verify SHA256 against SHA256SUMS.txt in the same release.
License
MIT for our code. WinDivert (embedded) is LGPL-3.0.
Acknowledgements
- imgk/divert-go — Go bindings for WinDivert
- imgk/shadow — transparent proxy reference architecture
- runetfreedom/force-proxy — SOCKS5 UDP ASSOCIATE flow reference
- Flowseal/zapret-discord-youtube — fake QUIC payload
- basil00/WinDivert — kernel packet capture driver