Import
Chute can import proxy configuration written for other clients. Two kinds of input are accepted: single-node share links (ss://, vmess://, …), and whole profiles in Clash/mihomo YAML or sing-box JSON. Both are converted into native Chute configuration — what you get afterwards is an ordinary Chute profile with [Proxy], [Proxy Group] and [Rule] sections, not a foreign file that Chute keeps interpreting.
http:// and https:// addresses are never treated as share links. They are subscription addresses: the content is downloaded first, then imported according to what the body turns out to be.
Share Links
| Scheme | Resulting policy type | Default port |
|---|---|---|
ss:// |
ss |
8388 |
vmess:// |
vmess |
443 |
vless:// |
vless |
443 |
trojan:// |
trojan |
443 |
hysteria2://, hy2:// |
hysteria2 |
443 |
tuic:// |
tuic |
443 |
anytls:// |
anytls |
443 |
socks5://, socks:// |
socks5 |
1080 |
ssh:// |
ssh |
22 |
Most links use the userinfo@host:port?query#name shape. Two are different: vmess:// carries a base64-encoded JSON object (the v2rayN format, with the add / ps / scy / net / aid field names), and ss:// accepts both SIP002 (base64(method:password)@host:port) and the older whole-body base64(method:password@host:port) form. Base64 payloads may be unpadded and may use the URL-safe alphabet.
trojan://[email protected]:443?sni=example.com&alpn=h2,http/1.1#Tokyo%20Node
converts to:
[Proxy]
Tokyo Node = trojan, example.com, 443, password=password, tls=true, sni=example.com, alpn=h2|http/1.1
The text after # is percent-decoded and becomes the policy name; vmess:// takes it from the ps field instead. A link with no name is named host:port. Characters the configuration format reserves — =, ,, [, ], ", tab and newline — are replaced with spaces in the name.
Trojan, Hysteria2, TUIC and AnyTLS are TLS-only protocols, so tls=true is added even when the link does not spell it out.
Multiple links. A payload can be many share links separated by newlines, optionally wrapped in one outer layer of base64. Every line that parses becomes a policy, and repeated names get a 2, 3 … suffix so that rules and groups can still address each node individually. Lines that cannot be parsed are reported as warnings while the rest of the payload is still imported; the import only fails when nothing at all could be converted.
A link whose scheme is not in the table above is not recognized as a share link. A link with a known scheme but missing required fields is rejected with a message naming that scheme.
Supported Parameters
Only the query parameters below are read; anything else in a link is ignored.
| Parameter | Applies to | Converted to | |
|---|---|---|---|
sni, peer, servername |
All | sni |
|
alpn (comma-separated) |
All | alpn (values joined with `\ |
`) |
fp |
All | fingerprint (the uTLS ClientHello profile) |
|
allowInsecure, insecure, skip-cert-verify |
All | skip-cert-verify=true |
|
security=tls, xtls, reality |
All | tls=true |
|
pbk, sid |
REALITY | reality=true, public-key, short-id |
|
flow |
VLESS | xtls=true, flow |
|
type/network=ws + path, host |
All | ws=true, ws-path, ws-headers=Host:… |
|
type/network=grpc + serviceName (or path) |
All | grpc=true, grpc-service-name |
|
type/network=xhttp or splithttp + path, host, mode |
All | xhttp=true, xhttp-path, xhttp-host, xhttp-mode |
|
obfs, obfs-password, up, down |
Hysteria2 | Same option names | |
plugin=… |
Shadowsocks | See below |
A Shadowsocks plugin value is read as name;key=value;…. obfs-local / simple-obfs / obfs become obfs and obfs_param; v2ray-plugin in its (default) websocket mode becomes ws=true with ws-path and ws-headers. Any other plugin produces a warning and is not carried over — the resulting policy will not connect to a server that requires it.
Notice: A non-zero VMess
aid(alterId) is reported as a warning. Chute speaks VMess AEAD only, and a server still requiring the legacy MD5 handshake will not authenticate.
Profile Import
Three formats are recognized:
| Format | Handling |
|---|---|
| Native Chute/Surge profile | Used as-is, no conversion step |
| Clash / mihomo YAML | Converted to native configuration |
| sing-box JSON | Converted to native configuration |
The format is detected from the content, with the filename used only as a hint. Content starting with { is treated as sing-box JSON whatever the file is called (a sing-box profile saved as .yaml still parses as YAML, so the name alone cannot be trusted). Otherwise a .conf extension means native, .json means sing-box, and .yaml / .yml means Clash. When there is no usable filename — a subscription body, for instance — the first meaningful line decides: #!MANAGED-CONFIG or a [Section] header means native, and proxies:, proxy-groups:, rules:, proxy-providers: or rule-providers: means Clash. Anything else is treated as native.
A document that parses but contains none of the sections that define its dialect is rejected rather than reported as a successful import of nothing: Clash YAML needs at least one of proxies, proxy-groups, rules, proxy-providers or rule-providers, and sing-box JSON needs outbounds, endpoints or route.
A single unconvertible entry never fails the import. Each proxy, group and rule is converted on its own; the ones with no Chute equivalent are skipped and reported. The result carries the converted configuration, a list of warnings, and a list of the source fields that were skipped. The same warnings are also written into the converted text as comments, next to the section they came from:
[Proxy]
HK 01 = ss, example.com, 8388, aes-128-gcm, password
# KL-CONVERT-WARNING [proxies[3]]: proxy type 'snell' was skipped — Snell is a Surge-proprietary protocol KLNEKit does not implement
Finally, the converted text is re-parsed with Chute's own parser. Any line the parser rejects is commented out as # KL-CONVERT-DROPPED: … and reported, so a profile that is 95% convertible still imports and runs.
Node names are rewritten where they would break the configuration format: , becomes a space and = becomes -, and a name that then collides with another one gets a numeric suffix. Group members and rule destinations are rewritten to match, so every reference keeps pointing at the same node. direct proxies/outbounds are mapped onto the built-in DIRECT, and reject / block / dns onto REJECT.
Notice: A converted profile is a static snapshot. Chute re-downloads a subscription and parses it as a native profile, so a profile that had to be converted is saved without an auto-update URL and will not refresh itself.
Clash / mihomo Conversion Notes
Notice:
dialer-proxyis converted tounderlying-proxy. Chute parses and preserves that option but does not implement proxy chaining — a policy carrying it logs a warning and connects directly to its own server. Traffic that was chained under mihomo is not chained after the import.
- Proxy types converted:
ss,ssr,vmess,vless,trojan,http,socks5,hysteria2,tuic,anytls,wireguard,ssh. Types Chute has no implementation for —snell,hysteria(v1),mieru,juicity,shadowquic,trusttunnel,openvpn,sudoku,vmess-http— are skipped with a warning naming the protocol. Two more are skipped although Chute supports the protocol: amasqueproxy, because the mihomo field layout differs, and atailscaleproxy, which is configured once in the[Tailscale]section and used through the built-inTAILSCALEpolicy. - mihomo's two fingerprint keys mean different things and are kept apart:
client-fingerprintbecomesfingerprint(the uTLS ClientHello profile) andfingerprintbecomescert-fingerprint-sha256(a certificate pin). udp: falsebecomesudp-relay=false,tfobecomestfo=true, and an enabledsmuxblock becomesmux=true.- Group types
select,url-test,fallbackandload-balanceare converted with their health-check options. Arelaygroup is skipped — it is chaining, which is not implemented.use:members becomepolicy-provider:<name>references, andinclude-all/include-all-proxies/include-all-providersare expanded into an explicit member list. filterandexclude-filterare carried over quoted, but a pattern containing a comma or a quote cannot survive the configuration line format and is dropped with a warning.- Rule types are renamed where the names differ:
MATCH→FINAL,DST-PORT→DEST-PORT,SRC-IP-CIDR→SRC-IP.REJECT-DROPandREJECT-TINYGIFcollapse ontoREJECT; a rule targetingPASSorCOMPATIBLEis skipped. - An inline
rule-provider(type: inlinewith apayloadlist) is expanded into the equivalent concrete rules, since a Chute[Rule Provider]line cannot embed a payload. - General keys are mapped where an equivalent exists:
mixed-portbecomes the HTTPport(SOCKS5 needs its ownsocks-port),allow-lanbecomesallow-wifi-access,log-levelis mapped ontologlevel,external-controller/secretbecome the external HTTP controller options, and an enabledsnifferbecomessniffing-enabled.
sing-box Conversion Notes
- Outbound types converted:
shadowsocks,vmess,vless,trojan,hysteria2,tuic,anytls,shadowtls,wireguard,http,socks,ssh.selectorandurltestbecomeselectandurl-testpolicy groups. detourproduces a warning for the same reason asdialer-proxy: outbound chaining is not implemented, and the outbound dials its own server directly.route.rule_setentries become[Rule Provider]lines (type=httpfor remote,type=filefor local, always read as classical mihomo-YAML rule lists). A rule set in the binary.srsformat is rejected — Chute reads text rule payloads only.- Route rules follow the
actionkey:route/bypassuse the named outbound,rejectbecomesREJECT, andhijack-dns,sniffandresolveemit nothing because Chute controls those from[General]. multiplexsettings anddns.rules(per-domain DNS routing) have no equivalent and are reported as dropped.
Limitations
- Proxy chaining is not implemented. mihomo
dialer-proxy, sing-boxdetourand Clashrelaygroups all describe a chain; none of them produce chained traffic in Chute. - Options with no Chute equivalent are dropped with a warning rather than silently: per-proxy
ip-version,interface-name,routing-markandmptcp; per-groupexclude-type,disable-udp,interface-name,routing-markandicon; and the General keysbind-address,tcp-concurrent,geodata-mode,geox-url,find-process-mode,unified-delay,authentication,tproxy-port,redir-portand others. - Rule types with no equivalent are skipped:
GEOSITE,IP-SUFFIX,SRC-IP-SUFFIX,SRC-GEOIP,SRC-IP-ASN,DSCP,UID,SUB-RULE,PROCESS-PATH-REGEX,PROCESS-NAME-WILDCARD,PROCESS-PATH-WILDCARDandIP-ACCEPT. A rule carrying mihomo'ssrcmodifier is skipped as well, rather than matching on the wrong endpoint. mihomosub-rules(nested rule trees) are dropped. - Protocol details that Chute manages itself are not carried over: Hysteria2 port hopping (
ports), TUICheartbeat, AnyTLS session-pool tuning, WireGuardpeerslists (a single peer is configured) andworkers. - Transports Chute does not implement are reported instead of converted:
h2,httpobfuscation,httpupgrade, thev2ray-http-upgradeWebSocket variant, WebSocketmax-early-data, and XHTTPextra(XMUX / download-settings). - Clash's operating
modeis a runtime switch in Chute, not a configuration key; a profile inglobalordirectmode converts to rule mode with a warning. - YAML is read with a standard parser, so anchors and the
<<merge key work. A value written as a multi-line scalar is folded onto one line, because a newline would split the configuration line it lands on.