Skip to content

Proxy Groups

A proxy group bundles nodes (and other groups) under one name that rules can target. MeowX reads groups from the proxy-groups: list.

proxy-groups:
- name: Proxy
type: select
proxies: [Auto, HK-01, JP-01, DIRECT]
- name: Auto
type: url-test
proxies: [HK-01, JP-01, SG-01]
url: https://cp.cloudflare.com/generate_204
interval: 300
tolerance: 50
type Behavior in MeowX
select You choose the member in the app. Defaults to the first member.
url-test Health-checks all members and uses the fastest one that is alive.
fallback Health-checks all members and uses the first one (in list order) that is alive.
load-balance Accepted, but behaves exactly like select: traffic is not spread across members, and strategy is ignored.
relay Accepted, but behaves exactly like select: members are not chained. To chain nodes use dialer-proxy; see Chained proxies.

Any other type makes the whole configuration fail to load.

Key Type Default Description
name string required Group name. Must be unique across proxies and groups, and must not be a built-in target (DIRECT, REJECT, REJECT-DROP, PASS, COMPATIBLE).
type string required See Group types.
proxies list [] Members: node names, other group names, or built-in targets such as DIRECT and REJECT. Every name must exist, otherwise the configuration is rejected. Groups must not contain each other in a loop.
url string https://cp.cloudflare.com/generate_204 Health-check URL for url-test / fallback. Both http:// and https:// work.
interval int (seconds) 300 Time between automatic health checks (url-test / fallback). Values below 1 are treated as 1; there is no “0 = off” as in mihomo, so don’t set 0.
tolerance int (ms) 0 url-test only. Keep the current member while its delay is within this many milliseconds of the fastest member, to avoid switching back and forth between similar nodes.
lazy bool true When true, a scheduled health check is skipped if the group hasn’t carried any traffic during the last interval.
expected-status string or int any status Which HTTP status codes from the health-check URL count as “alive”. Same syntax as mihomo: 204, 200/204, 200,204, 200-299, [200-299], 200/300-399; * or empty means any status. An invalid value produces a warning and is treated as not set.
hidden bool false Hide the group from the app’s node list. It still works and can still be referenced.
icon string — Image URL shown next to the group name in the app.

These group options are read by mihomo but have no effect in MeowX: use (proxy providers are not supported, so a group that gets its members only from use: ends up empty), include-all, include-all-proxies, include-all-providers, filter, exclude-filter, exclude-type, timeout, max-failed-times, strategy, disable-udp, interface-name, routing-mark, default-selected.

Health checks apply to url-test and fallback groups.

  • When they run. Once as soon as the tunnel starts (so a fallback group doesn’t start on a dead first node), then every interval seconds. With lazy: true, a scheduled check is skipped while the group is idle. Checks are also skipped while the device is asleep or the cellular radio is idle, and one catch-up check runs when activity resumes if a check was missed.
  • How a member is tested. MeowX connects through the member to url and measures one HTTP request. Each test has a 5-second budget; at most 10 tests run at the same time. A member whose test fails or times out, or whose status code doesn’t match expected-status, is marked unavailable.
  • Choosing a member.
    • url-test picks the member with the lowest delay. Untested members rank after members known to be alive; unavailable members come last. With tolerance, the current member is kept while it is alive and within tolerance ms of the fastest.
    • fallback picks the first member in list order that is not marked unavailable.
    • If every member is unavailable, the group uses its first member.
  • Shared results. When several groups contain the same node and check at the same time, a recent result for that node is reused instead of testing it again.

The latency numbers you see after tapping “test” in the app’s node list come from the app’s own latency test, whose method and URL are set in the app’s settings. Automatic member selection always uses the group’s url through the node.

url-test and fallback groups don’t wait for the next health check when a member breaks:

  • If connecting through the current member fails, the member is marked unavailable, the group re-selects, and the same connection is retried through the next member. This continues until a member works or all have been tried. A member that connects successfully again is cleared of its “unavailable” mark.
  • After all members fail, a full health check of the group is scheduled (at most once a minute).
  • If a member accepts connections but repeatedly returns no data (three times within 60 seconds), that member is re-tested.
  • A connection rejected by a REJECT member, and a failure caused by the device having no network at all, do not mark members unavailable.

Pinning a node in url-test and fallback groups

Section titled “Pinning a node in url-test and fallback groups”

As in mihomo, you can manually choose a member of a url-test or fallback group in the app. The chosen member is pinned:

  • The group keeps using the pinned member as long as it is alive, regardless of delay or order.
  • If a health check or a failed connection marks the pinned member unavailable, the pin is dropped and the group goes back to automatic selection. A note is written to the app’s log.
  • Selecting the pinned member again, or turning Auto select back on for the group, removes the pin.
  • A pin is remembered across restarts until it is removed or dropped.

These names can be used as group members and rule targets without being defined:

Name Behavior
DIRECT Connect directly.
REJECT Refuse the connection. UDP is dropped.
REJECT-DROP Same as REJECT.
PASS Treated as DIRECT. (In mihomo, PASS skips to the next rule; MeowX does not implement that.)
COMPATIBLE Accepted so that configurations load, but it has no outbound of its own. As a rule target it falls back to DIRECT. Avoid using it.

GLOBAL is not built in. In Global mode MeowX uses a group named GLOBAL if you define one; see Outbound mode.