Sloth Clash

Sloth ClashClash Meta (Mihomo) desktop client — Windows · macOS · Linux

🦥 latest: v0.10.0 · 31 Oct 2026

Downloads

Verify downloads against SHA256SUMS (minisign-signed: .minisig).

Install via package manager (auto-updates)

Debian / Ubuntu

curl -fsSL https://nemu-x.github.io/SlothClash/apt/key.gpg | sudo tee /usr/share/keyrings/slothclash.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/slothclash.gpg] https://nemu-x.github.io/SlothClash/apt ./" | sudo tee /etc/apt/sources.list.d/slothclash.list
sudo apt update && sudo apt install sloth-clash

Fedora / openSUSE

sudo dnf config-manager --add-repo https://nemu-x.github.io/SlothClash/rpm/slothclash.repo
sudo dnf install sloth-clash

Arch Linux (AUR)

yay -S sloth-clash-bin      # or: paru -S sloth-clash-bin

Or a one-off install without an AUR helper: sudo pacman -U https://github.com/Nemu-x/SlothClash/releases/latest/download/sloth-clash-linux-amd64.pkg.tar.zst

Releases

🦥 SlothClash v0.10.031 Oct 2026

> ℹ️ You will be asked once to reinstall the helper service after this update. This release needs helper service 2.6.0, and the core changed; on Windows the installer handles it, on macOS and Linux click the banner and accept the prompt.

🔓 Desync (experimental): YouTube, Discord and your sites without a VPN

  • Desync makes services work on networks that block them by inspecting the TLS handshake, without sending that traffic through a VPN: the connection still goes straight to the real server, only its first packets are reshaped so the filter cannot match them. Strategies are found automatically, tested per service, remembered per network and re-checked in the background. Open it from the Desync chip on Home or Settings → Desync. It is marked Experimental: it may not work on every network, and its options can still change.
  • Covers YouTube, Discord (web, plus voice on Windows in TUN mode), and popular services with all their CDN domains so pictures and video load too: Facebook, Instagram, X.
  • My rules: send any domain, domain suffix or app (by process name) through Desync, directly, or through your VPN. Rules for a destination win over rules for an app.
  • No subscription? "Desync only" profile. On an empty Home choose *Unblock YouTube & Discord without VPN*: Desync routes, everything else direct, no servers needed.
  • With a subscription, only if you choose it. When adding a subscription, tick *Connect Desync to this subscription* (always unticked), or turn it on later. Desync runs in front of your subscription, and anything it cannot fix falls back to your subscription's rules (*Through VPN (Desync didn't work here)*). Settings are per profile.
  • Honest checks. Probes read real data (up to 64 KB over HTTP/2) instead of stopping at the headers, so a connection that opens and then freezes after the first kilobytes counts as a failure, not a success.
  • For providers: X-Desync-Desktop-Mode: off | deny on an HTTPS subscription switches Desync off for it or forbids it; a provider cannot switch it on. Every header the client sends and reads is now documented on the wiki (*Subscription Headers*).
  • Copy diagnostics produces an anonymised report (no URLs, names or IPs) to attach to a bug report.

🛰️ REALITY: works with current Xray servers

  • Fixes timeouts against Xray 26.9.8+ (which requires the post-quantum X25519MLKEM768 key share) and against servers that set minClientVer. The core now learns per server which handshake it needs, sends a current client version, and offers reality-mlkem / reality-client-version settings for the stubborn cases.
  • firefox and safari fingerprints now send current Firefox 148 / Safari 26.3 hellos with the post-quantum share, the same ones genuine Xray clients send, instead of silently switching to Chrome's. Checked against Xray 24.12.31 up to 26.10.29.

🧩 More of your panel's configs just work

  • Configs written for Citrus-based panels load as-is: VLESS over XDrive, type: chain groups, per-proxy REALITY client version, mldsa65-verify, Xray fingerprint names, comma-separated pins and names, Xray-style ECH, OpenVPN server identity, QUIC disable-mtu-discovery, tcp-connect-timeout, sniffer.skip-threshold, dns.serve-expired. The subscription User-Agent now lists these capabilities, so panels can hand them out only to clients that support them.

