This project is intended solely for technical research and code learning purposes and does not provide any form of network proxy service. Please do not use this project for any activity that violates local laws and regulations, and do not use it in production environments. Users are fully responsible for any risks that may arise from using this project. If you download or reference this project, please delete all related content within 24 hours and avoid long-term storage, distribution, or dissemination of any part of it. The author reserves the right to modify, update, or remove any part of this project or its contents at any time without prior notice.
🛑 Note: The Google Play build has been controlled by a third party since May 2024 and is closed-source. Please don't install it.
Grab the latest signed APK from the Releases page.
SOCKS 4/4a/5 · HTTP(S) · SSH · Shadowsocks · ShadowsocksR · VMess · VLESS · Trojan
AnyTLS · ShadowTLS · Snell 1–5 · VLESS-XHTTP · VLESS-Reality
XHTTP / Reality config examples are below.
TUIC 5 · Juicity · Hysteria 2
The Hysteria 2 client supports Salamander and Gecko obfuscation.
WireGuard · AmneziaWG
NaïveProxy(Bundled)Mieru(Bundled)
🕰️ Legacy protocols (kept for compatibility)
Hysteria 1- native over UDP; an external sidecar covers the rare faketcp transport
XHTTP - TLS configuration example
{
"no_grpc_header": false, // stream-up/one
"x_padding_bytes": "100-10000",
"sc_max_each_post_bytes": 1000000, // packet-up only
"sc_min_posts_interval_ms": 30, // packet-up only
"xmux": {
"max_concurrency": "16-32",
"max_connections": "0-0",
"c_max_reuse_times": "0-0",
"h_max_request_times": "600-900",
"h_max_reusable_secs": "1800-3000",
"h_keep_alive_period": 0
},
"x_padding_obfs_mode": false,
"x_padding_key": "",
"x_padding_header": "",
"x_padding_placement": "",
"x_padding_method": "",
"uplink_http_method": "",
"session_placement": "",
"session_key": "",
"seq_placement": "",
"seq_key": "",
"uplink_data_placement": "",
"uplink_data_key": "",
"uplink_chunk_size": 0,
"download": {
"mode": "auto",
"host": "b.yourdomain.com",
"path": "/xhttp",
"no_grpc_header": false, // stream-up/one
"x_padding_bytes": "100-10000",
"sc_max_each_post_bytes": 1000000, // packet-up only
"sc_min_posts_interval_ms": 30, // packet-up only
"xmux": {
"max_concurrency": "16-32",
"max_connections": "0-0",
"c_max_reuse_times": "0-0",
"h_max_request_times": "600-900",
"h_max_reusable_secs": "1800-3000",
"h_keep_alive_period": 0
},
"x_padding_obfs_mode": false,
"x_padding_key": "",
"x_padding_header": "",
"x_padding_placement": "",
"x_padding_method": "",
"uplink_http_method": "",
"session_placement": "",
"session_key": "",
"seq_placement": "",
"seq_key": "",
"uplink_data_placement": "",
"uplink_data_key": "",
"uplink_chunk_size": 0,
"server": "$(ip_or_domain_of_your_cdn)",
"server_port": 443,
"tls": {
"enabled": true,
"server_name": "b.yourdomain.com",
"alpn": "h2",
"utls": {
"enabled": true,
"fingerprint": "chrome"
}
}
}
}
XHTTP - Reality configuration example
{
"no_grpc_header": false, // stream-up/one
"x_padding_bytes": "100-10000",
"sc_max_each_post_bytes": 1000000, // packet-up only
"sc_min_posts_interval_ms": 30, // packet-up only
"xmux": {
"max_concurrency": "16-32",
"max_connections": "0-0",
"c_max_reuse_times": "0-0",
"h_max_request_times": "600-900",
"h_max_reusable_secs": "1800-3000",
"h_keep_alive_period": 0
},
"x_padding_obfs_mode": false,
"x_padding_key": "",
"x_padding_header": "",
"x_padding_placement": "",
"x_padding_method": "",
"uplink_http_method": "",
"session_placement": "",
"session_key": "",
"seq_placement": "",
"seq_key": "",
"uplink_data_placement": "",
"uplink_data_key": "",
"uplink_chunk_size": 0,
"download": {
"mode": "auto",
"host": "example.com",
"path": "/xhttp",
"no_grpc_header": false, // stream-up/one
"x_padding_bytes": "100-10000",
"sc_max_each_post_bytes": 1000000, // packet-up only
"sc_min_posts_interval_ms": 30, // packet-up only
"xmux": {
"max_concurrency": "16-32",
"max_connections": "0-0",
"c_max_reuse_times": "0-0",
"h_max_request_times": "600-900",
"h_max_reusable_secs": "1800-3000",
"h_keep_alive_period": 0
},
"x_padding_obfs_mode": false,
"x_padding_key": "",
"x_padding_header": "",
"x_padding_placement": "",
"x_padding_method": "",
"uplink_http_method": "",
"session_placement": "",
"session_key": "",
"seq_placement": "",
"seq_key": "",
"uplink_data_placement": "",
"uplink_data_key": "",
"uplink_chunk_size": 0,
"server": "$(ip_or_domain_of_your_cdn)",
"server_port": 443,
"tls": {
"enabled": true,
"server_name": "example.com",
"reality": {
"enabled": true,
"public_key": "$(your_publicKey)",
"short_id": "$(your_shortId)"
},
"utls": {
"enabled": true,
"fingerprint": "chrome"
}
}
}
}
Imports the common formats: Shadowsocks, ClashMeta, v2rayN, and sing-box outbounds. Only nodes are parsed; routing rules and other non-node fields are ignored.
The app reads these keys from response headers or from #key: value lines at the top of the body. Headers win, and a fetch that omits a key clears it.
| Key | Effect |
|---|---|
profile-title |
Group name (plain or base64: prefixed) |
subscription-userinfo |
Traffic and expire= shown on the group; a reminder is posted daily during the last three days and once after expiry |
support-url, profile-web-page-url |
Menu entries on the group (http and https links only) |
announce |
Text shown on the group, up to 200 characters, plain or base64: prefixed |
profile-update-interval |
Auto-update interval in hours, applied when the provider changes it; your own edits stay in between |
routing |
An sn://routing/ link, see below; the subscription stores it and refreshes only the profile it delivered, never activates it and never touches your own profiles |
sn://routing/<base64> carries an exported routing profile (Route → Routing profiles → Export to clipboard). Opening the link, pasting it into Routing profiles → Import from Clipboard, or delivering it through the routing subscription key imports the profile. A profile with the same name is replaced; the active profile is applied live when refreshed.
Core:
Android GUI:
Web Dashboard: