For desktop, start with v2rayN. On Android, v2rayNG is usually the better first choice when the setup uses the Xray core; choose v2flyNG when existing nodes specifically depend on v2fly behavior. This guide is for first-time installs, subscription migrations, and client compatibility checks. By the end, you can choose based on platform, protocol, routing needs, and maintenance.
Filter by platform first—not by feature count
The biggest difference between these clients is not the number of buttons; it is where they run. v2rayN targets Windows, macOS, and Linux desktops, with system proxy control, multiple subscription groups, and a fairly complete routing editor. v2rayNG and v2flyNG target Android, with workflows built around mobile network changes, background connections, and per-app routing. Desktop and Android are not mutually exclusive choices: a common setup is v2rayN on a computer and either v2rayNG or v2flyNG on a phone.
This comparison uses an interface baseline compiled on May 28, 2026: v2rayN 7.15.4, v2rayNG 1.10.33, and v2flyNG 1.10.33. Later releases may change menu labels or bundled core versions, but minor updates are unlikely to overturn the platform focus, core family, or configuration model. If your interface differs slightly, look for the same setting by name instead of following button locations mechanically.
| Client | Primary platforms | Primary core family | Best suited for |
|---|---|---|---|
| v2rayN | Windows、macOS、Linux | Manageable cores such as Xray and v2fly | Desktop system proxy, TUN, advanced routing, and multiple subscriptions |
| v2rayNG | Android | Xray | VLESS, Reality, mobile networks, and per-app routing |
| v2flyNG | Android | v2fly | Existing VMess configurations and consistent v2fly behavior |
The core family determines protocol and configuration compatibility
The client interface imports, edits, and starts configurations; the core handles connections, transport, DNS, and routing rules. v2rayNG uses the Xray core, making it a good fit for nodes that use VLESS, Reality, XTLS Vision, and other Xray capabilities. v2flyNG uses the v2fly core and is better suited to environments that preserve v2fly configuration semantics, rely on existing VMess deployments, or explicitly specify v2fly behavior on the server.
v2rayN serves a different role: it is a desktop manager that can manage different cores within the available settings. After importing a share link, it generates a configuration based on the node type—but successful import does not guarantee core support. For example, if a subscription contains a VLESS Reality node, confirm that the selected core supports that configuration. Handing the same node to a core that does not recognize its fields commonly produces an unknown-setting error in the startup log or causes the core process to exit immediately.
v2rayN
RecommendedA complete desktop management experience for system proxy, TUN, subscription groups, and fine-grained routing—well suited as a primary computer client.
Best for: everyday use on Windows, macOS, and Linux
v2rayNG
Uses the Xray core, providing more direct support for VLESS, Reality, and Xray routing configurations.
Best for: new Android nodes and the Xray protocol ecosystem
v2flyNG
Uses the v2fly core. Its interface is close to v2rayNG, with an emphasis on preserving v2fly configuration behavior.
Best for: existing VMess configurations and v2fly environments on Android
Bottom line: match node requirements before comparing interface preferences
When a subscription mentions Xray, VLESS Reality, or Vision, choose v2rayNG on Android. Choose v2flyNG when the server configuration has long been maintained alongside the v2fly ecosystem. Do not overlook core differences just because the interfaces look similar.
How to identify core requirements from a subscription
- When a share link starts with
vless://and includessecurity=realityorflow=xtls-rprx-vision, use an Xray core first. - When a share link starts with
vmess://and uses TCP, WebSocket, or gRPC transport, all three clients can usually import it—but still verify TLS, the path, and the service name. - When a subscription provides native JSON, check whether
outbounds,streamSettings, and routing fields are supported by the target core. Do not rely on the file extension alone. - When the node provider specifies a core version, choose a client from that core family to avoid losing specialized fields during automatic configuration conversion.
Subscription management affects long-term maintenance
When there are only a few nodes, all three clients can import individual share links from the clipboard. Once you have dozens of nodes and need regular updates, subscription groups, update methods, and duplicate handling become the key differences. v2rayN offers more desktop space, making it easy to separate work, home, and test subscriptions into groups with independent update intervals and active configurations.
In v2rayN 7.15.4, open “Subscription groups” → “Subscription group settings” to add an address and assign an alias to each group. Then choose “Subscription groups” → “Update all subscriptions (without proxy)”. If the current network cannot reach the subscription address directly, start a working configuration first and update through the proxy. Afterward, do not check only the node count: spot-check the address, port, transport, and TLS fields for unexpected changes.
- First import: Create a dedicated subscription group first. Do not mix test links with long-term subscriptions.
- After updating: Record the node count before and after import. For example, if a sample subscription should contain 100 nodes but only 73 appear, check the logs for parsing errors.
- Configuration spot-check: Check one VMess node, one VLESS node, and one Reality-enabled node. Verify the server address, port, SNI, and transport type.
- Connection test: Test real latency first, then select a node and enable the system proxy. A “Test failed” result is not by itself a reason to delete the node; the server may simply ignore a particular probe method.
- Set an update schedule: Match the update frequency to the provider’s change rate. Daily updates make sense for frequently changing subscriptions; stable configurations do not need requests every few minutes.
The subscription entry points in v2rayNG and v2flyNG are both near “Subscription settings” in the side menu. Add an address, return to the main screen, and choose “Update subscription” from the top-right menu. Android may restrict background network activity, so use the update time and node count shown in the client as the source of truth. If an update times out, connect to a known working node first, then enable proxy-based updates in the subscription settings.
Comparing system proxy, TUN, and per-app routing
On desktop, v2rayN typically starts with system proxy mode. It writes a local HTTP or SOCKS listening address to the system proxy settings, allowing browsers and apps that honor those settings to send traffic through the client. The common local SOCKS port is 10808; the HTTP port may use a neighboring port depending on the version and configuration. Confirm the actual values under “Settings” → “Parameters settings” → “Basic settings” instead of hard-coding a port based on guesswork.
Some desktop programs ignore the system proxy or also need UDP traffic intercepted; that is when TUN becomes worth considering. TUN uses a virtual network interface to handle a broader range of traffic, but it is also more likely to conflict with enterprise network tools, virtual machine adapters, game accelerators, and local firewall rules. “Supports TUN” does not mean “TUN should always be enabled.” When system proxy covers everyday browsing, keeping the interception scope smaller makes troubleshooting easier.
| Capability | v2rayN | v2rayNG | v2flyNG |
|---|---|---|---|
| System proxy | Supported; suitable for regular desktop apps | Does not work through the desktop system proxy model | Does not work through the desktop system proxy model |
| TUN or virtual network interception | Supported; useful for apps that ignore proxy settings | Handled through the Android VPN service | Handled through the Android VPN service |
| Per-app routing | Usually relies on routing rules and process matching | Choose which apps to proxy or bypass | Choose which apps to proxy or bypass |
| Domain and IP routing | Well suited to editing multiple rule groups and rule sets | Supports mobile routing settings | Supports v2fly-family routing settings |
Choosing per-app routing in practice
- When you need to manage a browser, development tools, and command-line programs together on a computer, enable v2rayN’s system proxy, environment variables, and TUN progressively by scope.
- When only a few Android apps should use the proxy, “Settings” → “Per-app proxy” in v2rayNG or v2flyNG is more direct. You can choose to proxy only the selected apps.
- For routing by domain category, verify the GeoSite data and rule order. For routing by destination IP, also check whether the GeoIP data is out of date.
- Place custom rules where they can match with priority. If the final rule enables global proxying, direct-connection rules above it must match correctly before they can take effect.
Bottom line: broader interception means more troubleshooting variables
Start with the system proxy or the default mobile connection to verify the node, then enable TUN, per-app routing, and custom DNS step by step. Change only one setting at a time so you can distinguish node failures from routing mistakes and local network conflicts.
What to check when updating and migrating configurations
Updating a client is not just about getting a new interface. Core versions, routing data formats, subscription parsers, and system compatibility may change at the same time. Users who regularly adopt new protocols should check whether the client integrates compatible cores promptly. Those with stable VMess configurations should focus more on whether their settings migrate cleanly after an update. There is no need to chase the highest version number mechanically, but staying indefinitely on a release that cannot recognize current subscription fields is also a bad idea.
v2rayN has many configurable items, so before upgrading, record your subscription groups, active core, listening ports, system proxy mode, and custom routes. When switching between v2rayNG and v2flyNG on Android, do not assume every internal setting will transfer perfectly. The safest approach is to keep the original subscription address and any essential single-node share links, re-import them into the new client, and restore per-app proxying, routing mode, and DNS settings one by one.
Do the computer and phone need to use the same client?
No. You can use v2rayN on a computer and v2rayNG on Android. As long as both recognize the protocols and transport parameters in the same subscription, each device can maintain its own configuration.
Why does v2rayNG import successfully but still fail to connect?
Open the log from the top-right menu and first check the address, port, UUID, SNI, Reality public key, and short ID. Successful import only means the link format was parsed; it does not mean every field is correct.
What should I do if a subscription update times out?
Connect to a known working node first, then open “Subscription settings”, enable proxy-based updates, and try again. Also make sure the subscription address has no extra spaces and that system time synchronization is enabled.
Can v2rayNG and v2flyNG be installed at the same time?
Yes, you can keep both for comparison, but only one client can establish the Android VPN connection at a time. Disconnect the current client before starting the other one so a connection handoff is not mistaken for a node failure.
A website stopped opening after an upgrade. Should I roll back first?
First check under “Settings” whether the local port, DNS, routing mode, or active core changed, then test with a known working node. Restore a backed-up configuration only after confirming a persistent compatibility problem between the new version and your existing setup.
Minimum information to preserve during migration
- The subscription address and subscription group name, so you can distinguish different sources after migration.
- The protocol, server port, transport, and TLS or Reality parameters used by the current node.
- Local SOCKS and HTTP listening ports, especially if a browser or development tool has a manually configured proxy address.
- Routing mode, per-app proxy list, custom DNS, and local-network access permissions.
- The current client and core versions, so differences can be reproduced accurately if they appear.
Final choice: match the device and node type
If your main device is Windows, macOS, or Linux, choose v2rayN. It covers desktop system proxy, TUN, subscription groups, core management, and advanced routing, bringing most desktop needs into one interface. For a first setup, import the subscription, test latency on one node, and enable the system proxy. Configure TUN only when an app does not honor the system proxy.
If the device is Android and the subscription includes VLESS, Reality, Vision, or an explicit Xray requirement, choose v2rayNG. It maps more directly to the Xray ecosystem and works well for mobile per-app routing. For a first setup, follow “Subscription settings” → “Update subscription” → select a node → start the connection, then open “Settings” → “Per-app proxy” if needed.
If Android uses a long-standing VMess configuration and both the server and existing rules are maintained around the v2fly core, choose v2flyNG to preserve behavior within the same core family. Still verify the subscription fields before migrating: similar client names do not mean every Xray-specific configuration will run directly.
- Everyday desktop use: Choose v2rayN and start with the system proxy.
- New Android protocol nodes: Choose v2rayNG and verify the Xray and Reality parameters carefully.
- Existing v2fly setup on Android: Choose v2flyNG to keep server and client core semantics aligned.
- Cross-device use: Install v2rayN on the computer, then choose v2rayNG or v2flyNG on Android according to the node’s core. The client names do not need to match.