qWDTT consists of a Kotlin/Compose Android app and a Go native library (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/SpaceNeuroX/proxy-turn-vk-android/llms.txt
Use this file to discover all available pages before exploring further.
libclient.so). The Go library is compiled with CGO against the Android NDK and placed in app/src/main/jniLibs/<ABI>/ before Gradle builds the APK.
Prerequisites
Android SDK with NDK
Install the Android SDK. Install the NDK via Android Studio (SDK Manager → SDK Tools → NDK (Side by side)) or download it directly. NDK r25c or newer is recommended. Set the
ANDROID_NDK_HOME environment variable to the NDK root directory, or let the build script discover it from local.properties or ANDROID_SDK_ROOT.Android Studio or Gradle 9.x
Android Studio is recommended for IDE support. The project uses the Android Gradle Plugin 9.0.1 and Kotlin Compose plugin 2.1.20 (declared in the root
build.gradle.kts). Gradle 9.x is required (the wrapper uses Gradle 9.1.0).Repository Structure
Building the Android App
Build all architectures
Thebuild-native-libs.sh script iterates over arm64-v8a, armeabi-v7a, and x86_64, calling build-go-lib.sh for each. After all native libraries are compiled, Gradle assembles the APK.
Build a single ABI
Pass the ABI name as the first argument tobuild-go-lib.sh:
arm64-v8a, armeabi-v7a, x86_64.
On Go 1.23 and newer, the build script automatically adds
-ldflags=-checklinkname=0 to suppress linkname compatibility warnings introduced in that Go version. No manual flag management is needed.app/src/main/jniLibs/<ABI>/libclient.so. Gradle picks it up automatically on the next build.
Build a release APK
app/build.gradle.kts or supply them via environment variables / Gradle properties. Refer to the Android documentation on app signing for the full setup.
Building the Server
The server binary is compiled fromserver.go in the repository root using the standard Go toolchain. No CGO or NDK is required.
wdtt-server binary must be run as root on your VPS. It listens on two UDP ports:
| Port | Purpose |
|---|---|
0.0.0.0:56000 (DTLS) | Client connections |
0.0.0.0:56001 (WireGuard) | Internal WireGuard endpoint |
Server flags
| Flag | Default | Description |
|---|---|---|
-dir | /etc/wdtt | Config directory (passwords, WireGuard keys) |
-pass | — | Main connection password |
-admin | — | Telegram admin user ID |
-bot | — | Telegram bot token |
-dns | 8.8.8.8 | Upstream DNS for the server |
-wg-port | 56001 | WireGuard listen port |
-dtls-port | 56000 | DTLS listen port |
Go Client CLI Flags
When the Go client is run as a standalone binary (rather than aslibclient.so inside the Android app), the following flags are available. These are primarily useful for testing, server-side debugging, or running qWDTT without Android.
In the Android app, the Go client is loaded as a native shared library (
libclient.so). The CLI flags documented below apply only when running the standalone Go binary built directly from go_client/.| Flag | Default | Description |
|---|---|---|
-peer | (required) | Server IP:DTLS_port (e.g. 203.0.113.10:56000) |
-turn | (empty) | Override the TURN server IP address |
-port | (empty) | Override the TURN server port |
-vk | (required) | VK call hash(es), comma-separated |
-password | (required) | Connection password (used to derive the WRAP key via HKDF) |
-n | 24 | Total worker count |
-listen | 127.0.0.1:9000 | Local UDP listen address |
-device-id | unknown | Device UUID for server-side stream binding |
-captcha-mode | auto | Captcha mode: auto, wv, or rjs |
-vk-auth | anonymous | VK auth mode: anonymous or account |
-vk-anon-path | vkcalls | Anonymous API path: vkcalls or legacy |
-vk-creds-file | (empty) | Path to a file containing TURN credentials for VK account mode |
-go-dns | yandex | DNS preset, custom:IP,..., or doh:URL |
-obfs | audio | Obfuscation mode: audio (OPUS-like RTP) or video (H.264-like RTP) |
-mode | vpn | Client mode: vpn (WireGuard via UDP) or socks (userspace WireGuard + SOCKS5) |
-socks | 127.0.0.1:1080 | SOCKS5 listen address (only used when -mode socks) |
-ping-only | false | Measure RTT to the server and exit |
-check-hashes | false | Validate VK call hashes and exit without connecting |