You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Bug Fixes
Invalid TUN Descriptors No Longer Trigger a Log Storm — The embedded core now treats Darwin bad file descriptor and socket operation on non-socket read failures as closed TUN devices instead of retrying forever. ClashFX also recognizes either signature as an immediate Enhanced Mode recovery signal and rate-limits the errors independently of unrelated traffic logs, preventing the CPU, memory, and UI lockup seen during some post-reboot starts.
修复
无效 TUN 描述符不再引发日志风暴 — 内嵌核心现在会把 Darwin 的 bad file descriptor 和 socket operation on non-socket 读取错误视为 TUN 已关闭,不再无限重试。ClashFX 也会把两种错误都识别为增强模式的立即恢复信号,并独立于其他流量日志进行限流,避免部分重启后首次启动时出现 CPU、内存持续增长及界面卡死。
Bug Fixes
Large Selector Benchmarks Finish Without a Retry Tail — Selector rows now use a bounded rolling pool of 8–12 requests, settle failures immediately instead of retrying them after the full pass, and reuse successful direct-leaf measurements from the selected automatic-group retest only when URL, timeout, expected-status semantics, and provider identity match. Mihomo's fresh now remains authoritative. (#147)
Quitting Reliably Restores the Original System Proxy — Proxy transitions now serialize the complete asynchronous Helper operations, block new enable/recovery work while quitting, and avoid a second disable after restoration. ClashFX reads the settings back before exiting; a failed, timed-out, or mismatched restore keeps the original snapshot and cancels termination so the user can retry. (#147)
Old Delay Results No Longer Make Usable Menus Look Disabled — The 30-minute stale state no longer fades whole node rows or automatic-group menus. Nodes remain normally legible and selectable while current, failed, and unavailable delay badges continue to describe benchmark state. Automatic-group child rows also retain the newest applicable global measurement. (#147, #219)
Legacy WebKit Theme Colors Are Converted Instead of Turning Black — The dashboard compatibility layer now detects real color-mix() support with CSS variables and converts RGB, Lab, and OKLab fallback colors on older Safari/WebKit engines, preventing dark themes from losing their intended backgrounds and contrast. (#221)
Contributors
@a51095 — Reported slow Selector completion, proxy restoration on quit, and stale rows appearing disabled. (#147)
Selected Automatic Results Arrive Before the Selector Retry Tail — A selected automatic group is now retested first with its own URL and expected status, then published from Mihomo's fresh now before leaf rows begin. Selector concurrency grows only after complete launch cohorts settle, is capped at twelve, and retries at most four failed targets, preventing a long failure tail from hiding the result users asked for. (#147)
Automatic-Group Leaf Delays Are Visible and Generation-Safe — Automatic-group submenus now render URL-scoped delay badges for every direct candidate. Results carry group membership, benchmark URL, expected status, session identity, and expiry metadata, so provider changes and late callbacks cannot leave misleading group or leaf values behind. Mihomo's fresh now remains the only authority for the selected path. (#219)
Dashboard Themes Persist and Legacy WebKit Renders Safely — Opening or upgrading the dashboard now clears only volatile caches and preserves local storage, cookies, and IndexedDB. A capability-gated compatibility layer replaces unsupported color-mix() transparency on older WebKit and supplies cached theme preview colors without forcing layout for every theme. (#221, #223)
Global Delay Results Remain Visible in Node Lists — The top-level benchmark now retains each inline and provider leaf result with its test URL and session identity. Reopening a Selector keeps the newest applicable measurement even when that Selector uses a different configured test URL, while newer group-scoped evidence still wins. (#225)
Runaway Enhanced-Mode Cores Are Captured and Recovered — ClashFX now measures the managed Mihomo process's CPU time by launch identity and PID. Sustained near-single-core usage first saves a thread sample, then rebuilds Enhanced Mode if the condition continues, with startup grace, active-traffic suppression, and a recovery cooldown to avoid reacting to legitimate or short-lived work. The diagnostic report records the watchdog state. (#226)
修复
选中的自动策略会在 Selector 重试尾部之前返回 — 当前选中的自动策略会优先使用自身 URL 与 expected status 重测,并依据 Mihomo 最新 now 发布结果,随后才开始叶子节点测速。Selector 只会在完整启动批次结束后调整并发,上限降为 12,且最多重试 4 个失败目标,失败尾部不再长期遮住用户最关心的结果。 (#147)
Large Selector Benchmarks Stream Results Without Connection Bursts — A continuously replenished, bounded request pool now publishes successful rows as soon as they finish instead of waiting for a whole batch or the complete test. Only first-pass failures receive one conservative retry, so large nested groups finish sooner and no longer appear frozen for roughly 50 seconds. (#147, #219)
Delay Results Remain Useful Without Distorting Automatic Groups — Recent measurements survive menu reconstruction and remain visible after reopening the menu; older results fade before expiring. Automatic rows keep stable names, expose the final leaf separately, and use Mihomo's fresh now after an explicit group retest rather than inventing a UI-side selection. (#147, #219)
Sleep/Wake Recovery Is Bounded, Generation-Safe, and Diagnosable — Delayed callbacks from an earlier wake can no longer keep the menu in a loading state or overwrite a newer recovery. Wake checks use bounded backoff, preserve failure evidence, and add a lightweight diagnostic breadcrumb/watchdog without taking destructive action in the background. (#147, #210)
Restart and Settings State Stay Stable — Self-restart waits for the old process to exit before launching its replacement, preserves Enhanced Mode on helper failure, and gives the status item a persistent identity so its menu-bar position is retained. Configured proxy ports are no longer replaced by runtime auto-port values, automatic ports are explained in place, and Settings group titles no longer clip. (#219)
Custom Shortcuts Distinguish Real Duplicates From Warnings — Shortcuts already assigned inside ClashFX remain blocked, while menu or common system conflicts such as Command-E are shown as warnings and can still be accepted. Function keys remain available without modifiers, and failed registrations roll back cleanly. (#218)
Large Selector Benchmarks Adapt to Current Conditions — Selector tests now begin with eight requests, grow through twelve to a maximum of sixteen after healthy current-run results, and fall back toward four when failures cluster. On the supplied 49-target configuration, two isolated adaptive runs completed in 7.4–9.0 seconds with 37 successes, versus about 25–26 seconds and 35–36 successes at fixed concurrency four. A Clash Party-style 50-request burst was faster but reduced the number of sub-300 ms results from roughly 9–11 to 1. Test URLs, timeouts, returned delays, and color thresholds are unchanged. (#147)
Manual Benchmark Default Matches ClashX Again — The default is again the ClashX-compatible http://cp.cloudflare.com/generate_204. Only the superseded built-in https://cp.cloudflare.com/generate_204 value is corrected once; custom HTTP/HTTPS URLs remain unchanged, and a later explicit HTTPS choice stays valid. An isolated comparison produced green HTTP results while HTTPS produced none. (#147)
System Proxy Settings Restore Exactly After Disable or Quit — Before taking over, ClashFX now captures each existing network service's complete HTTP, HTTPS, SOCKS, PAC, exception, and partially enabled proxy state. Turning System Proxy off or quitting restores that exact state once; services created later stay untouched, and Helper failures are reported instead of being treated as success. (#147)
Managed Configuration Updates Always Settle — Remote subscription updates now have bounded cancellation and one serialized completion path. A failed or stalled request can no longer leave the configuration row stuck at “Updating,” and late callbacks cannot overwrite a newer result. (#147)
Benchmark Paths and Automatic Results Are Release-Verified — Selector benchmarks retain ordered visible rows while sharing equivalent path measurements; nested rows show the fresh selected leaf and result without re-evaluating automatic policy. Explicit automatic retests use the group's own settings and display Mihomo's fresh final path/result, while failures and cancellation settle without stale UI or repeated terminal refreshes. Automatic groups are not forced to choose the smallest displayed latency. (#147)
Contributors
@a51095 — Reported the proxy restoration, managed-update, and benchmark-result issues and verified the six release acceptance flows. (#147)
Custom Benchmark URLs Save Reliably — The proxy delay-test URL field now accepts HTTP and HTTPS addresses correctly and saves valid changes immediately, with an explicit Save button for confirmation. Clearing the field restores the default endpoint, while invalid input no longer overwrites the last working URL. (#147)
Contributors
@a51095 — Reported that changing the proxy delay-test URL reverted after leaving Settings. (#147)
Diagnostic Reports Protect Local Details — The complete diagnostic report now removes macOS home paths and usernames, local IP and MAC addresses, hostnames, credentials, and other machine-specific details before it is copied for sharing. (#147)
Log Times and the Latest Log Are Easier to Find — Log lines and filenames now use local time with an explicit UTC offset. “Open Log Folder” also selects the newest log directly instead of relying on Finder's current sort order. (#147)
Contributors
@a51095 — Reported the confusing log timestamps and ordering, and provided the diagnostic file that exposed incomplete redaction. (#147)
Large Strategy-Group Benchmarks Stay Responsive — Large Selector menus now use more conservative benchmark concurrency so the local connection pool and test endpoint are not flooded, reducing uniformly inflated delays and widespread failures. Nested automatic rows keep stable names, long labels truncate cleanly, and delay badges remain readable without resizing the open menu. (#147)
System Proxy Recovers After a Cold Startup — After a reboot or unexpected shutdown, ClashFX now waits for the configuration, core, privileged helper, and network to become ready before verifying and restoring the macOS System Proxy. Recovery is bounded and stops immediately if the user disables System Proxy or switches to Enhanced Mode. (#147)
Delay Test Menu Stays Open on the First Click — Starting a delay test no longer disables the active custom menu item, which could make AppKit close the proxy menu before showing progress. Repeat clicks are still rejected by the active benchmark session.
Never-Matched Rules Reliably Hide Epoch Times — Rule timestamps are now normalized in ClashFX's native Dashboard response layer, including cached snapshots, so release-time Dashboard replacement can no longer bring back “57 years ago.” (#147)
Selected-Group Delay Tests Avoid Duplicate Work — When a selector contains a URLTest group and the same leaf nodes, ClashFX now tests that automatic group once with its configured URL and skips individually retesting the nodes it already covered. Large groups finish sooner without bringing back provider-wide health checks. (#147)
Automatic Groups Re-evaluate After Complete Results — A URLTest started from the controller now clears any choice cached while candidates were still responding, then applies the configured tolerance to the complete result set. Early responses can no longer remain selected after slower candidates finish. (#147)
Contributors
@a51095 — Reported the remaining selected-group delay-test slowdown and automatic-group selection behavior. (#147)
Never-Matched Rules No Longer Show “57 Years Ago” — The bundled Dashboard now removes epoch timestamps from rules with no hits or misses, so only real recent-match times are displayed. (#147)
Delay Tests Stay Within the Selected Group — Provider-backed nodes are now tested individually through their provider instead of benchmarking every node in the provider. Large groups complete faster, avoid unrelated failures, and keep the existing concurrency limit. (#147)
macOS 10.14 Launch Compatibility Is Restored — Removed the incompatible AppCenter Analytics and Crashes binaries that referenced Objective-C runtime symbols unavailable on Mojave, while keeping ClashFX's macOS 10.14 deployment target. (#197)
Contributors
@a51095 — Reported the incorrect recent-match time and the slow, failure-heavy delay-test behavior. (#147)
@wzh2dev — Diagnosed the macOS 10.14 launch failure and traced it to AppCenter/PLCrashReporter. (#197)
Enhanced Mode Now Detects Silent Data-Plane Failures — Runtime monitoring now verifies the core's DIRECT outbound path and DNS resolution in addition to the controller and TUN interface. Three confirmed core-only failures trigger a bounded rebuild, while unavailable system connectivity is treated as inconclusive to avoid restart loops. (#147)
Recovery Captures Evidence Before Restarting the Core — Every external-core launch now has a unique capped log, launch and termination metadata, and an on-demand process sample. Automatic recovery records this evidence before rebuilding, and a failed startup can restart the Helper host once instead of leaving a stale external core behind. (#147)
Proxy and Rules Views Survive Brief Core Interruptions — The menu and Dashboard preserve their last valid proxy/rules snapshot when the local controller is temporarily unavailable. The Dashboard clearly marks cached rules as stale instead of showing an empty page, so a recovery no longer looks like the user's rules disappeared. (#147)
Contributors
@a51095 — Reported that long-running Enhanced Mode could partially stop loading external sites and recover only after restarting ClashFX. (#147)
修复
增强模式现在可识别数据面的静默失效 — 运行时监控除了检查控制接口和 TUN 网卡,还会验证核心的 DIRECT 出站链路及 DNS 解析。仅当系统直连正常且核心连续三次失败时才会执行有界重建;系统网络本身不可用时会视为无法判定,避免反复重启。 (#147)
Large Delay Tests No Longer Trigger Enhanced Mode Restarts — Manual benchmarks now share a bounded eight-request queue, cancel cleanly before recovery, and use control-plane health thresholds that tolerate short load spikes. Testing a large proxy group can no longer starve the controller and make ClashFX rebuild a healthy core. The default benchmark endpoint also uses HTTPS, with existing default settings migrated automatically.
Helper Upgrades No Longer Loop or Race App Startup — ClashFX now compares the bundled and installed Helper reliably, gives privileged operations enough time to finish, validates connecting clients, and keeps the Helper alive briefly while the app reconnects. Startup waits for Helper cleanup before restoring Enhanced Mode, preventing repeated installer prompts and transient “Helper unavailable” failures.
Network Restoration Cannot Freeze Relaunch — DNS restoration and cache flushing now have strict watchdogs, so a slow system command cannot stall ClashFX for minutes. If an older restore finishes late, the active proxy DNS settings are reapplied instead of being overwritten.
网络恢复不会再卡住应用重启 — DNS 恢复与缓存刷新现在都有严格的超时保护,缓慢的系统命令不会让 ClashFX 卡住数分钟。若旧恢复任务延迟完成,应用会重新应用当前代理 DNS 设置,避免覆盖正在使用的网络配置。
Bug Fixes
Enhanced Mode Startup Errors Are Now Actionable — Failed Enhanced Mode toggles now show a prominent error dialog even when reduced notifications are enabled. Invalid TUN route-exclude entries are identified directly, with guidance to separate entries correctly and a shortcut to open Settings. (#190)
Contributors
@ljssafe — Reported that Enhanced Mode appeared to do nothing when an invalid TUN route-exclude entry prevented startup. (#190)
修复
增强模式启动错误现在会明确提示并引导修正 — 增强模式切换失败时会直接显示醒目的错误弹窗,即使启用了“减少通知”也不会被隐藏。若 TUN 路由排除项格式无效,弹窗会指出具体条目、说明正确的分隔方式,并提供打开设置的快捷入口。 (#190)
贡献者
@ljssafe — 反馈无效的 TUN 路由排除项导致增强模式无法启动,但界面看起来没有任何反应的问题。 (#190)
Bug Fixes
Automatic Groups Re-evaluate After Manual Delay Tests — Completing a manual delay benchmark now triggers each affected url-test group to test its candidates again with the group's own URL and expected status. Stale selections are refreshed while Mihomo's configured tolerance continues to prevent unnecessary switching from small latency changes. (#147)
Contributors
@a51095 — Reported that Automatic Selection could keep an older candidate after a manual delay test found faster nodes. (#147)
System Proxy Bypass Changes Apply Immediately — Editing the bypass list now reapplies the active macOS System Proxy settings and reloads the standard-mode runtime rules without requiring a proxy toggle or app restart. The settings copy also clarifies that Enhanced Mode bypasses belong in Profile Mixin. (#182)
TUN Interface Error Storms Recover Automatically — Repeated interface auto-detection failures are grouped and rate-limited before file logging, and a sustained error storm now triggers an Enhanced Mode rebuild instead of consuming CPU and growing logs indefinitely. (#183)
Dashboard Version Indicators No Longer Suggest Unsupported Updates — ClashFX now removes the upstream update dots, disables the bundled Dashboard's version actions, and explains that Dashboard and core updates are managed by ClashFX releases. (#184)
Outbound Mode No Longer Changes Unexpectedly — Removed the default global ⌥D, ⌥R, and ⌥G bindings that could switch ClashFX from other apps. Upgrades clear only bindings that still match those legacy defaults, while preserving other custom shortcuts. (#179)
The Last Mode Choice Now Wins Reliably — Outbound-mode changes are serialized, persisted only after the core accepts them, and verified against the core's actual mode. Config reloads and stale state reads can no longer overwrite the user's latest choice, and logs now record each change source and result. (#179)
Contributors
@hackerslizc — Reported that System Proxy bypass changes did not take effect for Codex-related traffic. (#182)
@mumaxiaozi — Reported the high-energy TUN log storm and the misleading Dashboard/core update indicators. (#183, #184)
@Ha-cyber — Reported and diagnosed the intermittent switch from Rule mode to Direct mode. (#179)
Enhanced Mode Recovers From a Closed TUN Read Loop — The bundled core now treats macOS ENOTSOCK as a closed connection, while ClashFX detects the fatal TUN read error and rebuilds Enhanced Mode instead of leaving traffic disconnected. (#147)
Core Error Floods No Longer Exhaust Resources — Repeated core messages are rate-limited in the app, and the privileged helper caps the core log at 4 MB so a broken read loop cannot drive unbounded CPU, memory, or disk usage. (#147)
Helper Upgrades and Reconnects Are More Reliable — ClashFX now reuses and safely resets its XPC connection, waits for helper readiness before cleaning stale cores, and replaces an outdated running helper before restoring Enhanced Mode. (#147)
Contributors
@a51095 — Reported the long-running Enhanced Mode disconnection and the CPU and memory spike during recovery. (#147)
修复
增强模式可从 TUN 读取循环失效中恢复 — 内置核心现在会将 macOS 的 ENOTSOCK 识别为连接已关闭;ClashFX 检测到致命 TUN 读取错误后会重建增强模式,避免流量持续断开。 (#147)
@a51095 — 反馈增强模式长时间运行后断连,以及恢复期间 CPU 和内存占用暴涨的问题。 (#147)
Improvements
Delay Benchmarks Avoid Duplicate Work — Manual delay tests now benchmark each actual leaf proxy once, use provider-specific checks for provider nodes, and cap concurrency to avoid nested policy groups producing duplicate requests and unstable first-run results. (#147)
Connection Details Can Copy the Destination Directly — A new copy button beside the destination copies the hostname when available, or the destination IP otherwise, without the port number so it can be pasted directly into custom rules. (#147)
Contributors
@a51095 — Reported the repeated first-run delay spike and suggested copying the destination without its port from connection details. (#147)
Enhanced Mode Recovers Its TUN Data Path After Wake — Wake and network-change recovery now validates both the mihomo API and the active TUN interface. If the control API is alive but TUN has disappeared or reports disabled, ClashFX stops the stale external core and rebuilds Enhanced Mode instead of leaving the menu in a false-on state. (#142, #147)
A Stuck Core No Longer Blocks Restart — The privileged helper now gives mihomo a short graceful-shutdown window, then force-terminates it when necessary so Enhanced Mode recovery and ClashFX restart cannot wait forever on an unresponsive process. (#147)
Contributors
@a51095 — Reported the long-running Enhanced Mode failure and the restart behavior that required force-quitting ClashFX. (#147)
修复
睡眠唤醒后会恢复增强模式的 TUN 数据链路 — 唤醒及网络变化后的恢复现在会同时检查 Mihomo API 与实际 TUN 接口;如果控制接口仍有响应,但 TUN 已消失或已关闭,ClashFX 会停止失活的外部核心并重建增强模式,不再让菜单停留在“已开启”的假状态。 (#142, #147)
Global Shortcuts No Longer Override Standard macOS Commands — Removed the default global bindings for Command-S, Command-D, Command-L, and Shift-Command-D. Existing bindings that still match those former defaults are cleared once during upgrade, while other custom shortcuts remain unchanged. (#169)
Contributors
@flydog-ai — Reported and traced the unsafe default global shortcuts. (#169)
Managed Config Table Fits Its Contents — The managed-config window now reserves enough room for the update-time column on its first display, without requiring a manual window resize. (#147)
Configurable Delay-Test Shortcut — Delay tests can now be assigned a global shortcut in Settings. It has no default binding, so it will not conflict with existing shortcuts. (#147)
iCloud Storage Fails Safely — Enabling iCloud-backed config storage now warns and restores the local-storage setting when iCloud is unavailable. (#147)
Contributors
@a51095 — Reported the managed-config layout, delay-test shortcut, and unavailable-iCloud behaviors. (#147)
Delay Tests Stay Manual — Removed the startup retry for delay tests. Benchmarks now run only when explicitly started by the user, avoiding extra network requests while ClashFX and its configuration are still starting. (#147)
Config Menu Is Clearer — Renamed Profile Mixin to Config Patch (Profile Mixin), grouped it with Config Editor and current-config actions, and renamed external-resource updates to clarify that they refresh rule and proxy providers rather than managed configurations. (#147)
Contributors
@a51095 — Reported the startup delay-test behavior and the unclear configuration menu labels. (#147)
Config Selection Follows Local and iCloud Storage — Local and iCloud storage now remember their selected configurations independently. Switching storage restores the target location's previous selection, or chooses a non-default configuration when no selection has been saved yet. (#129)
Delay Results Return After Restart — After a manual delay benchmark, ClashFX remembers the active configuration and test parameters, then silently repeats the benchmark once after the next matching startup. (#147)
Proxy Speed Is Clearly Labeled — The menu-bar indicator now identifies itself as ClashFX proxy traffic and explains that it does not represent total system network speed. (#147)
Optional Dock Icon Hiding — General settings now includes a disabled-by-default "Hide Dock Icon" switch. When enabled, ClashFX remains available from the menu bar without appearing in the Dock. (#147)
Contributors
@a51095 — Verified storage switching, startup delay results, proxy speed semantics, and the optional Dock icon behavior. (#129, #147)
可选隐藏 Dock 图标 — 通用设置新增默认关闭的“隐藏 Dock 图标”开关;开启后,ClashFX 可仅通过菜单栏访问而不显示在 Dock 中。 (#147)
贡献者
@a51095 — 验证配置存储切换、启动后延迟测速、代理速率语义及可选 Dock 图标行为。 (#129, #147)
Bug Fixes
iCloud Config Switching Refreshes Immediately — Switching the iCloud config-storage option now refreshes the configuration list and reloads a valid configuration from the newly selected storage location without requiring an app restart. (#129)
Remote Config Renames Keep Working — When a subscription replaces its placeholder filename with the server-provided name, ClashFX now updates the active-config and remembered proxy references and removes the obsolete file. (#129)
Settings Section Headers Are Clearer — Section headers now sit above their cards with consistent spacing, use a distinct secondary style, and no longer clip or run into the preceding section. General settings also adds meaningful headers for application, network automation, connectivity test, and bypass-rule sections. (#129)
Copy Shortcuts No Longer Intercept Command-C — The two copy-command shortcuts now default to Control-Option-C and Control-Option-Shift-C. Existing Command-C and Option-Command-C bindings are migrated automatically once so normal system copy works again. (#129)
Enhanced Mode Has a Real Global Shortcut — Enhanced Mode now uses a configurable global shortcut with the default Control-Option-E, avoiding the earlier Command-Shift-E conflict with Xcode. (#129)
Contributors
@a51095 — Reported settings section-header layout issues and the Command-C shortcut conflict. (#129)
Settings Window Resizes Freely Again — Wrapped each Settings tab in a flexible container so fixed-height tab contents no longer block vertical resizing. The Settings window can now be resized from the bottom edges and corners across General, Appearance, Global Shortcuts, and Debug. (#129)
Contributors
@a51095 — Verified that v1.1.5.10 still allowed only partial resizing in Settings tabs. (#129)
Appearance Settings Fills the Window on Open — Fixed an initial layout pass issue where the Appearance settings view could leave a dark strip at the bottom until the window was manually resized. (#129)
Contributors
@a51095 — Reported that v1.1.5.9 could still show a partially covered bottom area until resizing the Settings window. (#129)
Settings Window Resizing Works Again — The Settings window now stays resizable while clamping only its maximum size and current frame to the visible screen area. It also reapplies the clamp after restoring a previously saved window size, so old oversized settings windows no longer slip behind the Dock. (#129)
Contributors
@a51095 — Verified that v1.1.5.8 still restored an oversized, non-resizable Settings window. (#129)
修复
设置窗口恢复可缩放 — 设置窗口现在只限制最大尺寸和当前窗口位置,不再切换 tab 时强制回固定高度;同时会在恢复历史窗口尺寸后再次按屏幕可见区域校正,避免旧的大窗口继续被 Dock 遮挡。 (#129)
Settings Window Stays Above the Dock — Settings now clamps its window frame to the current screen's visible area when opening or switching tabs, accounting for the titlebar/tab chrome so the Appearance tray-menu options remain reachable without entering full screen. (#129)
Contributors
@a51095 — Reported the Appearance settings window overlapping the Dock in normal window mode. (#129)
Web Dashboard No Longer Shows a White Top Bar in Full Screen — The Dashboard menu window now uses a standard content layout instead of a transparent full-size titlebar with an empty macOS toolbar, and removes the old 28px dashboard padding patch. This keeps the Web dashboard navigation visible when the window enters full screen. (#129)
Contributors
@a51095 — Continued verification of the Web dashboard full-screen header issue. (#129)
修复
Web 控制台全屏时不再出现白色顶栏遮挡导航 — “控制台”菜单窗口现在改用标准内容布局,不再使用透明全尺寸标题栏和空 macOS toolbar,并移除了旧的 28px 顶部避让 CSS;进入全屏后 Web dashboard 顶部导航会正常显示在内容区内。 (#129)
Dashboard Header No Longer Gets Covered in Full Screen — The native dashboard now uses an in-window header instead of a macOS toolbar, so the Recent/Active Connections switcher and search field stay visible when the dashboard enters full screen. (#129)
Profile Mixin iCloud Sync Uses a Visible File and Reloads Cleanly — When iCloud config storage is enabled, ClashFX now migrates the local or legacy hidden mixin into a visible Profile Mixin.yaml file in iCloud Documents, filters it out of normal config lists, refreshes the config menu, watches the iCloud-selected config, and reloads it without requiring an app restart. (#129)
Subscription Rules Editor Keeps Profile Buckets Out of Normal Configs — The visual Rules editor now keeps the rule bucket selector disabled on normal subscription configs and only exposes profile.prepend-rules / profile.append-rules when editing Profile Mixin, avoiding accidental edits to Profile-only rule buckets from the config editor. (#129)
Contributors
@a51095 — Continued verification for Profile Mixin, iCloud sync, and dashboard full-screen regressions. (#129)
Profile Mixin Visual Editor Opens the Right Rule Bucket — When a Profile Mixin only contains profile.prepend-rules or profile.append-rules, switching from source view to visual mode now automatically selects the non-empty Profile rule bucket instead of showing an empty top-level rules table. (#129)
Profile Mixin and Config Editor Can Open Side by Side — Opening Config Editor while the Profile Mixin editor is already visible now opens or focuses the selected profile editor instead of silently reusing the existing Profile Mixin window. The config picker also includes a Profile Mixin entry for direct navigation. (#129)
Profile Mixin Follows iCloud Config Storage — When iCloud config storage is enabled, the Profile Mixin file now resolves to the iCloud Documents container as well, so custom mixin rules stay with the rest of the synced configuration set. (#129)
ClashFX Networking Is Direct in Enhanced Mode — Enhanced Mode now prepends a built-in PROCESS-NAME,ClashFX Networking,DIRECT rule before subscription rules so the networking helper is not accidentally routed by a provider rule. (#129)
iCloud Settings Toggle Reflects the User Choice — The iCloud checkbox now stays responsive to the saved user preference even when iCloud availability temporarily prevents syncing, instead of immediately snapping back based on the effective runtime state.
Profile Rule Buckets Show in the Visual Editor — The Rules visual editor now lets you switch between top-level rules, profile.prepend-rules, and profile.append-rules, so Profile Mixin rule directives added in source view are visible and editable without falling back to raw YAML. ClashFX also expands config-embedded profile.prepend-rules into runtime rules before subscription rules, and warns when PROCESS rules need Enhanced Mode to match. (#129)
Profile Mixin Rule Directives Now Work — ClashFX now understands profile.prepend-rules and profile.append-rules in Profile Mixin files, translating them into real runtime rules before loading mihomo. Prepended rules are inserted before the existing rule list so DIRECT/process exclusions are not hidden behind MATCH.
Proxy Recovers After Wake From Sleep — After macOS wakes from lid-close sleep, ClashFX now delays recovery until the network interface is ready, checks whether the mihomo API is still healthy, and restarts the active proxy mode when needed. This should avoid the state where proxy traffic stays broken until the app is manually restarted. (#142)
Menu Bar Speed Font Restored — The menu bar upload/download speed text now uses the original ClashFX menu font again, preserving the latest macOS 26 custom drawing optimization while reverting the visual font regression.
Contributors
@ayangweb — Reported proxy failure after lid-close sleep/wake (#142)
Custom Enhanced Mode Now Applies macOS DNS Override — When Use Custom Config as-is is enabled, ClashFX still keeps the selected config file untouched, but Enhanced Mode now runs the same TUN verification and temporary macOS DNS override as the generated-config path. This prevents system DNS from staying on the router DNS while the custom TUN core is running. (#139)
Contributors
@mumaxiaozi — Reported that Enhanced Mode with Use Custom Config as-is left macOS DNS on the router DNS (#139)
修复
自定义 Enhanced Mode 现在也会接管 macOS DNS — 开启 Use Custom Config as-is 时,ClashFX 仍会保持所选配置文件原样,但 Enhanced Mode 会执行与生成配置路径一致的 TUN 校验和临时 macOS DNS 接管,避免自定义 TUN core 已运行时系统 DNS 仍停留在路由器 DNS。 (#139)
贡献者
@mumaxiaozi — 反馈开启 Use Custom Config as-is 的 Enhanced Mode 后 macOS DNS 仍停留在路由器 DNS (#139)
Bug Fixes
Menu Bar Speed Indicator Is Compact Again — The menu bar upload/download speed display now uses compact units such as 999KB/s, a lighter fixed-width font, and competitor-aligned 4pt icon-to-text spacing, reducing the worst-case status item width by about 9pt while keeping the stable-width rendering path. (#137)
Contributors
@mumaxiaozi — Reported the 1.1.4.6 menu bar icon and speed display taking more space than 1.1.4.4 (#137)
Menu Bar Speed Text Looks More Balanced — The menu bar upload/download speed now uses the macOS monospaced-digit menu font, uppercase units, and a space between the number and unit, so labels like 186 B/S and 1.2 KB/S no longer look cramped or visually mismatched.
Turn Off All Proxy Modes Is Localized — The tray-menu shortcut for disabling System Proxy and Enhanced Mode now has localized text and tooltip strings across English, Simplified Chinese, Traditional Chinese, Japanese, and Russian instead of falling back to English in non-English menus.
“关闭所有代理模式”已补齐多语言 — 用于同时关闭 System Proxy 和 Enhanced Mode 的托盘菜单快捷项,现在在英文、简体中文、繁体中文、日文、俄文下都有对应菜单文字和 tooltip,不再在非英文界面回退显示英文。
Bug Fixes
Enhanced Mode Disable Restores Manual Proxy Selection — Turning Enhanced Mode off now reapplies ClashFX's remembered proxy-group selections after the built-in core reloads, so selector groups no longer fall back to the config default such as Auto Select. (#134)
Contributors
@ljssafe — Reported proxy selection falling back to Auto Select after disabling Enhanced Mode (#134)
Profile Mixin for Runtime Configs — The Config menu now includes a Profile Mixin editor backed by ~/.config/clashfx/.profile_mixin.yaml. ClashFX applies that mixin at runtime for reloads and Enhanced Mode without rewriting subscription files, so custom proxy groups/rules can survive profile updates. (#129)
Turn Off All Proxy Modes — A new tray menu action can disable both System Proxy and Enhanced Mode at once, with a tray-menu visibility setting so users can show or hide the shortcut. (#130)
Use Custom Enhanced Mode Config As-Is — Advanced TUN Settings now has an opt-in switch that starts Enhanced Mode from the selected/runtime config without injecting ClashFX's generated TUN/DNS settings. Users who maintain their own complete tun, fake-IP DNS, external-controller, and allow-lan config can run it directly. (#118)
Bug Fixes
Profile Mixin Has Its Own Tray Menu Visibility Toggle — The new Profile Mixin menu item now has an independent show/hide switch under Configs instead of sharing the Config Editor visibility setting. (#129)
Menu Bar Speed Display Is More Compact and Stable — The menu bar upload/download speed now uses a short formatter and fixed-width numeric rendering, reducing wasted menu bar space while preventing nearby icons from jumping as speeds change. (#122, #127)
Contributors
@qzxwj — Reported the menu bar status item occupying too much width (#127)
@SJH21408 — Requested a one-click way to turn off proxy modes (#130)
Enhanced Mode Now Respects Your tun.stack Setting — The generated .enhanced_config.yaml previously hardcoded stack: mixed, silently overriding a user-configured tun.stack. If your config set system (or gvisor), the dashboard showed mixed and reverting it never stuck. ClashFX now reads tun.stack from your source config, validates it against system/gvisor/mixed (case-insensitive), and only falls back to mixed when it is unset or invalid. Both the embedded and external core paths use the same resolved value so they never diverge. (#115)
Dashboard Theme & Column Settings Now Persist — In Enhanced Mode the external controller was assigned a random port on every launch, so the Yacd dashboard origin (127.0.0.1:PORT) changed each time and its per-origin localStorage (theme, custom columns) appeared to reset. ClashFX now pins a stable controller port (19090) and only falls back to a random free port if that port is already taken, keeping the dashboard origin — and your saved preferences — stable across launches. (#115)
Enhanced Mode Startup Is More Resilient — Enabling Enhanced Mode now automatically retries once when the external core fails to bind (e.g. a transient port race or a leftover mihomo_core process holding the controller port). Each retry regenerates the config with a fresh port instead of failing outright, so toggling Enhanced Mode on is far less likely to error out and require a manual retry.
Reopening ClashFX Reveals the Menu Bar Icon — When ClashFX is already running and you launch it again from Finder, Spotlight, Launchpad, or the Dock, it now pops open the menu bar menu so you can locate the icon — helpful when the menu bar is crowded and the icon is hidden. Thanks @hangox for the suggestion. (#114)
Contributors
@hangox — Suggestion to reveal the menu bar item when reopening an already-running app (#114)