🏢 Corporate VPN

  • Certificate rotation handled. When the gateway renews its certificate, you now get a clear prompt showing the new certificate to trust, instead of an endless failure caused by the old pinned certificate. Nothing is ever trusted automatically and TLS verification is never turned off.
  • macOS 12 and newer. The macOS OpenConnect component is now built for macOS 12+; the previous one needed macOS 14 (Apple silicon) or 15 (Intel).

📺 Remote control for paired devices

  • From a paired device's page you can now pick nodes and run delay tests, switch mode and profiles, update providers, list and close connections, and watch live traffic and logs, not just turn the VPN on and off.

🔧 Smaller improvements and fixes

  • Connections: close a single connection, or every connection matching your search.
  • Subscriptions: failed updates are shown and retried sensibly instead of being swallowed, and "updated" means a new config was actually downloaded. Profiles created by older versions keep auto-updating after their first manual refresh.
  • Large subscriptions, connection lists and proxy lists are no longer silently cut off at an internal size limit (which could drop nodes); limits were raised to measured realistic sizes and an oversized response is now reported as an error.
  • Under the hood: the desktop backend and UI were reorganised into smaller modules, with new test harnesses for the core lifecycle and golden tests for the generated config. Go 1.26.10 toolchain.
  • Mihomo core updated to v1.19.33, built with our patch series in every release.

What's Changed

Full Changelog: https://github.com/Nemu-x/SlothClash/compare/v0.9.4...v0.10.0

🦥 SlothClash v0.9.401 Oct 2026

> ℹ️ You may be asked once to reinstall the helper service after this update. The privileged service only spawns cores whose hash it has pinned, and the core changed — on Windows the installer re-pins it silently, on macOS click the banner and accept the prompt.

