ClashFest

ClashFestClash Meta (Mihomo) client for Android โ€” phone & Android TV

๐Ÿฆฅ latest: v1.2.2 ยท 06 Oct 2026

Downloads

๐Ÿ“ฑ Phone & tablet

Every Android phone made in the last decade is 64-bit ARM. Not sure? Take this one.

โฌ‡ Download APK (arm64-v8a) 32-bit ARM (armeabi-v7a) โ€” very old phones, some TV boxes

๐Ÿ“บ Android TV, emulators, Chromebooks

Pick by CPU, or take the universal build that carries all of them.

Universal (all ABIs, largest) x86_64 โ€” emulators, Chromebooks, x86 TV boxes x86 โ€” 32-bit Intel

๐Ÿงช Dev build

Automatic build from dev ยท 77467a0 ยท 14 Sep 2026. Debug-signed: install alongside, not over, the release.

arm64-v8aarmeabi-v7auniversalx86_64x86What changed โ†’

Links always point at the newest release. Minimum Android 5.0; the app checks for updates itself under Settings โ†’ About & updates.

Releases

๐Ÿฆฅ ClashFest v1.2.206 Oct 2026

Pin the group your node comes from

Operators can now name the proxy group whose current node the Home Node row, the VPN notification and the profile card show: X-Brand-PrimaryProxyGroup: <group name> (base64: prefix for non-ASCII names). It is a policy header, so it works without X-Branding-Enabled. Picking a node in another group no longer changes what Home shows, and Change node in the notification opens the picker on that group. In Global mode Home shows GLOBAL, as before.

Home and the notification also stopped disagreeing about which group to read: they now share one rule.

Proxy groups as dropdown lists

The node picker has a new button next to the filter that switches between tabs and dropdown lists. In the dropdown view every group is a row with its current choice; tap it to expand its nodes. Each group has its own latency test. Search, sort and filter work inside every group, and while you search, groups without a match are hidden and the rest open by themselves. Your choice is remembered. Operators can set the default with X-Brand-ProxyGroupLayout: tabs|dropdown; once you use the button yourself, your choice wins.

Group tabs are now separated by thin dividers, so long rows of groups are easier to tell apart.

When was the subscription last updated

Subscription cards show Updated 2 hours ago (or just now).

This also fixes how the app knew that time. It used to take it from the newest file in the profile folder, and the active config is rewritten on every connect, so "last updated" really meant "last connected". With Update before connect on, a profile you connected to every day always looked fresh and was not updated before connecting. It now uses the time the subscription itself was downloaded.

REALITY works with old and new Xray servers

REALITY nodes now pick the right handshake on their own. Xray 24.x servers drop the X25519MLKEM768 key share, while 26.9.8+ servers require it, and a server never says which kind it is. In Auto (the new default) the app tries the classic handshake first, switches after a failure and remembers what worked for each server. Settings โ†’ Network offers Auto / Always / Never and the REALITY client version reported to servers that check minClientVer. This replaces the 1.2.1 on/off toggle; if you had turned it on, it becomes Always.

Fixes

  • Editing a rule no longer drops its options such as no-resolve or src.
  • JSON subscriptions are now hardened like YAML ones (local ports closed, allow-lan off), and in-app edits apply to them.
  • Live logs no longer leave a native subscriber running after you close them.
  • Less background work: the power-button animation runs only while Home is visible, the Settings tab is idle, and the app recovers when it reconnects to its service.
  • Ready for Android 16: Back in the profile editor still asks before discarding changes, and Back in Browse files goes up a folder.

Google Play and F-Droid

ClashFest is on its way to Google Play, and the F-Droid listing is in review. Both will ship the same package, signed with the same key as these GitHub builds, so you will be able to switch between them without reinstalling. Builds from Play and F-Droid are updated by their store and have no built-in update check.

Full Changelog: https://github.com/Nemu-x/ClashFest/compare/v1.2.1...v1.2.2

๐Ÿฆฅ ClashFest v1.2.102 Oct 2026

Hotfix: REALITY nodes that stopped connecting in 1.2.0

