⚡ ClashFest v0.7.0
✨ Highlights
- 🗂️ Profiles redesign — profiles now live in a dedicated tab with collapsible proxy groups for faster navigation.
- 🧾 Per-profile config viewer — inspect a subscription's processed
config.yamlread-only with YAML syntax highlighting, copy, share, or download it. Works offline and does not require VPN to be running. - 🔗 Simpler proxy chain — build chains with two searchable pickers: First hop → Exit. The Exit is the IP you show online.
- 💾 Explicit chain actions — choose between Save chain and Use now (Global), with an optional YAML preview before applying changes.
- 🔄 Reworked update flow — manual update checks now show an in-app result instead of a silent notification.
- 🏠 Better update visibility — the Home screen now surfaces when a new update is available.
- ⚙️ About & updates — About and update management are now merged into a single place.
🗂️ Profiles
Dedicated Profiles tab
Profiles have moved out of the old mixed flow and into their own dedicated tab.
Proxy groups are now displayed as collapsible accordion sections, making large subscriptions easier to scan and navigate without losing context.
Processed config viewer
Each profile can now show its processed config.yaml directly inside the app.
The viewer is read-only and supports:
- YAML syntax highlighting
- copy
- share / download
- offline access
- usage without VPN
This makes it easier to debug what ClashFest actually generated after importing or refreshing a subscription.
🔗 Proxy Chain
The proxy-chain setup flow has been simplified around two clear choices:
- First hop — the first proxy used in the chain
- Exit — the final proxy, and the IP you expose online
Both selectors are searchable, so large proxy lists are easier to work with.
The action model is now explicit:
- Save chain stores the selected chain for later
- Use now (Global) immediately applies it to Global mode
An optional YAML preview is available before applying the generated chain.
🔄 Updates & About
Manual Check for updates now returns a visible in-app result instead of relying on a silent notification.
The About screen has been merged into About & updates, keeping version info and update actions in one place.
The Home screen now also shows when an update is available, so releases are harder to miss.
🛠️ Improvements & Fixes
Routing rules
The Routing Rules screen has been simplified.
The low-value Add rules UI was removed, including:
- presets
- manual rule creation
- online rule creation
The screen now focuses on the actions that are currently useful:
- view rules
- toggle rules
- delete rules
This release also fixes routing-rules UI behavior and screen-header alignment.
Branding
Fixed an accent-color recreate loop that could cause unnecessary UI recreation.
Brand refresh handling was also corrected for cases where header updates stop arriving.
Performance
Removed an N+1 profile-query pattern, reducing unnecessary database work and making profile-related screens more efficient.
🛡️ Stability & Security
Mihomo core update
The bundled Mihomo core engine has been updated to v1.19.26.
JNI hardening
The JNI boundary is now protected with recover().
A panic inside the native bridge should no longer terminate the whole app with SIGABRT.
Safer deep-link config installation
Installing a config from a deep link now requires an explicit confirmation prompt.
This reduces the chance of accidentally installing a config from an external source.
Port-handling audit fixes
This release also includes port-handling and related security audit fixes.
🧪 Under the Hood
This release includes a large unit-test backfill across several modules:
commonservicecorenetwork
Additional code-health cleanup includes:
- removed dead flags
- removed unused strings
- backfilled Russian localization
- backfilled Chinese (
zh) localization
What's Changed
- Chore/core 1.19.26 by @Nemu-x in #39
- Fix/audit service bug1 sec2 by @Nemu-x in #40
- fix(app): harden external VPN control + fix hidden-icon startup crash (SEC-3, BUG-3/4/5) by @Nemu-x in #41
- docs(agents): actualize AGENTS.md (geo allowlist, tun0 gate, external control, JDK 21) [DOC-1, DOC-2] by @Nemu-x in #42
- fix(security): strip global proxy ports in Strict to close cross-UID listener leak (SEC-1) by @Nemu-x in #43
- fix(app): deeplink url-only + scope cleanup + redact brand-logo URL logs [DL-1, Q-1, LOG-1] by @Nemu-x in #44
- chore(core): recover() at the JNI boundary so a bridge panic can't SIGABRT (BUG-2) by @Nemu-x in #45
- i18n(ru): backfill missing design strings [I18N-R2] by @Nemu-x in #46
- i18n(zh): backfill missing design strings [I18N-R2] by @Nemu-x in #47
- fix(design): rework Routing Rules screen header, compact controls, AND-rule rendering by @Nemu-x in #49
- feat(design): unify screen headers to Material 3 large-header style by @Nemu-x in #50
- feat(rules): remove rule-adding UI, make Routing Rules read-only by @Nemu-x in #51
- feat(profiles): clean single-header Manage profiles, flat in-flow layout by @Nemu-x in #52
- feat(profiles): full manager in Profiles tab + collapsible proxy groups by @Nemu-x in #53
- chore(rules): remove dead add-rule sheet + orphaned strings by @Nemu-x in #54
- feat(profiles): read-only config.yaml viewer + trim profile menu by @Nemu-x in #55
- test(common): unit tests for BrandValidation + LogRedaction by @Nemu-x in #56
- test(service): unit tests for ProxyHardener, ProxyPropertyGuard, ProxyProvidersUi by @Nemu-x in #57
- test(core): unit tests for Traffic formatting/scaling by @Nemu-x in #58
- test(net): unit tests for HttpTextFetcher + BrandManifestParser by @Nemu-x in #59
- fix(security): confirm install-config deeplink before creating a profile by @Nemu-x in #60
- Fix/brand accent recreate loop by @Nemu-x in #61
- chore(branding): remove dead hideStats/hideLogs operator flags by @Nemu-x in #62
- perf(profiles): fix N+1 queries when listing profiles by @Nemu-x in #63
- chore(code-health): drop unused ping var and url parameter by @Nemu-x in #65
- test(service): unit tests for RuntimeSocksAuth session hardening by @Nemu-x in #66
- feat(updates): in-app manual update check + About & updates by @Nemu-x in #67
- fix(proxy-chain): flip chain direction so exit = last field by @Nemu-x in #68
Full Changelog: v0.6.1...v0.7.0