If a node uses REALITY or xtls-rprx-vision, choose an Xray core that supports it. For VMess, standard VLESS, and TLS, check compatibility against the transport and specific configuration fields. This guide is for users choosing an Android client, switching desktop cores, or troubleshooting subscription imports. It covers the settings to check beyond the protocol name and how to tell a configuration issue from a network problem.
Project Background and Client Roles
Xray-core and the v2ray-core maintained by V2Fly share a common project history, but have since followed different development paths. Project V provides context for this proxy ecosystem. V2Fly maintains the community continuation of v2ray-core, while Xray has developed independently. Both are core programs that handle proxy connections, routing, and DNS—not client interfaces.
Clients manage subscriptions, let you edit nodes, start the core, and display logs. The core reads the final configuration and handles connections. So being able to import a node in the interface does not mean the core can run it. A subscription parser may recognize certain fields without passing them to the active core for processing.
- v2rayNG: An Android client that uses the Xray core. A good fit for REALITY, XTLS Vision, or existing Xray configurations.
- v2flyNG: An Android client that uses the V2Fly core. A good fit for standard V2Fly configurations when Xray-specific features aren't needed.
- v2rayN: A desktop client. Its capabilities depend on the selected core and version, so don't infer protocol support from the client name alone.
When troubleshooting, note both the client version and the core version currently running. Updating the interface does not necessarily update the core files, and replacing the core does not mean the client's editor can generate every new field.
Protocol Support: XTLS and REALITY
REALITY and XTLS Vision are not synonyms for VMess or VLESS. VLESS is a proxy protocol; REALITY belongs to the transport security configuration layer; Vision is a flow control mode used with specific connection setups. If a subscription lists VLESS, REALITY, and Vision together, check each configuration layer—not just whether VLESS is supported.
| Feature or combination | Xray core | V2Fly core | What to check |
|---|---|---|---|
| VMess | Supported | Supported | Authentication method, transport, and TLS settings |
| Standard VLESS | Supported | Supported | Does not imply Vision support |
| WebSocket + TLS | Common combinations supported | Common combinations supported | Path, Host, SNI, and certificates |
| REALITY | Supported | Does not support Xray's REALITY configuration | Server public key details, shortId, and serverName |
| xtls-rprx-vision | Supported for compatible combinations | Flow control not supported | Flow control value and transport/security layer combination |
| Complete JSON configuration | Parsed using Xray configuration syntax | Parsed using the corresponding V2Fly configuration format | The entire file is not guaranteed to be interchangeable |
Here, XTLS primarily refers to the commonly used Vision setup. Don't treat legacy flow control values such as xtls-rprx-direct from older guides as migrated simply by replacing them with xtls-rprx-vision. The server must also use a compatible combination; changing flow control on the client alone can cause the handshake to fail.
Bottom Line: Check the Security Layer and Flow Control First
If the node editor shows security=reality or flow=xtls-rprx-vision, start with the Xray core and then verify the transport settings. Don't remove these fields just to make the node work with V2Fly.
How REALITY and Vision Work in a Connection
During the handshake, REALITY lets the client verify key material held by the server and uses target-related settings to shape the TLS handshake. It does not route all proxy traffic through the target website or remove authentication. The server still needs correctly configured keys, a target, and allowed names, and the client must use matching settings.
Vision primarily handles how TLS traffic is identified and forwarded through the proxy tunnel, reducing redundant wrapping and processing overhead when conditions allow. It does not mean every connection skips encryption, nor can it eliminate physical link congestion, cross-region latency, or packet loss on the network. Any improvement in page load speed depends on the actual workload.
VLESS + REALITY + Vision
- Proxy protocol
- VLESS
- Transport
- TCP-based transport; confirm the name for your configuration version
- Security layer
- REALITY
- Flow control
xtls-rprx-vision- Authentication details
- User ID, public key details, shortId, and more
Enter the full parameter set provided by the server. Don't treat REALITY settings as ordinary TLS certificate options.
VMess + WebSocket + TLS
- Proxy protocol
- VMess
- Transport
- WebSocket
- Security layer
- TLS
- Path example
/ws; must match the server- Name settings
- Check the WebSocket Host and TLS SNI separately
Both cores have common implementations. The example path is not a universal default; use the value in the node configuration.
Configuration Compatibility and Field Migration
The traditional JSON configurations used by both cores share many structures, such as inbounds, outbounds, and routing. But fields that look alike may have different accepted values, defaults, or subfields. V2Fly also has multiple configuration formats, so identify the format your file uses before migrating it.
This example uses a common rule in traditional JSON routing to send private addresses through the direct outbound. It shows only the routing section, not a complete, runnable configuration. The actual file must include an outbound tagged direct and the data files required by the rule.
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
- Migrate outbounds first: Check the protocol, user authentication, transport, security layer, and flow control one by one. An outbound using REALITY cannot be handed to V2Fly unchanged.
- Then migrate routing: Keep the rule order and confirm that every
outboundTagpoints to an outbound with the same name. A tag is only a reference; it doesn't create direct or proxy capabilities. - Finish with DNS: Check resolution policies, domain rules, and data file paths. Don't assume DNS option names in the client interface are core JSON fields.
- Distinguish subscriptions from full configurations: A node sharing link usually carries only the information needed for a single outbound. It does not include local inbound, DNS, routing, or logging settings.
Also distinguish a configuration loading successfully from its settings actually taking effect. Unknown fields may trigger an error or be ignored. A running process alone doesn't prove the migration worked—check the logs, active outbound, and connection results in the target app. For details on related fields, refer to the protocol configuration guide.
Port Checks and Troubleshooting Order
When a connection fails, check the local connection separately from the remote handshake. The ports below illustrate what to check; they are not defaults for every client. Use the current inbound configuration and node port, and don't change a working listener just to match a tutorial.
- Check that the app is routed through the client. If the local SOCKS inbound listens on
127.0.0.1:10808, the app must use the matching address, port, and proxy type. The system proxy setting does not guarantee that every app will follow it. - Check that the core loads correctly. If it exits immediately, reports an unrecognized field, or doesn't support the flow control mode, check the core selection and configuration format first—not DNS.
- Check remote reachability. If the local inbound works but the remote connection times out, check the node address, actual server port, network path, and server status. A reachable port does not guarantee successful authentication.
- Check the handshake settings. For REALITY, verify the public key details, shortId, serverName, and time settings. For standard TLS, check the SNI, certificate validity period, and trust chain. Don't hide errors by disabling certificate verification.
- Check routing and DNS resolution. If only some domains fail, inspect their DNS results and which outbound they match. Change one set of settings at a time during testing, and keep the original configuration so you can restore it.
Troubleshooting: Start the Core, Check the Handshake, Then Check Routing
First test the basic connection with a node whose settings are known and complete, then restore custom routing and DNS. This helps distinguish unsupported core features from authentication errors and routing issues, without changing so many settings at once that the cause gets lost.
Choosing a Client and Migrating Subscriptions
On Android, use v2rayNG if your nodes use REALITY or Vision. For standard VMess or VLESS nodes whose server documentation specifies V2Fly configuration, v2flyNG may be a better fit. On desktop, before choosing a core in v2rayN, check which features the node requires. The client name alone cannot tell you whether it's compatible.
When migrating a subscription, create a new group and keep the old one as a fallback. Import one node and verify its settings before updating the rest, then migrate routing. Subscription updates may overwrite manually edited node fields. If flow control or a security layer is missing after import, check the subscription format and the client's parsing support instead of repeatedly entering the settings by hand.
If the same VMess node works in two clients, does that mean the configurations are fully interchangeable?
It only shows that both clients can handle the protocol and transport combination used by that node. DNS, routing, inbound listeners, and the security layers used by other nodes may still differ. Even after exporting the full JSON, check each setting; a working single node does not prove that the entire configuration is compatible.
Can I keep using the original node if I remove flow or change REALITY to TLS?
Usually not. The client and server must use a compatible protocol combination. Removing a setting won't make the server switch modes automatically. The server must provide a separate working configuration, or you need to use a core that supports the original combination.
If a subscription imports successfully but every connection fails, should I switch cores first?
Check the logs and test one node first. If the logs point to an unsupported protocol, flow control mode, or security layer, then check the core selection. For timeouts, authentication failures, or certificate errors, check the network, account settings, or name configuration respectively. See the subscription import guide for the import process.