1.2.0 rewrote every REALITY node to offer the X25519MLKEM768 key share (for Xray-core 26.9.8+ servers). Many servers still run an older Xray that silently drops such a ClientHello, so whole subscriptions lost YouTube, Telegram and other routes after the update.

  • The rewrite is now off by default and lives under Settings โ†’ Network โ†’ "REALITY: offer ML-KEM (Xray 26.9+)". Turn it on only if your operator says their servers need it.
  • It is applied when the config is composed at connect time and is no longer written into the stored subscription.
  • Subscriptions imported or updated under 1.2.0 carry the rewrite in their stored copy; the app re-fetches every URL subscription once after this update to restore the operator's config. If a node still fails, tap Update on the profile.

Operators on current Xray can ship reality-opts.support-x25519mlkem768: true and client-fingerprint: chrome in the subscription themselves; mihomo honours them as-is.

Everything else from 1.2.0 is unchanged: https://github.com/Nemu-x/ClashFest/releases/tag/v1.2.0

๐Ÿฆฅ ClashFest v1.2.002 Oct 2026

Scan QR codes without Google

The in-app QR scanner no longer uses ML Kit. It is now a small camera view with the ZXing decoder that was already in the app for Companion pairing, so it works on phones without Google Play services and the APK lost the 5 MB native barcode model.

REALITY keeps working on new Xray servers

Xray-core 26.9.8+ rejects a REALITY handshake that does not offer the X25519MLKEM768 key share. ClashFest now turns on support-x25519mlkem768 for every REALITY node in your subscription and uses the chrome fingerprint when the node has none or one that cannot carry ML-KEM (in the current uTLS only chrome can). Nodes inside remote proxy-providers are out of reach for this; ask your operator to set the two fields there.

Hand-edited config stays edited

Editing a File profile's config.yaml through Browse files used to be undone on the next connect: the in-app DNS, hosts, tunnels, rules and provider edits were replayed over your text. Your edit now takes over (it already contains them), pressing Back asks before throwing an edit away, and the Files screen says so up front.

Rules Hub shows when a provider last updated

Each rule source row shows the time of the last successful download next to its interval, as a real date and time, while the VPN is running.

MIPS, mihomo's own network stack

Settings โ†’ Network โ†’ Stack Mode gains MIPS Stack (mihomo), the pure-Go userspace stack that became mihomo's default in 1.19.32. It can also come from a subscription (tun.stack: mips with Stack Mode on Auto) or from an operator's X-Network-Stack: mips. The app default stays System. The effective stack is now written to the Logs screen on every connect.

Fixes

  • DNS & Hosts crashed when a profile listed several IPs for one host (test.com: [1.1.1.1, 2.2.2.2]). The editor reads and writes such entries now; type them as test.com = 1.1.1.1, 2.2.2.2.
  • Hide-Routing brand header works on its own again: three tabs when the operator sets it, Operator in Routing's slot when paired with the Operator tab.
  • Per-profile User-Agent override was ignored on the very next fetch after choosing a preset; it now applies immediately.
  • An untrusted ASN database URL in a subscription was replaced by a country database and broke IP-ASN rules; it is now replaced by a trusted ASN mirror.
  • The DNS & Hosts toggle no longer says "experimental".
  • The Russian "app is broken" screen linked to the upstream repository instead of ClashFest.

Subscription requests identify the app and the core

Subscription downloads send mihomo/<core version> ClashFest/<app version>. Panels that pick the output format by the first token (Marzban, Remnawave) keep serving the Clash Meta format, and panels that gate protocols on the core version (mikan) can now see it. A per-profile User-Agent override still replaces the whole string.

Smaller APK

The bundled Country.mmdb is gone (the core only ever read geoip.metadb next to it) and unused post-quantum tables from the certificate library are no longer packaged, together with the scanner change about 8 MB less per architecture (compressed).

Core updated to mihomo v1.19.32

Highlights from upstream: the MIPS stack is the engine default with a new congestion-controller option (cubic / reno / bbr / bbr3), lazy receive buffers and checksum offload for it; CPU feature detection via auxv on Linux (hardware AES/SHA); MSS now accounts for TCP options; fixes for an anytls race, a nil dereference in HTTP/2 transports, sing-mux half-close, EasyTier restart after an overlay failure and mieru inbound UDP; utls 1.8.8, mieru 3.38, sing-tun 0.4.27. Full list: https://github.com/MetaCubeX/mihomo/releases/tag/v1.19.32

๐Ÿฆฅ ClashFest v1.1.014 Sep 2026

Test a single node

Tap the latency value next to any node in the picker and only that node is tested โ€” no more re-testing a 200-node group to check one server. The capsule shows โ€ฆ while the test runs and the result lands in place. Works in the Profiles tab list too, and falls back to a plain TCP probe when the VPN is off.

