Local configuration tool
VMess to Xray JSON
Turns a vmess:// link back into a full Xray client config you can edit by hand.
Conversion happens entirely in your browser. Links are not uploaded, saved, or placed in the page URL.
Conversion result
Why some links are rejected
A parameter that cannot be mapped without changing how the connection behaves is reported rather than dropped. Xray-core speaks none of the QUIC-native protocols, so Hysteria2 and TUIC links are refused outright rather than reshaped into something that merely looks close. Certificate pinning and the post-2024 REALITY fields are refused for the same reason.
How to import into Xray or v2rayN
Xray-core reads this JSON directly as its config file. Note that Xray uses the first outbound as the active node — with several nodes in one file, switching means editing routing rather than clicking a selector.
How VMess fields map to Xray
What this converter actually does, line by line. On the left is how it is written in a VMess link; on the right is the field it becomes in the Xray config.
| In the link | In the Xray config | Notes |
|---|---|---|
id | settings.vnext[].users[].id | vmess:// is base64-encoded JSON; these are its field names, not URL parameters. |
add / port | settings.vnext[].address / port | port is accepted as a string or a number, the way different exporters write it. |
aid | settings.vnext[].users[].alterId | A non-zero alterId gets a warning: it selects the MD5 authentication path that has since been removed. |
scy | settings.vnext[].users[].security | auto, aes-128-gcm, chacha20-poly1305, none and zero are accepted. |
ps | tag | The node name. Falls back to server:port when the field is empty. |
tls: "tls" + sni | security: "tls" + tlsSettings.serverName | VMess is spelled the same way as VLESS in every target: servername, server_name, serverName. |
fp / alpn | tlsSettings.fingerprint / alpn | fp defaults to chrome when the payload leaves it out. |
net=ws + path / host | streamSettings.wsSettings | This is the shape v2rayN exports most often. |
net=grpc / httpupgrade | grpcSettings / httpupgradeSettings | Mihomo folds HTTPUpgrade into WebSocket; the other two give it its own type. |
net=h2 / net=http | Rejected with an error | Xray has removed the HTTP/2 transport, so that target refuses the line instead of rewriting it as XHTTP — a different protocol on the wire. |
net=xhttp | streamSettings.xhttpSettings | sing-box has no XHTTP transport, so the line is rejected instead of downgraded. |
type (header obfuscation, e.g. "http") | Rejected with an error | Header obfuscation other than none has no equivalent in any of the three formats. |
FAQ
- Which client do I use after converting VMess to Xray?
- Use Xray-core 1.8.16 or newer, or an Xray-based client such as v2rayN or v2rayNG. Note that Xray treats the first outbound as the active node; switching between several is a routing change.
- Is this VMess converter free, and does it upload my node links?
- It is free and needs no account. The conversion is done by JavaScript inside this page, on your own machine: links are never uploaded, never written into the page URL, and never stored. Closing the tab is all the cleanup there is.
- Can I convert a subscription link straight to Xray?
- Yes, but paste the body the subscription URL returns — usually one long base64 string — rather than the URL itself, which the browser cannot fetch across origins. Mixed protocols in one subscription are fine.
- The Xray config converted fine but will not connect — what now?
- This page only translates links into a config: it checks the structure, never whether the server is reachable. Confirm the same link works in the client you copied it from, then check the client version — the XHTTP transport needs Xray 24.11 or newer.
This creates a one-time local configuration, not an auto-updating subscription. It checks configuration structure, not whether a server is reachable.