mrkeyoor.com_
Mon 05 Oct 08:01 UTC
Self-Hostedevaluationupdated 26 Aug 2026

Xray-core review

Xray-core is a Go network proxy engine that accepts traffic, applies DNS and routing rules, then sends it through configurable protocols and transports. It solves the packet-handling part of private proxy services and censorship-resistant connections, while leaving the friendly app or control panel to other projects. Its README and official configuration guide are available in English, though much of the latest release commentary and issue discussion is in Chinese.

+77stars / 7d
Verdict

Our Xray-core build finished in 76 seconds, but 3 of 80 tested packages failed, so adopting it means owning a real verification job. Use it when an experienced network operator needs its exact mix of VLESS, REALITY, XHTTP, routing, and downstream clients. Choose a narrower VPN or a managed service when you mainly want dependable remote access with fewer configuration decisions.

We ran it

Lab card: what happened when we ran Xray-coreScreenshot of Xray-core (t.me/projectXray)
Install✓ · 41s157 packages
Build✓ · 76s
Tests✗ · 338s77 passed · 3 failed of 80 (go test)
Repo1032 files~150,076 lines of source · 4.3 MB · 5 CI workflows

Answers from our run

Does Xray-core build from source?

Dependencies installed in 41 seconds (157 packages), and the build succeeded in 76 seconds. We cloned commit 2323273 into a clean Debian container with 3 CPUs and no project-specific setup.

Do Xray-core's tests pass?

Not all of them: 77 of 80 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use Xray-core?

Teams that require a clean test run before adoption: in our sandbox, 3 of 80 tested packages failed even though installation and compilation succeeded.

What are the alternatives to Xray-core?

sing-box, V2Ray, Mihomo. Our Xray-core build finished in 76 seconds, but 3 of 80 tested packages failed, so adopting it means owning a real verification job.

Setup2/5Build was easy; secure server and client setup is demanding
Docs4/5Strong English reference, sparse README and mixed-language updates
Community5/541,216 stars with current issue and pull-request activity
Maturity4/5Long-lived core, but our 80-package test run was not clean

Who it’s for

Network engineers who need VLESS, REALITY, XHTTP, WireGuard, Hysteria, or detailed routing in one core.
Self-hosters prepared to maintain matching server and client configurations.
Developers building proxy clients, router packages, or control panels around a Go engine.
Operators in restrictive networks who can test each protocol choice on the actual path where it will run.

Who it’s NOT for

Teams that require a clean test run before adoption: in our sandbox, 3 of 80 tested packages failed even though installation and compilation succeeded.
People looking for a complete consumer VPN app: the README sends users to separate GUI clients and web panels, many of them third-party projects.
Administrators unwilling to audit security-sensitive JSON: open issue #6600 reports different TLS enforcement depending on how a VLESS destination is expressed.
Maintainers who need an all-English change trail: the English README and docs exist, but the v26.3.27 release notes and several current issue threads are primarily Chinese.
Contributors expecting a repository Dockerfile: our checkout had none, although the README points users to an official GHCR image.

Setup reality

Our run installed 157 Go packages in 41 seconds and built Xray-core in 76 seconds. Tests then exited 1 after 338 seconds: 77 of 80 packages passed and 3 failed. The supplied log tail shows several transport packages passing, packages with no test files, and a final FAIL; it does not identify the cause of the 3 failures.

Running a useful proxy takes more than the compiled binary. You must create matching JSON on the server and client, choose inbounds and outbounds, set IDs or protocol keys, and handle certificates or REALITY values where the chosen setup requires them. Firewall rules, DNS policy, routing, and a separate client or panel remain your responsibility; no hosted account or SaaS credential is required by the core.

Our unprivileged Debian container used Go 1.24, 3 CPUs, and 8 GB of RAM. The 1,032-file checkout had no Dockerfile, but the README provides an official container image, release archives, a Linux installer, and Homebrew. Treat those as distribution choices, not substitutes for validating the resulting listener, routes, and upgrade path.

Xray-core is the engine behind the app

At commit 2323273, our checkout contained 1,032 files and roughly 150,076 lines of source. That scale matches what Xray-core is: a programmable network core, not a tray icon with a connect button. It accepts traffic through configured inbounds, applies DNS and routing decisions, and forwards it through outbounds. The project covers VLESS, Trojan, Shadowsocks, WireGuard, Hysteria, WebSocket, gRPC, XHTTP, TLS, and REALITY among its available pieces.

The distinction matters when choosing it. Xray-core does not provide an account screen, server picker, or guided security setup. Its README links to separate Windows, Android, Apple, Linux, router, and web-panel projects. That ecosystem gives users plenty of front ends, but each one adds its own release schedule and defaults. If you install a panel, you are reviewing the panel and its update mechanism as well as the core.

Xray-core began as a fork of V2Fly's core and has since developed its own protocol direction. The MPL 2.0 license applies to the repository, while optional bundled components such as Wintun keep their own licenses. For a team embedding the engine in another product, those file-level obligations and component notices deserve a licensing pass before distribution.

JSON decides where traffic and DNS go

The official configuration reference documents inbounds, outbounds, DNS, routing, policies, metrics, statistics, observatories, and geodata. One JSON file can send selected domains directly, proxy another group, reject unwanted traffic, or expose several local listeners. This is the appeal: Xray-core can express a network policy that a single-purpose VPN profile cannot.

It can also encode a bad policy perfectly. Client IDs, server addresses, ports, transport details, and security settings must agree across both ends. DNS choices can change which resolver sees a query. A listener bound too broadly can expose a service you meant to keep local. The official issue template asks reporters to understand every field instead of stacking attractive defaults, and that is sound operating advice.

Open issue #6600 gives the risk a concrete shape. The reporter supplied 2 configurations for the same connection and saw different enforcement of the rule that blocks VLESS without TLS or another encryption layer. The thread was still active on August 25, 2026. That report does not prove every VLESS configuration is unsafe, but it is a good reason to validate the exact syntax you deploy instead of assuming equivalent-looking forms behave alike.

What happened when we ran it

Our run installed 157 packages in 41 seconds, then compiled Xray-core successfully in 76 seconds. The sandbox was an unprivileged golang:1.24-bookworm container with 3 CPUs, 8 GB of RAM, and no secrets. Compilation was therefore the easy part of the evaluation. The repository occupied 4.3 MB after checkout and did not include a Dockerfile.

The test step ran for 338 seconds and exited with status 1. We measured 77 passed packages and 3 failed packages out of 80. The log tail does not name the failing assertions: it shows KCP, SplitHTTP, TCP, TLS, UDP, WebSocket, and pipe packages reporting ok, several packages reporting no test files, then the final FAIL. Assigning a cause from that tail would be guesswork.

That result is a caution rather than a verdict that the program cannot run. Installation and compilation both completed, and many transport packages passed. Still, a team that gates adoption on a clean upstream suite has work left: reproduce the same commit and environment, capture the full failure output, and decide whether the failures affect its intended protocol path. Our testing method records the fresh-container result; it does not turn 77 of 80 into a pass.

Distribution is easy, operation is the work

The README offers an official Linux installation script, GHCR image, release archives, Homebrew package, and one-line Go compilation commands. It also lists many community installers and panels. These paths reduce typing, but none chooses the right inbound, generates a complete security policy, opens only the intended firewall port, or confirms that DNS follows the route you expected.

A basic deployment needs matching client and server JSON plus identifiers or keys. TLS setups need certificate handling; REALITY setups need their own server and client values. Production also needs process supervision, log rotation, upgrades, rollback access, and a way to verify the listener after each change. A remote server is a bad place to discover that the only working client profile was overwritten.

The source tree has 5 CI workflow files but no top-level tests directory. Tests live beside Go packages, which is normal for Go and explains why the log reports package results rather than one central suite. There is also no repository Dockerfile even though an official image exists. Contributors who care about image provenance should inspect how that published image is built rather than infer it from a missing local file.

Current activity is high, while stable and prerelease tracks differ

GitHub showed 41,216 stars, 68 open issues and pull requests, and a last push on August 25, 2026. Recent activity included work on XHTTP data races, Hysteria synchronization, routing settings, and OpenBSD tunnel behavior. Those are signs of active maintenance, although a busy queue says nothing about whether your particular networking bug will be simple to reproduce.

GitHub's latest stable-release endpoint returned v26.3.27, published March 27, 2026. The releases list also contained newer prereleases through v26.7.28. The stable notes cover Finalmask, mKCP, Hysteria 2, XHTTP, REALITY, TLS ECH, WireGuard, reverse proxy work, and API changes. Much of that release text is Chinese, while the main README and a substantial official configuration site have English versions.

Xray-core is worth the effort when those named capabilities solve a network problem you actually have. The failed 80-package run keeps it out of the set-and-forget category, and the broad JSON surface calls for a network engineer rather than an installer alone. For ordinary home access, a narrower tool is easier to reason about. For XHTTP, REALITY, or fine-grained proxy routing, Xray-core remains a serious core once you budget for tests and rollback.

Alternatives

ProjectWhat it isPick it when
sing-box gh↗A multi-protocol proxy platform with its own routing model and client ecosystem.pick this instead when its configuration, supported platforms, or surrounding clients fit your deployment better than Xray-specific features.
V2Ray gh↗The community-maintained proxy platform from which Xray-core originally forked.pick this instead when V2Fly compatibility matters more than Xray's VLESS, REALITY, and XHTTP direction.
MihomoA rule-based proxy core descended from Clash Meta with broad client support.pick this instead when Clash-style subscriptions, rule providers, and compatible dashboards are the center of your setup.

What people are saying

  1. [github-trending] XTLS/Xray-core

Sources

  1. Xray-core README
  2. Xray configuration reference
  3. Xray-core v26.3.27 release
  4. Xray-core releases
  5. Issue 6600: VLESS TLS enforcement difference

More self-hosted reviews

hysteria · skillbox · vm2api · FounderOS-DEMO · UFI-TOOLS · awesome-cloudflare-selfhosted · the whole board →