Notifications that say what happened

When a subscription update fails in the background, the notification now explains it in your language and offers the fix: Subscription expired (with the date) gets a Renew button, Device limit reached gets Support, and every failure gets Retry. Operators with branding see their name, colour and logo on it.

The persistent VPN notification shows the current node, the live speed, how many days are left on the subscription, and has Disconnect and Change node buttons.

Fixes

  • Rule mode routed everything through the proxy on some subscriptions (#205). Picking a node in one group used to rewrite every parent selector โ€” including the "direct" group โ€” so GeoIP rules looked broken. Only the group you tap changes now. If you were affected, open the direct group once and select DIRECT again.
  • HTTPS subscriptions failing with "certificate signed by unknown authority" on some devices: the core now ships its own Root CA bundle in addition to the system roots, like other Clash clients.
  • Light theme with an operator accent no longer renders the Settings tab with dark cards.
  • The "Days left" and traffic line on the Home card no longer gets cut off.
  • Quick-edit of a profile (โ‹ฎ โ†’ Edit) now actually applies the name, URL and interval you saved.
  • Operator policy headers (X-Network-Stack, X-Bypass-Preset) are honoured on every refresh, not only on a live fetch.
  • announce headers can use \n for line breaks; profile-web-page-url opens from the Operator tab and About when no cabinet link is set.

Under the hood

  • CI builds the core with the same patched Go 1.26 toolchain upstream Clash Meta uses.

Core updated to mihomo v1.19.31

Highlights from upstream: the new EasyTier outbound (recognised in the node list), stack: mips for TUN, identity-secret for ZeroTier, lower gVisor memory usage, and a long list of connection-cleanup fixes (hysteria/hysteria2 UDP, VLESS decryption panic, WireGuard nil-pointer, xhttp IPv6 URLs, OpenVPN tls-auth, AmneziaWG v3, DomainSet wildcard matching). Full list: https://github.com/MetaCubeX/mihomo/releases/tag/v1.19.31

๐Ÿฆฅ ClashFest v1.0.019 Aug 2026

Config scripts

A profile can now carry a JavaScript function that rewrites its configuration before the engine loads it โ€” change DNS, rules, proxy groups, anything, without editing YAML, and your changes survive every subscription update.

function main(config) {
  config.dns.enable = true
  return config
}

It uses the signature other Clash clients already implement, so scripts written elsewhere generally work here unchanged. Find it under Profiles โ†’ โ‹ฎ โ†’ Config script. Check runs the script against your real config and tells you what is wrong; Insert template gives you a working starting point.

A few things worth knowing:

  • A broken script never costs you a working tunnel. If a script stops working โ€” say an update removed a key it expected โ€” the app rebuilds the config without it and carries on, so a scheduled update at 3am does not leave you disconnected.
  • The app will not store a script that cannot run, so a profile never ends up carrying dead code.
  • Scripts get the config and nothing else: no file access, no network, no timers. One that runs longer than 3 seconds is stopped.
  • The app's own security pass runs *after* your script, so a script cannot weaken it.

Operators who do not want users rewriting the config they serve can send X-Brand-Lock-Config-Script: true.

See Config Scripts in the wiki.

Core updated to mihomo v1.19.30

Brings ZeroTier outbound support, AmneziaWG v3.0, H2C and QUICv2 sniffing, a substantially rewritten sniffer, and a long list of DNS and QUIC fixes.

Every proxy type is recognised again

The app's protocol tables had drifted behind the engine. zerotier and shadowquic were missing entirely, and openvpn, tailscale, gost-relay, sudoku, dns and rematch were not recognised in the offline node list โ€” those nodes worked, but showed up without a protocol badge.

All of them now render correctly, with colours grouped by protocol family. Also fixed: a ZeroTier node was showing its 16-character network ID where the transport badge belongs.

Font weight

The bundled faces ship at a light-ish weight that some people find hard to read. Settings โ†’ Theme now has a Regular / Medium / Semibold / Bold picker. Leaving it alone keeps the app byte-identical to before.

Refresh before connecting

Optional setting: update the subscription automatically before the tunnel comes up, so you connect with fresh nodes instead of yesterday's.

Battery

Cut background CPU and radio wakeups โ€” the dashboard no longer keeps work alive when nothing is on screen.

---

Upgrading: nothing to do, profiles and settings carry over.