XTLS/Xray-core · error

VLESS users: "tag" can't be empty for "reverse"

Error message

VLESS users: "tag" can't be empty for "reverse"

What it means

A VLESS inbound user may declare a 'reverse' object (reverse proxy bridging), and if present its 'tag' must be non-empty — the tag is the routing identifier the reverse traffic is matched against. An empty tag makes the reverse entry unroutable, so the build fails.

Source

Thrown at infra/conf/vless.go:90

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

		if len(account.Testseed) < 4 {
			account.Testseed = c.Testseed
		}

		if account.Encryption != "" {
			return errors.New(`VLESS users: "encryption" should not be in inbound settings`)
		}

		if account.Reverse != nil {
			if account.Reverse.Tag == "" {
				return errors.New(`VLESS users: "tag" can't be empty for "reverse"`)
			}
			if account.Reverse.Sniffing != nil { // may not be reached: error json unmarshal
				return errors.New(`VLESS users: inbound's "reverse" can't have "sniffing"`)
			}
		}

		user.Account = serial.ToTypedMessage(account)
		config.Users[idx] = user
		return nil
	}

	if err := task.ParallelForN(len(c.Users), processClient); err != nil {
		return nil, err
	}

	config.Decryption = c.Decryption
	if !func() bool {
		s := strings.Split(config.Decryption, ".")

View on GitHub (pinned to 7d214f8b09)

Solutions

  1. Add a non-empty "tag" inside the reverse object, e.g. "reverse": { "tag": "bridge" }
  2. Reference the same tag from the corresponding reverse outbound on the other end

Example fix

// before
{ "id": "8c1f...", "reverse": {} }
// after
{ "id": "8c1f...", "reverse": { "tag": "bridge" } }
Defensive patterns

Strategy: validation

Validate before calling

if r := gjson.Get(clientRaw, "reverse"); r.Exists() {
    if gjson.Get(r.Raw, "tag").String() == "" {
        return errors.New("reverse object requires a non-empty \"tag\"")
    }
}

Prevention

When it happens

Trigger: A clients entry with "reverse": { } or "reverse": { "sniffing": ... } but no "tag" value.

Common situations: Enabling the reverse feature on a user but forgetting to name the bridge tag, or a typo'd key like "Tag" that never binds to the tag field.

Related errors


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