Skip to main content

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.

qWDTT consists of a Kotlin/Compose Android app and a Go native library (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

1

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.
2

Go 1.26+

Install Go. The module requires Go 1.26.0 or newer (see go.mod). Verify with go version.
3

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).
4

Clone the repository

git clone https://github.com/SpaceNeuroX/proxy-turn-vk-android.git
cd proxy-turn-vk-android

Repository Structure

app/           Kotlin + Compose Android app (VPN service, WebView, UI)
go_client/     Go native client → compiled to libclient.so via CGO
server.go      Server binary source (compatible with wdtt-server protocol)
scripts/       Build helpers for cross-compiling Go to Android ABIs

Building the Android App

Build all architectures

The build-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.
export ANDROID_NDK_HOME=/path/to/android-ndk
./scripts/build-native-libs.sh
./gradlew :app:assembleDebug

Build a single ABI

Pass the ABI name as the first argument to build-go-lib.sh:
./scripts/build-go-lib.sh arm64-v8a
Supported ABI values: 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.
The compiled library is written to app/src/main/jniLibs/<ABI>/libclient.so. Gradle picks it up automatically on the next build.

Build a release APK

./gradlew :app:assembleRelease
A release build requires a signing configuration. Add your keystore details to 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 from server.go in the repository root using the standard Go toolchain. No CGO or NDK is required.
go build -o wdtt-server server.go
The resulting wdtt-server binary must be run as root on your VPS. It listens on two UDP ports:
PortPurpose
0.0.0.0:56000 (DTLS)Client connections
0.0.0.0:56001 (WireGuard)Internal WireGuard endpoint

Server flags

FlagDefaultDescription
-dir/etc/wdttConfig directory (passwords, WireGuard keys)
-passMain connection password
-adminTelegram admin user ID
-botTelegram bot token
-dns8.8.8.8Upstream DNS for the server
-wg-port56001WireGuard listen port
-dtls-port56000DTLS listen port

Go Client CLI Flags

When the Go client is run as a standalone binary (rather than as libclient.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/.
FlagDefaultDescription
-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)
-n24Total worker count
-listen127.0.0.1:9000Local UDP listen address
-device-idunknownDevice UUID for server-side stream binding
-captcha-modeautoCaptcha mode: auto, wv, or rjs
-vk-authanonymousVK auth mode: anonymous or account
-vk-anon-pathvkcallsAnonymous API path: vkcalls or legacy
-vk-creds-file(empty)Path to a file containing TURN credentials for VK account mode
-go-dnsyandexDNS preset, custom:IP,..., or doh:URL
-obfsaudioObfuscation mode: audio (OPUS-like RTP) or video (H.264-like RTP)
-modevpnClient mode: vpn (WireGuard via UDP) or socks (userspace WireGuard + SOCKS5)
-socks127.0.0.1:1080SOCKS5 listen address (only used when -mode socks)
-ping-onlyfalseMeasure RTT to the server and exit
-check-hashesfalseValidate VK call hashes and exit without connecting

Build docs developers (and LLMs) love