🐧 Linux: the helper service and TUN mode now actually work

  • Until now the Linux build ran the core in-process and never talked to the privileged helper, so TUN had no root path and "Install service" could not do anything useful (reported on Arch/Garuda, issue #73). The Linux app now uses the same helper as macOS over a unix socket: Install service asks for authorisation through polkit (pkexec), installs a systemd unit that only your user's group can reach, pins the shipped core by hash exactly like on the other platforms, and the app routes the core through it. TUN mode is then available; Proxy mode keeps working without the helper as before.
  • No polkit on your system, or the prompt was dismissed? The app shows the exact sudo … command to run once instead; the files it points at are kept in the app data directory, not in /tmp (which is often mounted no-exec).
  • If the service is installed but its socket is not up, you get the same "reinstall the helper service" banner as on the other platforms instead of a bare connection error.

📦 Linux AppImage is now self-contained and updatable

  • The AppImage bundles GTK and WebKitGTK, so it runs on any distro from Ubuntu 22.04 up without installing webkit2gtk-4.1 first (the old one needed it from the system). It carries update information, so AppImageUpdate and compatible tools can fetch new releases as deltas, and ships AppStream metadata for app stores. Asset names follow the AppImage convention: SlothClash-x86_64.AppImage and SlothClash-aarch64.AppImage (the old SlothClash-linux-*.AppImage links stop working with this release). Submitted to the AppImage catalog.

🐛 "Reinstall the helper service" banner did not appear when it was needed — fixed

  • After a core update, macOS users saw a raw HTTP 503 … does not match any pinned hash error on Connect and no hint what to do. The app already knew this meant "the helper service is pinned to the previous core, reinstall it", but that flag only reached the banner on the next app start. The banner now appears the moment the condition is detected — at startup, before you even press Connect, or right after a failed connect — with the one-click reinstall.

🔧 Subscription requests now identify the real core and app version

  • The User-Agent on subscription downloads is now clash.meta/v<core> SlothClash/<version> (for example clash.meta/v1.19.32 SlothClash/0.9.4) instead of a hard-coded clash.meta/mihomo; SlothClash/1.0. Panels that pick which protocols to hand out by the client's core version (mikan, among others, gates mieru, sudoku, trusttunnel, shadowquic and Hysteria2 Gecko on it) now receive the right answer. The leading clash.meta/ is kept on purpose: Marzban and Remnawave select the clash-meta output format by that prefix. If a build has no core version baked in, the UA falls back to clash.meta/mihomo SlothClash/<version> rather than inventing a number.
  • Mihomo core updated to v1.19.32. Fixes: effective MSS now accounts for TCP options, a race in AnyTLS idle-session cleanup, OpenVPN P_DATA_V1 AEAD additional data, sing-mux half-close, a nil dereference when an H2 connection setup is cancelled, mieru inbound UDP user metadata, EasyTier restart after a silent overlay failure, and HWCap detection on Linux. New: load-balance hash-key to pin a session on the inbound user, congestion-controller option for TUN, and the core's own mips userspace stack (its new upstream default). Sloth Clash keeps gvisor as its default TUN stack, the one proven on wintun under UDP load; mips is now an explicit choice in the TUN settings dialog for those who want to try it.

What's Changed

Full Changelog: https://github.com/Nemu-x/SlothClash/compare/v0.9.3...v0.9.4

🦥 SlothClash v0.9.320 Sep 2026

> ℹ️ You may be asked once to reinstall the helper service after this update. The privileged service only spawns cores whose hash it has pinned, and the core changed — on Windows the installer re-pins it silently, on macOS click the banner and accept the prompt.

✨ The tray icon now shows what is actually running

  • Requested by users: like the other Clash desktops, the tray icon changes with the live mode instead of always showing the same sloth. Disconnected: plain icon. Connected with the system proxy set: a green dot. TUN mode: a blue ring. The dot-versus-ring difference is deliberate so the two connected states stay distinguishable on monochrome menu bars. Hovering the icon spells it out ("Sloth Clash · TUN mode"). Windows and macOS.
  • New Settings → Appearance option Tray icon: system default (colorful on Windows, monochrome template on macOS), colorful, or monochrome. Applies within a second, no restart.

🐛 "Start minimized", "Auto-connect on startup" and "Close to tray" could silently switch themselves back on — fixed

  • Reported by a user: after enabling all of them, turning them off did not stick (only "Launch on startup" did). Those three toggles were stored only in the embedded browser's local storage, which is written to disk on a delay and only flushed on a clean shutdown: a reboot with the app parked in the tray, an update, or a crash could throw the change away. "Launch on startup" lives in the registry, which is why it was the one that survived. All three now live in the app's own settings file and are written the moment you click, like the rest of the backend settings. Existing values are migrated on first launch; nothing to redo.
  • Side effect you will notice: with "Start minimized" on, the window no longer flashes on screen for a moment before hiding — the app now starts hidden natively.
  • Mihomo core updated to v1.19.31. Fixes in the core: Hysteria v1 UDP handling restored, Hysteria2 UDP sessions no longer leak when a connection closes, IPv6 URL parsing in XHTTP, a nil-pointer crash in WireGuard initialisation, a VLESS decryption cleanup panic, AmneziaWG v3 RandomPaddingAddition / DisableCookies, OpenVPN tls-auth HMAC digest, DomainSet wildcard matching with overlapping rules, and a batch of "connection not closed after error" leaks across outbounds (DoQ, mKCP, Snell, KCPTun, TUIC). New: EasyTier outbound, stack: mips for TUN, identity-secret for ZeroTier. Also lower memory use in gVisor and the config converter, and updated Tailscale (1.102.3), Mieru and Sudoku (0.5.0) libraries. Config generation and the runtime pipeline were verified against the new core.
  • Linux: "Install service" now tells the truth. The Linux build runs the core in-process and does not talk to the privileged helper yet, so the button used to launch an installer without elevation, trigger a stray password prompt from systemctl and then fail with a permission error nobody could act on. It now says that the helper service is not wired on Linux yet and that Proxy mode is the supported path, instead of pretending to install something the app would never use. Privileged TUN on Linux is tracked as its own change.

What's Changed

Full Changelog: https://github.com/Nemu-x/SlothClash/compare/v0.9.2...v0.9.3

🦥 SlothClash v0.9.203 Sep 2026

> ℹ️ You may be asked once to reinstall the helper service after this update. The privileged service only spawns cores whose hash it has pinned, and the core changed — on Windows the installer re-pins it silently, on macOS/Linux click the banner and accept the prompt.

✨ JavaScript config override — the escape hatch the other editors can't cover

  • A profile can now carry a function main(config, ctx) that rewrites its generated configuration before the core sees it. It is for everything the extend-config / proxy-groups / rules editors cannot express, because they are declarative and this is not: rename every node matching a pattern, build one group per country, drop nodes by name, apply a tweak only in TUN mode. Open it from a profile's context menu → Script (JS).
  • Preview before you apply. The preview runs your script through the real generation pipeline twice — with and without it — and shows a side-by-side diff of the two configs plus anything you console.log. It writes nothing and does not touch the running connection, so it is safe to press while connected.
  • A broken script can never break your VPN. Syntax error, thrown exception, endless loop, a value that cannot be written to the config — the script's output is discarded, the configuration is generated exactly as it would have been without a script, and the reason (with line and column) is shown in the editor and badged on the profile. Connecting still works.
  • A script cannot cut the app off from its own core. The proxy port, the controller endpoint and its secret, and the corporate-VPN split are re-applied after your script runs. Everything else — DNS, TUN, sniffer, rules, proxies, groups — is yours.
  • Scripts run in a sandboxed interpreter with no filesystem, network, process or timer access, a fresh state on every run, a 3-second limit and a bounded output buffer. A script can only ever come from your own editor: a subscription, a provider header, a share link or an imported profile can never set one. Full API reference: docs/SCRIPT_OVERRIDE.md.

🐛 Sites felt slower than they should — dead IPv6 addresses handed to apps, fixed

  • On profiles whose TUN section excludes the private IPv6 range (fc00::/7 — a very common default), the IPv6 addresses we handed out for every domain had no route into the tunnel. Apps still tried them first: the browser burned a full connection timeout on the IPv6 attempt of every dual-stack site before falling back to IPv4, which showed up as pages (YouTube, Google Fonts and friends) taking seconds to pull assets, with nothing in the logs. Measured: curl -6 hung for 21 s where curl -4 finished in 0.27 s. We now drop the IPv6 fake-address pool whenever the profile's own routing rules would leave it unreachable, so apps go straight to the working path. IPv6 itself stays enabled and still travels inside the tunnel — nothing leaks.

🐛 A broken dns: section in a hand-edited profile was silently swallowed

  • If a profile's DNS section was malformed (a list where a mapping belongs, typically from a hand-edited merge template), the pre-launch check quietly replaced it with defaults instead of telling you the core had rejected it. The real error is now surfaced.
  • Mihomo core updated to v1.19.30. Brings a security fix in the core's Go TLS stack (CVE-2026-56862) and a TUN fix where hijacked DNS replies could be sent zero-filled or stale. New protocol coverage lands with it: ZeroTier outbound, AmneziaWG 3.0/3.1, an ip-stack option for WireGuard/OpenVPN/MASQUE/ZeroTier, H2C and QUICv2 sniffing, handshake-timeout for Hysteria2, client-metadata for AnyTLS and rate-limit for the restls listener. Config generation and the runtime pipeline were verified against the new core.

What's Changed

Full Changelog: https://github.com/Nemu-x/SlothClash/compare/v0.9.1...v0.9.2

🦥 SlothClash v0.9.108 Aug 2026

🐛 Auto-connect on startup could hang on "connecting" — fixed

  • With Auto-connect on startup enabled, the connection could get stuck on "connecting" after launch. A background startup task claimed a connect "generation" *after* the auto-connect had already fired, which aborted the auto-connect's attempt and left the status hanging. The startup ordering is fixed so auto-connect — and a fast manual Connect — can no longer be superseded that way, and auto-connect now waits for the background boot to settle before firing and retries only on a real failure. (Auto-connect is off by default; only users who enabled it were affected.)

What's Changed

Full Changelog: https://github.com/Nemu-x/SlothClash/compare/v0.9.0...v0.9.1