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
- Add a non-empty "tag" inside the reverse object, e.g. "reverse": { "tag": "bridge" }
- 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
- Always name reverse tags (e.g. "bridge"/"portal") and reference them consistently
- Use lowercase "tag" exactly
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
- VLESS users: inbound's "reverse" can't have "sniffing"
- bridge tag is empty
- bridge domain is empty
- portal tag is empty
- portal domain is empty
AI-assisted analysis of XTLS/Xray-core@7d214f8b09 (2026-08-15).
Data as JSON: /api/errors/a6a1e06374f7b92f.
Report an issue: GitHub.