🌐 Available in
English
• فارسی
• 简体中文
• Русский
• Français
V2Ray Detection And Reconnaissance — pronounced like v2ray + radar.
A fast Rust CLI/TUI that fetches V2Ray / Clash / Mihomo subscription sources, validates them through your real network with sing-box, ranks the configs that actually work, and re-publishes the best ones at a local subscription URL your v2rayN / v2rayNG / sing-box / Clash Verge / Mihomo client can point to.
📘 Read the detailed developer guide
- Pulls subscriptions in parallel from any number of sources you list.
- Parses raw, base64, JSON, and YAML feeds — and
vmess,vless,trojan,ss,ssr,hysteria2,hy2,tuicshare-links. - Parses Clash/Mihomo YAML configs — add a Mihomo subscription URL and V2RayDAR extracts all proxy entries automatically.
- Bidirectional format conversion — converts between V2Ray share-links and Clash/Mihomo YAML proxy entries.
- Validates each candidate through your current network with
sing-box(it actually loads a test URL through the proxy). - Dual-format output — serves working configs as V2Ray share-links (
/subscription) and as full Mihomo YAML configs (/mihomo.yaml), so any client can use them. - Re-exposes the top working configs at a local URL so any compatible client just sees one always-fresh subscription.
- Survives restricted networks via previously-probed configs in the database, an in-network bridge config, or an
emergency_config. - Optional LAN sharing with optional token protection, so the phone in your pocket can use the same feed.
Copy the command for your OS into a terminal. The installer detects your platform, downloads the latest release with bundled sing-box, and sets everything up. Portable mode installs into Desktop/V2RayDAR when a Desktop folder exists, otherwise ~/V2RayDAR. User mode installs the binary to ~/.local/bin.
Portable (recommended) — everything in one folder, run with --portable:
# Linux
curl -fsSL https://raw.githubusercontent.com/411A/V2RayDAR/main/install.sh | sh
# macOS
curl -fsSL https://raw.githubusercontent.com/411A/V2RayDAR/main/install.sh | sh
# Windows
irm https://raw.githubusercontent.com/411A/V2RayDAR/main/install.ps1 | iexUser install — binary to ~/.local/bin, data in home:
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/411A/V2RayDAR/main/install.sh | sh -s -- --user
# Windows
irm https://raw.githubusercontent.com/411A/V2RayDAR/main/install.ps1 | iex
# Then choose option 2 when promptedAndroid / Termux:
# Install sing-box, then run the installer
pkg update -y && pkg install -y curl tar sing-box=1.13.13
curl -fsSL https://raw.githubusercontent.com/411A/V2RayDAR/main/install.sh | sh
# Always use --no-tui on Termux (TUI mouse input doesn't work in Termux terminals)
cd V2RayDAR && ./v2raydar --no-tuiManual download — grab the archive for your OS from Releases and run with --portable.
The installer verifies SHA-256 checksums, detects existing installations and offers to update (preserving configs.yaml, data.db, and v2raydar_data/), and never requires sudo by default.
After installing with the script above, run v2raydar (or v2raydar.exe on Windows). On first launch it creates a configs.yaml with a set of pre-selected subscription sources to get you started.
- Wait for it to populate. The app fetches your subscription sources in parallel, probes each config through your real network, and ranks the ones that work. The endpoint is live from the start — your client can point to it immediately.
- Point your client at the subscription URL:
| Client | Endpoint |
|---|---|
| v2rayN / v2rayNG | http://127.0.0.1:27141/subscription (base64) |
| sing-box | http://127.0.0.1:27141/subscription.txt (plain) |
| Clash Verge / Mihomo | http://127.0.0.1:27141/mihomo.yaml |
- TUI controls:
| Key | Action |
|---|---|
↑ / ↓ or j / k |
Navigate |
Enter |
Select / toggle / confirm |
Esc / Ctrl+H |
Go back |
Space |
Toggle subscription on/off |
e |
Edit selected subscription |
q |
Quit |
: |
Command mode — :q quit, :w save, :a add, :d delete, :n rename, :u URL, :p priority |
- Change settings from the TUI main menu (Configurations) or edit
configs.yamldirectly — changes take effect on the next refresh. Key settings:top_n,refresh_seconds,sharing.enabled,probe.mode. - Exit with
qor:q. The endpoint stops when the app exits.
v2raydar # TUI + local subscription endpoint
v2raydar --no-tui # headless — endpoint and logs only
v2raydar --once # refresh once, print results, exit
v2raydar --portable # keep all data next to the executable
v2raydar --uninstall # remove app data and owned firewall rulesWindows users replace v2raydar with v2raydar.exe. On macOS open the bundled .app once and Gatekeeper will remember it.
👣 configs.yaml — table of every key, default, and what it does. Full explanations live in the detailed guide.
| Key | Default | Purpose |
|---|---|---|
bind |
127.0.0.1:27141 |
Local HTTP bind address for /subscription, /subscription.txt, /results, and /health. |
top_n |
10 |
Number of working configs published to clients. |
refresh_seconds |
300 |
Auto-refresh interval in seconds; 0 disables the timer. |
encoded_subscription |
true |
Returns /subscription as base64 (v2rayN / v2rayNG friendly). |
prioritize_stability |
true |
Re-pings the previous run's saved top-N first and keeps them at the front, even if new low-ping configs appear. When false, prefers any working low-ping config. |
return_configs_asap |
false |
When true, publishes working configs to the endpoint and Current Found Configs as soon as they are found, up to top_n; early configs may not have the lowest ping or best stability. |
scan_all_configs |
false |
When true, validates every loaded config instead of stopping after enough have been confirmed. |
fetch_timeout_ms |
30000 |
Per-source fetch timeout. |
fetch_concurrency |
8 |
Subscription sources fetched in parallel. |
max_subscription_bytes |
33554432 |
Size cap per fetched subscription source (32 MiB). |
use_cache_only |
false |
When true, skip fresh fetches and load previously-probed configs from the database — useful on heavily restricted networks. |
emergency_config |
null |
Optional working share-link used through sing-box as a bridge when HTTP subscription fetches fail. |
clean_offlines_after_days |
7 |
Days after which unreachable configs are removed from the database. |
sharing.enabled |
false |
Lets LAN clients read the endpoints. |
sharing.require_token |
false |
Requires ?token=... for LAN requests. |
sharing.token |
null |
Leave empty, set true to auto-generate, or supply a string. |
probe.mode |
active |
active uses sing-box; tcp is diagnostic only. |
probe.sing_box_path |
null |
Optional path to sing-box. Leave null for desktop _with_singbox builds or Termux's package path. |
probe.connect_timeout_ms |
5000 |
TCP connect timeout for diagnostic probing. |
probe.active_timeout_ms |
30000 |
HTTP test timeout in active mode. |
probe.startup_timeout_ms |
5000 |
Wait time for the temporary proxy to come up. |
probe.concurrency |
16 |
Base active-probing concurrency. |
probe.batch_size |
20 |
Initial active-probing batch size. |
probe.process_concurrency |
null |
sing-box batch processes allowed at once; auto-scales when empty. |
probe.test_url |
https://www.gstatic.com/generate_204 |
URL loaded through each candidate. |
probe.accepted_statuses |
[204, 200] |
HTTP statuses counted as success. |
probe.download_url |
null |
Optional throughput-test target. |
probe.download_bytes_limit |
1048576 |
Upper bound for the optional download test. |
geoip_db_path |
null |
Optional path to a GeoLite2-Country.mmdb file. If null, uses the embedded database for country detection. |
subscriptions |
(pre-selected sources) | List of { name, url, enabled, priority } sources. Add your own for better results. |
- If you are on a very restricted network, previously-probed configs are stored in the database and can be used via
use_cache_only: true. - By default, if some HTTP subscription URLs don't connect on your network but one config is reachable, the app uses that config to retry those failed HTTP subscriptions too. And if there are no working configs on your network but you have one working config yourself, you can bring it into
configs.yaml'semergency_configso the app uses it to retry failed HTTP subscription fetches.
- v2rayN (same PC) — keep
bind: 127.0.0.1:27141and addhttp://127.0.0.1:27141/subscriptionas a subscription URL. - v2rayNG / phone on the same Wi-Fi — bind to the PC's LAN IP (e.g.
192.168.1.23:27141), turn onsharing.enabled, then usehttp://192.168.1.23:27141/subscriptionon the phone. Visit/healthfrom the phone first to confirm reachability.
Full client walkthroughs, token-protected sharing, and OS-specific firewall details are in the detailed guide.
Contributions are welcome! Feel free to open an Issue for bugs, feature requests, questions, or suggestions, or submit a Pull Request. Any feedback is greatly appreciated.
- Add a cross-platform GUI app beside the TUI using Tauri.
- Extract V2Ray configs from the body of any website — preferably from non-JS-heavy sites, with FireCrawl or Obscura as a fallback for the JS-heavy ones.
- Private endpoints with password requirements and authentication: when a subscription endpoint is private and password-protected, users can get their private endpoint that fetches the configs through a national reachable endpoint that has internet access.
The app is published as-is, without any warranty.
The developer will not, by itself, create or distribute V2Ray-compatible configs, and is not responsible for the V2Ray subscriptions the user scans and connects to. The owner of the V2Ray server you connect to may be able to intercept your traffic and read your unencrypted data.
If you find this project helpful, you can support its development through donations on the TON blockchain:
ton://transfer/TechKraken.ton
UQCGk4IU5nm6dYWjXTx6vSQVOtKO4LQg3m8cRcq1eQo7vhCl

