Choose a package based on your operating system and processor architecture, then check its runtime requirements. Windows users can choose between WPF and Avalonia; macOS and Linux users should select the Avalonia build for their platform. This guide covers the difference between the UI and proxy core, how to read package names, how to troubleshoot launch failures, and how to try the other UI without losing your existing settings.
The difference between the UI framework and proxy core
WPF is a desktop UI framework for Windows, while Avalonia is a cross-platform desktop UI framework. In v2rayN, they mainly determine how windows, lists, menus, and desktop interactions are implemented. Neither is a proxy protocol, nor does either require special support from a server. Switching from WPF to Avalonia does not mean you need to change VMess to VLESS.
The proxy core handles the actual connection. The v2rayN UI saves server settings, generates configuration, and manages the core process; cores such as Xray handle protocols, routing, and outbound connections. That means “the UI opens” and “the proxy connects” are separate checks. Even if the UI launches, you still need to verify the core files, node settings, system proxy, and routing configuration.
| Comparison | WPF build | Avalonia build |
|---|---|---|
| Supported platforms | Windows | Windows, macOS, and Linux; check the specific release assets |
| UI implementation | Windows desktop controls and interaction patterns | Cross-platform controls and windowing |
| Best suited for | Keeping a familiar Windows workflow | Using a similar UI across desktop operating systems |
| What determines connectivity | The core, node protocol, and configuration—not just the UI framework name | |
| System integration | Tray behavior, startup, system proxy, and permissions still depend on the operating system | |
“Cross-platform” does not mean one archive runs on every operating system. Avalonia shares the UI technology, but the application and bundled core still vary by platform and architecture. The WPF or Avalonia label alone also tells you nothing about latency. For a meaningful network comparison, keep the node, core, routing, and test destination the same.
Choosing between Windows and cross-platform builds
If your WPF build works reliably and you mainly use subscription groups, the server list, and system proxy settings, there’s no need to switch just because of the UI framework. Avalonia is worth trying if you use both Windows and Linux, or want a similar workflow on macOS. Menus may move between releases, so don’t expect screenshots of the two UIs to match pixel for pixel.
Choose a UI for your setup
Primarily use Windows
- If you know your way around WPF and your current build works, keep using the matching build.
- For a consistent workflow across operating systems, try Avalonia in a separate folder.
- First check that the tray, display scaling, and everyday shortcuts suit your workflow.
Use macOS or Linux
- Choose the Avalonia build for your platform, not the Windows package.
- Match the build to your device architecture: x64 or arm64.
- Check tray support, executable permissions, and proxy settings for your desktop environment.
Confirm platform and architecture compatibility first, then compare workflows. Choosing a UI does not configure your connection.
Check font size, list density, context menus, and window scaling directly on a high-resolution display. On Linux, tray behavior also depends on the desktop environment and its extensions. On macOS, check separately whether closing a window quits the app. If the window disappears, check the menu bar or tray for the app's status before launching another copy.
Package names and runtime requirements
When choosing a package, read the filename and release notes in this order: operating system → processor architecture → UI framework → distribution format. windows, linux, and macos identify the target OS; x64 and arm64 identify the architecture. The wpf label marks a WPF build. If it’s absent, confirm the build using the download page rather than relying on one missing word.
- Windows: Open Settings → System → About and check System type. Don’t confuse the Windows version number with the processor architecture.
- macOS: Open About This Mac from the Apple menu and check the chip or processor details. For Apple silicon devices, choose a matching arm64 build.
- Linux: Run
uname -min a terminal. Common values arex86_64for x64 andaarch64for arm64. You’ll also need to meet any system library requirements in the release notes. - Distribution format: Installers, archives, and app packages have different launch steps. Extract archives completely; don’t run an executable from the archive preview.
Both UIs use .NET, but whether you need to install a runtime depends on how the specific build was published. Self-contained builds bundle the required .NET runtime components; framework-dependent builds use a compatible runtime already installed on your system. Self-contained does not mean independent of all OS components—on Linux in particular, check system library and desktop environment requirements.
Check UI runtime requirements separately from core files. A missing runtime usually prevents the window from opening. If the window opens but the log says the core is missing, lacks execute permission, or can’t start, check the bundled core and its path. Copying only the main executable can leave out required resources or the core directory.
Try the other UI without losing your settings
Try the new build in a separate folder rather than overwriting a working installation. Configuration data may be reusable between similar versions on the same platform, but don’t assume data structures or paths are fully compatible across versions or platforms. The safest approach is to back up first, restore nodes from your subscription, then check local settings one by one.
-
Record your existing settings
In the original app, open Settings → Parameter settings and note items such as the local listening port and whether LAN connections are allowed. Also record the system proxy status, routing choice, and subscription group URLs from the main window. Back up the app's data directory before quitting.
-
Quit the old instance
Choose Exit from the tray menu and make sure both the app and its core process have stopped. Closing the window may leave background processes running; launching another copy then can cause a port conflict.
-
Launch from a separate folder
Download the build for your platform from this site's download page, then install it or fully extract it to a new folder, depending on the distribution format. First confirm that the main window opens normally; then configure your nodes and system proxy.
-
Restore your subscription
Go to Subscription groups → Subscription group settings, add the existing subscription URL, and save it. Then use the update option under Subscription groups to fetch nodes. The group editor may appear as a button or menu in different UIs; look for the same feature name.
-
Check the connection
Select a node first and leave TUN off. From the main window's system proxy menu, choose Automatically configure system proxy. Confirm that a regular browser can connect, then restore custom routing, DNS, and any other traffic interception settings.
Subscriptions mainly restore server entries, not all client preferences. Check custom routing, listening ports, shortcuts, window layout, and local file paths separately. Absolute paths in the old folder are especially likely to break when switching operating systems. Subscription URLs may contain credentials, so keep migration notes and screenshots private and never share the full URL.
Troubleshooting startup and connectivity
First identify which layer is failing. If double-clicking does not open a window, check the platform, architecture, and runtime requirements. If the window opens but a node fails to start, check the core log. If the node starts but the browser is not using the proxy, check the system proxy and port. This order helps avoid mistaking a runtime issue for a broken subscription.
For example, if the local listening port under Settings → Parameter settings is 10808 but the log shows address already in use, first check whether an old core is using that port. The commands below only check which process is listening; they don’t change settings. If your port isn’t 10808, use the value shown in the UI. Don’t assume every build uses the same HTTP and SOCKS ports.
# Windows: check the example port in a terminal
netstat -ano | findstr :10808
# Linux: find the process listening on the example port
ss -lntp 'sport = :10808'
# macOS: find the process listening on the example port
lsof -nP -iTCP:10808 -sTCP:LISTEN
Identify the process in the output before deciding which app to quit. Don’t terminate unfamiliar system processes. If you change the client’s listening port, update any apps where you manually entered proxy settings. A browser working through the system proxy only confirms that this particular routing path works; it doesn’t mean command-line tools or apps that ignore system proxy settings will use the same connection automatically.
Package selection and migration FAQs
Do I have to switch to Avalonia on Windows?
No. If your current WPF build meets your needs, keep using it. To compare the UIs, back up your data and try Avalonia separately. Check everyday tasks such as tray behavior, window scaling, subscription management, and system proxy settings. Don’t overwrite your existing folder.
Will my subscription still work after switching UIs?
The UI framework itself doesn’t change your subscription URL. Add the URL again under Subscription groups → Subscription group settings and update the list to test it. If parsing fails, check the subscription format, URL validity, and protocol support in the core rather than assuming WPF and Avalonia use incompatible nodes.
Why won’t the app open after I installed the runtime?
Check the framework name, major version, and architecture required by the error, then make sure the package was fully extracted. WPF's Desktop Runtime requirement is not the same as the standard Runtime. On Linux, check the terminal output for missing system libraries or execute permission errors.
Why does one build connect while the other can’t load web pages?
Quit the other build first to avoid a port conflict, then compare the node, core, routing, and DNS settings. Use the system proxy menu in the main window to set up traffic routing again, and check the manual proxy port in your apps. A comparison is only meaningful when these conditions match.
Can I just copy the entire old folder?
Keep a copy of the original folder first. Don’t copy the entire folder over when switching platforms: executables, cores, and paths may differ. Reimport your subscription, then restore routing and port settings as needed. Before migrating configuration data, check the compatibility notes for the target version.
Narrow your choice down to three checks: does the package match your device, are its runtime requirements met, and does the UI suit your workflow? Windows users can compare both UIs based on preference; macOS and Linux users should choose the Avalonia build for their platform. For network issues, check the core, node, and traffic routing method—not the UI framework name.