03 / PROJECT V · V2FLY · XRAY
The V2Ray Ecosystem: Where Clients and Cores Differ
Open source describes how code and licensing are made available; protocol support, configuration compatibility, and connection results each need to be checked separately.
“V2Ray client” is often used as a catch-all for this category of graphical tools, but the interface, connection core, and server are separate components. The interface turns your selections into configuration; the core handles connections according to that configuration; and the server must use compatible settings. Understanding this chain gives you a clear place to start with downloads, configuration, and troubleshooting, rather than blaming every issue on the client.
Project V
From Project Name to Configuration Model
Project V is an open-source ecosystem built around network proxying, with V2Ray as one of its best-known core implementations. Concepts such as inbounds, outbounds, routing, and DNS are shared vocabulary across its tools. They describe how connections are handled; they aren't tied to any one provider and don't amount to a ready-to-use subscription. This guide is organized around these structures to help map options in the interface to their meaning in the configuration.
Follow the direction of a connection: an app reaches a local inbound, the core identifies its destination, routing selects an outbound, and that outbound initiates a remote connection. DNS may help resolve the destination and inform routing decisions, while logs record what happens. This sequence is more useful than memorizing every field, and explains why an open local port does not prove that the remote handshake succeeded.
V2Fly / Xray
Shared Concepts Don't Guarantee Field Compatibility
The V2Fly community carries on V2Ray development, while Xray evolved from a related codebase into an independent project with its own features and release path. The two share many configuration concepts, but supported protocols, transport options, defaults, and field requirements may differ. For features such as REALITY and XTLS, verify support in the core you're using. A file named config.json isn't necessarily interchangeable between cores.
A protocol name displayed in the client is only the starting point. Also check the transport, TLS settings, server name, and server requirements. A field supported by another core does not mean the current one will accept it. If a configuration fails to load, start with the field and section identified in the logs. If it loads but won't connect, check both sides' settings and the network path. This helps distinguish syntax errors from handshake failures.
Read about core differences →
v2rayN / v2rayNG / v2flyNG
Three Open-Source Clients, Each with Its Own Interface
v2rayN is for desktop systems, with server lists, subscription groups, system proxy controls, and configuration management. v2rayNG targets Android and uses the Xray core; v2flyNG offers an Android alternative based on V2Fly. They're all open-source clients, not different skins for the same app. Learn each client's menus, defaults, import formats, and core management on its own terms.
Graphical clients make it easier to configure connections without editing raw JSON, but they don't change the server's authentication or transport requirements. When copying a share link, keep the full contents. After importing it, check the protocol, address, port, and transport settings. Before switching clients, export any profiles you want to keep. Don't mistake an interface default for a value provided by the server. When moving between desktop and Android, also check the differences in system proxy settings and VPN-based traffic capture.
LICENSE / SOURCE
Check Licensing for Each Component
Open-source licenses set the terms for using, modifying, and redistributing code. One license name cannot cover a client, its core, and every dependency. The V2Ray core uses the MIT License; the Xray core uses the MPL 2.0 License. Graphical clients and bundled components have their own license terms. If you redistribute software or modify code, review the relevant terms and retain required notices. “Free to use” doesn't mean there are no conditions.
Public source code makes implementation details available for inspection and discussion, but it doesn't verify subscription sources, server behavior, or local settings for you. Protect subscription links and credentials, import configurations only from trusted sources, and understand the role of scripts, certificates, and network permissions. This site provides download links and configuration guidance; it does not replace component license terms or guarantee that a connection will work just because the software is open source.
UPDATE / BACKUP
Software Updates and Subscription Updates Are Different
A software update changes the client or its bundled core; a subscription update changes server profiles and groups. Software updates may alter the interface, defaults, or configuration compatibility, while subscription updates may replace addresses and connection settings. If an issue appears after an update, first identify which layer changed, then compare it with the previous version. Refreshing a subscription won't fix a local port conflict or add a feature that the core doesn't support.
Before updating, save your client settings and any custom rules you need. Afterward, test a previously working single profile first. Confirm that the core starts and a basic connection works before trying combinations of routing, DNS, and TUN. Client and core releases may follow different schedules. Decide whether to change cores based on compatibility and the features you actually need; don't replace every component without checking first.
See import and connection steps →
DIAGNOSIS / REFERENCE
Can't Connect? Find the Failing Stage
First check whether the subscription can be fetched, then whether its server details parse correctly. Next verify that the core starts and opens a local listening port, and finally test a destination request. If only some domains fail, check their resolution results and routing matches. If all requests fail, check the selected server and handshake logs first. Latency tests are not the same as requests from real apps: a test reflects one probe using a particular method and cannot replace a full connection check.
When reporting an issue, include the error text, steps taken, proxy mode, and core name. Remove subscription URLs, credentials, and identifiable server details. If a term is unclear, check the definitions of inbounds, outbounds, subscriptions, and routing, then compare them with the relevant settings. This makes the issue easier to reproduce and helps prevent mistaking “the browser isn't using the proxy” for “the protocol isn't supported.” Before combining JSON examples, check brackets, commas, array nesting, and outbound references.
See configuration and connection terminology →