XTLS/Xray-core · error

VLESS users: "flow" doesn't support "{account.Flow}" in this

Error message

VLESS users: "flow" doesn't support "{account.Flow}" in this version

What it means

Thrown by VLessOutboundConfig.Build() after parsing a user when account.Flow is not one of the supported values. This build only accepts "" (no flow), vless.XRV ("xtls-rprx-vision") and "xtls-rprx-vision-udp443". Legacy flows from older Xray/V2Ray releases — xtls-rprx-origin, xtls-rprx-direct, xtls-rprx-splice — were removed and now trigger this error.

Source

Thrown at infra/conf/vless.go:330

				if err := json.Unmarshal(rawUser, account); err != nil {
					return nil, errors.New(`VLESS users: invalid user`).Base(err)
				}
				if account.Reverse != nil { // may not be reached: error json unmarshal
					return nil, errors.New(`VLESS users: please use simplified outbound's config style to use "reverse"`)
				}
			}

			u, err := uuid.ParseString(account.Id)
			if err != nil {
				return nil, err
			}
			account.Id = u.String()

			switch account.Flow {
			case "":
			case vless.XRV, vless.XRV + "-udp443":
			default:
				return nil, errors.New(`VLESS users: "flow" doesn't support "` + account.Flow + `" in this version`)
			}

			if !func() bool {
				s := strings.Split(account.Encryption, ".")
				if len(s) < 4 || s[0] != "mlkem768x25519plus" {
					return false
				}
				switch s[1] {
				case "native":
				case "xorpub":
					account.XorMode = 1
				case "random":
					account.XorMode = 2
				default:
					return false
				}
				switch s[2] {
				case "1rtt":

View on GitHub (pinned to 7d214f8b09)

Solutions

  1. Set "flow":"xtls-rprx-vision" for REALITY/XTLS-Vision setups
  2. Set "flow":"" (or omit it) when not using XTLS Vision — especially with plain TLS or WebSocket transports
  3. Regenerate the share link / config with a current-version client tool
  4. Upgrade both endpoints so Vision is available on each side

Example fix

// before
"users": [ { "id": "...", "encryption": "none", "flow": "xtls-rprx-direct" } ]
// after
"users": [ { "id": "...", "encryption": "none", "flow": "xtls-rprx-vision" } ]
Defensive patterns

Strategy: validation

Validate before calling

func validateVlessFlow(flow string) error {
	switch flow {
	case "", "xtls-rprx-vision", "xtls-rprx-vision-udp443":
		return nil
	}
	return fmt.Errorf("unsupported flow %q", flow)
}

Type guard

func vlessFlowSupported(flow string) bool {
	switch flow {
	case "", "xtls-rprx-vision", "xtls-rprx-vision-udp443":
		return true
	}
	return false
}

Prevention

When it happens

Trigger: "flow":"xtls-rprx-direct" or "xtls-rprx-splice" in a user/account; any typo like "vision-udp443" without the full prefix; configs carried over from pre-1.8 Xray or V2Ray with XTLS enabled.

Common situations: Upgrading Xray-core on a server/client pair where old configs used splice/direct flow; following outdated tutorials; share links generated by old tools that still embed legacy flow values.

Related errors


AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15). Data as JSON: /api/errors/741f751ffd27e131. Report an issue: GitHub.