Configuration Overview
MeowX runs on a configuration file in the mihomo / Clash Meta config.yaml format. In practice this file almost always comes from a subscription: a URL from your provider that returns a complete YAML document with proxies, proxy-groups, rules and usually dns.
MeowX treats mihomo as the specification for behavior: field names, defaults, rule matching semantics, proxy group logic and DNS behavior follow mihomo wherever MeowX implements a feature. Keys MeowX does not use are ignored, so a file written for mihomo normally imports without changes. The pages in this section list exactly what is read and where MeowX differs. For a one-page summary see Compatibility.
Top-level keys
Section titled “Top-level keys”These are the only top-level keys MeowX reads. Every other top-level key is ignored.
| Key | Type | Default | Description |
|---|---|---|---|
mode |
string | rule |
Outbound mode: rule, global or direct (lowercase). The app’s mode switch changes this value; see below. |
log-level |
string | info |
Accepted values: debug, info, warning, error, silent. The value is validated but otherwise ignored: logging is controlled by the “Record logs” switch in the app. |
ipv6 |
bool | false |
Accepted but ignored. Whether DNS returns IPv6 addresses is controlled by dns.ipv6, and whether IPv6 traffic enters the tunnel by the app’s IPv6 mode. |
proxies |
list | [] |
The nodes. See Protocol overview. |
proxy-groups |
list | [] |
See Proxy groups. |
rules |
list | [] |
See Rules. |
rule-providers |
map | {} |
See Rule providers. |
dns |
map | — | See DNS. |
hosts |
map | {} |
Static domain-to-IP entries. See DNS → hosts. |
sniffer |
map | enabled | Only enable is read. Unlike mihomo, sniffing is on by default. See Sniffer. |
A minimal working file:
mode: rule
proxies: - name: node-1 type: ss server: 192.0.2.1 port: 8388 cipher: aes-128-gcm password: example-password udp: true
proxy-groups: - name: Proxy type: select proxies: [node-1, DIRECT]
rules: - DOMAIN-SUFFIX,example.com,Proxy - GEOIP,CN,DIRECT - MATCH,ProxyKeys that are ignored
Section titled “Keys that are ignored”Common mihomo keys with no effect in MeowX include:
- Inbound ports and listeners:
port,socks-port,mixed-port,redir-port,tproxy-port,allow-lan,bind-address,authentication,listeners. MeowX has its own optional local HTTP / SOCKS5 proxy, configured in the app. - Controller and UI:
external-controller,external-ui,secret,profile. tun(the whole section). The tunnel is set up by the system VPN framework; see TUN and IPv6.proxy-providers. Nodes must be listed underproxies:. Ause:list in a proxy group is ignored.sub-rules,tunnels,ntp,experimental.- Geodata settings:
geox-url,geodata-mode,geo-auto-update,geo-update-interval. MeowX ships its own databases; see GeoIP and GeoSite. - Global tuning:
unified-delay,tcp-concurrent,find-process-mode,global-client-fingerprint,keep-alive-interval,interface-name,routing-mark.
Validation
Section titled “Validation”When a configuration is imported or a subscription is refreshed, MeowX parses and checks it before using it. If the check fails, the new file is rejected and the configuration you were using stays active.
The whole file is rejected when:
- the YAML is invalid, or a key has the wrong type (for example
mode: Ruleinstead ofmode: rule); - two proxies or groups have the same name, or a name collides with a built-in target (
DIRECT,REJECT,REJECT-DROP,PASS,COMPATIBLE); - a proxy is missing a required field (for example
server/port, or the protocol’s password / UUID); - a proxy group has an unknown
type, lists a member that does not exist, or groups reference each other in a loop; - a rule line has an unknown rule type or is malformed. See Rules → Unsupported rule types.
These problems only produce a warning, and the rest of the file still loads:
- a proxy of an unsupported type, or one that cannot be built (for example an unsupported cipher) — the node is skipped;
- a rule whose target is not a proxy, group or built-in target, or whose
RULE-SETnames a provider that is not defined — only that rule is dropped (mihomo refuses the whole file here); - an invalid
expected-statuson a group — it is treated as not set.
What MeowX changes or adds
Section titled “What MeowX changes or adds”MeowX keeps your subscription file as downloaded and builds the active configuration from it. A few things are adjusted or layered on top.
DNS section
Section titled “DNS section”dns.enableis always set totrue.dns.enhanced-modeis set according to the app’s DNS mode setting: Follow subscription (the default), Redir-Host or Fake-IP. Follow subscription uses the subscription’s ownenhanced-modeand falls back toredir-hostwhen the subscription doesn’t set one.- When the effective mode is fake-ip and the file has no
fake-ip-range/fake-ip-filter, defaults are added. - When the file has no
dnssection at all, a built-in fallback DNS section is used.
All other DNS keys (nameserver, nameserver-policy, direct-nameserver, …) are kept as written. Details are on the DNS page.
Outbound mode
Section titled “Outbound mode”The Rule / Global / Direct switch in the app writes the mode value of the active configuration and takes effect immediately, without reconnecting. Refreshing the subscription rebuilds the configuration from the downloaded file, so the subscription’s own mode value applies again.
- Rule — rules decide; see Rules → Matching order.
- Global — all traffic goes to the group named
GLOBALif the file defines one, otherwise to the first group inproxy-groups, otherwiseDIRECT. MeowX does not create a built-inGLOBALgroup. - Direct — all traffic goes direct.
Remembered selections
Section titled “Remembered selections”The node you pick in a select group, and a node you pin in a url-test or fallback group, is remembered per group name and restored the next time the tunnel starts. If that member no longer exists (for example after switching subscriptions), the group starts from its default.
Settings that are never written into the file
Section titled “Settings that are never written into the file”The following live in the app, apply to every configuration, and are evaluated before your subscription’s rules. They are stored separately so that refreshing a subscription never erases them:
| Setting | Effect |
|---|---|
| Bypass list (domains and IP / CIDR) | Always DIRECT, in every mode. |
| APNs direct (on by default) | Apple Push Notification traffic always goes DIRECT, in every mode. Can be turned off. |
| Your provider’s dashboard | When you are signed in, the dashboard’s own domain and its subscription domains always go DIRECT, in every mode. |
| DNS overrides | Fixed answers for domains, used before hosts, fake-ip and upstream servers. |
| Block QUIC | Drops UDP to port 443 so apps fall back to TCP. |
| Custom rules | “Direct / Proxy / Reject this domain”, in Rule mode only, before the subscription’s rules. |
| Rules from enabled modules | A module’s [Rule] section, in Rule mode only, after custom rules and before the subscription’s rules. |
Subscriptions
Section titled “Subscriptions”How a subscription is downloaded
Section titled “How a subscription is downloaded”MeowX sends a plain HTTP(S) GET with this User-Agent:
mihomo/1.19.0 MeowX/<version> (<platform>)where <platform> is iOS or macOS, for example mihomo/1.19.0 MeowX/0.5.8 (iOS).
- The leading
mihomo/1.19.0is what most providers and panels look for to decide that the client wants a complete mihomo YAML (withproxies,proxy-groups,rulesanddns) instead of a list of share links. Don’t strip it if you proxy or rewrite subscription requests. MeowX/<version>identifies the official MeowX client. A MeowX-compatible provider dashboard uses it to include nodes that only MeowX supports (for example AnyTLS with REALITY), which it filters out for other Clash clients.
The response is never served from a local HTTP cache, so pressing refresh always fetches the current file. The request times out after 20 seconds.
Response headers
Section titled “Response headers”| Header | Used for |
|---|---|
subscription-userinfo |
Traffic usage and expiry shown in the app and widgets. Format: upload=<bytes>; download=<bytes>; total=<bytes>; expire=<unix seconds>. Any field may be missing. |
profile-title |
The subscription’s display name. A base64: prefix is decoded (profile-title: base64:<base64 of UTF-8 text>). Without this header the name is the URL’s host. |
profile-update-interval |
Recorded, but not used for scheduling. Automatic updates follow the app’s sync interval setting (below). |
Automatic updates
Section titled “Automatic updates”The active subscription is refreshed automatically when it is older than the app’s sync interval (24 hours by default; 0 means manual only). The check runs when the app starts or returns to the foreground; on iPhone and iPad it can also run in the background through Background App Refresh. A failed refresh keeps the previous configuration.
Rule providers referenced by the configuration are downloaded separately; see Rule providers → Downloading and caching.
