· Core Engine · 12-minute read
mihomo vs. Original Clash: Feature Comparison for Mac Clients
Compare mihomo (formerly Clash Meta) with the original Clash core, including protocols, rule types, and config fields—and find out whether your existing config will work after upgrading your Mac client.
First, distinguish the core, GUI client, and subscription
When choosing a Clash client for Mac, first check which core it actually runs. The GUI client provides the menu bar interface, subscription management, system proxy controls, and permission prompts. The core parses configs, establishes proxy connections, matches rules, and handles DNS. Similar-looking apps don't necessarily support the same protocols, and updating the client doesn't always update its core.
mihomo is a proxy core developed from the Clash Meta project. References to Meta configs in older guides and Clash Meta output options in subscription services usually point to this branch, but supported fields depend on the mihomo version you're using. The original Clash public repository has been unmaintained since 2023, so legacy builds don't gain support for newer protocols automatically.
Three things Mac users should check
- Client version: Check the app's About window to confirm the GUI and management features you're using.
- Core version: Check the client's core information page or startup logs. Note the
mihomoname and full version number; menu names vary by client. - Subscription output format: Check whether the subscription service generates a generic Clash config or one for Clash Meta/mihomo. Both may use the YAML extension, but their fields aren't necessarily identical.
Feature comparison: differences that affect everyday use
| Feature | Original Clash | mihomo and what it means on Mac |
|---|---|---|
| Core proxy protocols | Supports legacy staples such as Shadowsocks, VMess, and Trojan, depending on the version. | Retains many existing protocols while adding newer protocols and transport options. |
| VLESS and Reality | Not supported by the original open-source core. | Supports these node types, provided the server authentication, transport, and TLS settings all match. |
| Hysteria2 and TUIC | These node types aren't supported by the original open-source core. | Supported, but the connection still depends on whether the network allows UDP. |
| Rules and rule providers | Includes basic domain and IP rules; Premium also supports rule providers. | Adds logical rules, more match conditions, and rule provider formats. Check field compatibility in complex configs. |
| TUN mode | Don't confuse the original open-source core with Premium, which included TUN support. | Supports TUN configuration, but on Mac the client must also install the service or handle permissions. |
| DNS and traffic sniffing | Includes basic DNS and fake-IP mechanisms. | Offers more DNS strategies and sniffing options; enabling them by default doesn't guarantee better speeds. |
Whether an upgrade helps depends on what you need. If your subscription only uses traditional node types and your browser works through the system proxy, switching cores may not noticeably improve speed. But if your subscription includes VLESS or Hysteria2, or you need more precise routing rules, the core's capabilities determine whether the config loads and connections can be established.
Protocol support: why newer nodes won't work with an older core
VLESS, Reality, and transport are separate settings
VLESS is a proxy protocol, Reality is a related TLS security option, and WebSocket and gRPC are transport methods. In a subscription, type: vless, reality-opts, and network each serve a different purpose. VLESS support doesn't mean every Reality config will connect: the public key, short ID, server name, and flow-control settings must still match the server.
If the original core reports an unsupported proxy type, changing the node's display name, switching proxy groups, or enabling the system proxy won't help. Use a core that supports that type, or ask the subscription provider for a node using a protocol supported by the server. Changing type: vless to vmess by hand doesn't convert the format; it just creates a protocol mismatch.
Hysteria2 and TUIC also depend on network conditions
These QUIC-based protocols rely on UDP. mihomo's ability to parse the config only means it implements the protocol; the connection can still time out if your Wi-Fi, corporate network, or upstream firewall blocks UDP. If other nodes work but these don't, test another protocol first, then check the port, authentication details, and network restrictions.
- Config fails to load: Check the core version, node type, and config fields first; there's no need to start by changing DNS.
- Config loads, but the handshake fails: Check the server settings, your Mac's system clock, and whether the node is reachable.
- Connection works, but some traffic fails: Check UDP, rule matches, DNS, and path MTU before blaming core performance.
Rule support: keep existing rules, but check what new ones mean
Classic rules such as DOMAIN, DOMAIN-SUFFIX, IP-CIDR, and MATCH remain central to mihomo configs. Rules are usually evaluated from top to bottom: once an earlier rule matches, later rules of the same kind won't determine the connection's outbound route. When migrating, preserving rule order is often more important than simply keeping the same text.
Logical rules and process matching
mihomo supports logical combinations for more complex conditions, as well as process-based matching. These let you combine criteria such as domain, network type, and process, but process detection depends on the OS, traffic entry point, and runtime permissions. On Mac, a PROCESS-NAME rule doesn't guarantee reliable process information for every connection. Check the actual identification results in the connection details.
Proxy group names are config references too. The policy name at the end of a rule must exist in the config. If a subscription update renames a group while your local rules still use the old name, config validation may fail. When migrating, check rules, proxy-groups, and proxies together rather than copying only the rules section.
Rule providers aren't unique to mihomo
rule-providers stores rules in separate resources, which are then referenced by RULE-SET. Clash Premium also supports this feature; mihomo extends the available formats and rule expressions. When checking a rule provider, verify the behavior type, content format, download URL, and actual file contents.
Config fields: migrate TUN, DNS, and sniffing separately
TUN, rule mode, and global proxy are not the same thing
TUN receives traffic matching its routes through a virtual network interface; rule mode determines the outbound route for that traffic. With TUN enabled, rules can still send traffic directly. “Full-tunnel” describes how much traffic enters the tunnel, not whether every site uses the same proxy node.
On macOS, fields such as tun.enable, tun.auto-route, and tun.dns-hijack also need to work with the client's service management. Some clients rewrite these fields when generating the runtime config. Test the regular system proxy first, then enable TUN separately to distinguish node issues from permission or routing problems.
DNS: check exclusions when keeping fake-IP mode
fake-ip in dns.enhanced-mode assigns synthetic addresses to domains and keeps the mappings in the core; it isn't a regular public DNS address. Classic Clash also had this mechanism. mihomo mainly extends the available DNS strategies and handling options—it doesn't introduce an entirely new DNS module.
If your old config includes fake-ip-filter, keep any necessary exclusions for local domains and check how your current version interprets the filter mode. If local device names stop resolving, captive portal sign-in fails, or an app behaves unexpectedly, check the DNS logs rather than excluding every domain.
Sniffing: helps identify domains, but doesn't decrypt HTTPS content
sniffer can help identify target domains from observable protocol handshake data. It can't reveal the domain for every connection, and it isn't a way to decrypt traffic by installing a root certificate. Encrypted handshakes, app behavior, and protocol differences all limit what it can detect. When migrating an old config, don't turn on every sniffing option at once just to enable everything.
Will your old config work as-is? Check these three layers
Most older Clash configs using common node types, basic proxy groups, and traditional rules are a reasonable starting point for migration. But “valid YAML,” “fields accepted by the core,” and “apps can actually connect” are three different things. An import-success message in the client isn't the end of testing.
- Structure: Check indentation, duplicate keys, and list formatting. YAML uses spaces for indentation; quote passwords and names that contain special characters.
- Core compatibility: Check that node protocols, rule types, and field combinations are supported by your current version. Some unknown fields may be ignored, so passing validation doesn't mean every feature is active.
- Runtime: Check the config actually in use, listening ports, DNS results, and the policies matched by connections. Account for any overrides applied by the GUI client.
Local config validation example
If you have an executable mihomo binary and a local config, open Terminal, navigate to the relevant directory, and run the commands below. This example uses files named mihomo and config.yaml; replace them with the actual filenames on your Mac. If you use a GUI client, use its config validation tool where available rather than editing files inside the app bundle.
./mihomo -v
./mihomo -t -f ./config.yaml
The first command confirms the core version actually running; the second checks whether that core can load the config. Neither verifies every remote node, rule provider download, or website connection. Remote resources may also depend on network access and local caching, so check the runtime logs as well.
Keep subscription updates separate from local changes
Editing a file downloaded from a subscription can mean your changes are overwritten at the next update. A safer approach is to keep the original subscription and add local rules using the client's supported override or merge feature. Merge order varies by client, so inspect the final runtime config to see whether rules were appended or inserted earlier.
Migrating on Mac: test the system proxy before TUN
- Keep a rollback config. Export your current subscription and local overrides, and note the system proxy ports, selected proxy groups, and old core version. Quit the old client before migrating to prevent two processes from competing for ports or changing the system proxy at the same time.
- Check your Mac's chip and installer. Open Apple menu → About This Mac and check Chip or Processor. Apple silicon Macs generally use arm64 builds; Intel Macs use x64. Architecture affects how the app runs, not the basic YAML syntax.
- Import the config and check the logs. Start by resolving unsupported proxy types, missing proxy groups, and rule provider errors. Don't enable TUN, sniffing, and complex DNS overrides all at once.
- Check the system proxy. In macOS Ventura 13 and later, go to System Settings → Network → your current network service → Details → Proxies. Make sure the address and port match the ones the client is actually listening on.
- Verify rule matches. Visit one site expected to connect directly and another expected to use a proxy, then check the matched rule and outbound route in the client's connections view. A page loading successfully doesn't prove that routing is correct.
- Enable TUN if needed. After completing any required authorization or service installation, test Terminal, other apps, and local network access. If something breaks, turn TUN off first and compare the results with system proxy mode.
Test with an explicit port to avoid mistaking terminal behavior for a core issue
The example below assumes your config sets the mixed proxy port to 7890. If the client shows a different port, use that instead. This command explicitly specifies an HTTP proxy, so it doesn't depend on whether Terminal uses the macOS system proxy:
curl --proxy http://127.0.0.1:7890 --head https://example.com
An HTTP response shows that this explicit proxy request reached its destination, but doesn't prove that all apps are routed through the proxy or that the request used a remote node; the rules still determine the outbound route. If you see a connection error for 127.0.0.1:7890, check the local listener and port first—don't immediately switch subscriptions.
To test TUN, send a request without explicit proxy parameters and check whether Terminal has HTTP_PROXY, HTTPS_PROXY, or ALL_PROXY set. Otherwise, the request may still use the proxy specified by those environment variables, invalidating the test.
How to tell whether you need to upgrade to mihomo
- Your subscription uses newer protocols: First confirm that the core supports VLESS, Reality, Hysteria2, or TUIC, and that the relevant fields work with your current version.
- You need to route more apps: Also compare how each client manages macOS TUN services, handles permission prompts, and recovers from failures. Don't choose based on the core feature list alone.
- You need complex routing: Check logical rules, process detection, and rule provider formats, and test critical rules against real traffic.
- Your current setup is stable: Back it up before migrating and keep your existing test checklist. A core update can't compensate for poor node quality, network conditions, or an invalid config.
For Mac users, a reliable upgrade path is to confirm which core the GUI client actually runs, select a compatible subscription format, validate the config, and then test the system proxy, DNS, and TUN one at a time. mihomo expands protocol and routing support, but usable connections still depend on matching server settings, client integration, and local network configuration.
For details on config fields, see the protocol guide. If you run into port conflicts or the system proxy won't reset, follow the troubleshooting steps in the Help Center.