Skip to content

Releases: zhuyikai2002/flexclash

FlexClash v0.6.3

Choose a tag to compare

@github-actions github-actions released this 21 Sep 08:18

Multi-platform build of FlexClash v0.6.3.

  • Linux: .deb, .rpm and .AppImage (x86_64)
  • Windows: NSIS .exe installer and .msi (x64)

See the assets below. On Arch/EndeavourOS, packaging/arch/PKGBUILD
builds a flexclash-bin package from the Linux .deb.

FlexClash v0.6.2

Choose a tag to compare

@github-actions github-actions released this 19 Sep 13:53

🚀 What's New in v0.6.2

v0.6.1 让界面学会了「优雅」,v0.6.2 则让底层学会了「听话」。这一版不开新坑、不谈视觉,是一次纯粹的核心体验与 Bugfix 专场——我们把三个藏在日常操作里、每次都让人别扭一下的底层痛点,一次性连根拔起。

一句话总结:该醒的时候必醒,该退的时候必退,该说什么语言就说什么语言。

🔒 单实例锁与窗口唤醒(Single Instance Lock)

多开不再是「再给你开一个」,而是「把已经开着的那个还给你」。

  • 彻底杜绝多开冲突:过去没有任何机制阻止第二个 FlexClash 启动,而两个副本会争抢保留入站端口(7897)、同时抢夺系统代理的所有权——最终呈现给你的却是「内核老是崩溃」这种完全认不出病因的假象。如今第二次启动会被静默拦截,进程不再分裂。
  • 瞬间唤醒并置顶:被拦截的那一次启动不会石沉大海,而是直接唤醒并置顶已经存在的 FlexClash 窗口。你在桌面点第二下图标,得到的是那个真正在干活的实例,而不是一个多余的空壳。
  • 一个刻意的克制:开机自启(--silent)触发的实例永远不会强行弹窗。它本就是来「安静待命」的,我们没有理由在每次登录时都把窗口拽到你脸上。

🚪 完全的退出接管(Exit Behavior)

「关闭主窗口时退出程序」这个选项,以前只是一句承诺。

  • 修复设置未生效的 Bug:这个开关此前只把选择写进了本地存储,从未有任何 IPC 把它送达底层;而底层的关闭钩子只认托盘「退出」所点燃的那一次性标志。结果是:无论你选哪一项,点击 X 都永远只是最小化到托盘——选项看似选中,实则从未生效。
  • 前后端真正联动:现在你的选择会通过类型化 IPC 直达底层退出逻辑,由 Rust 侧真正拥有决定权。选了「退出」,点 X 就是干净利落的整体退出——停止内核、还原系统代理、收尾清理,一步不差。
  • 真值依旧在前端:持久化仍由前端掌管,底层只做会话级镜像,避免两处状态互相打架——这是我们一贯的「前端真值优先」原则。

🌐 托盘多语言同步(Tray Localization)

系统托盘不再是那个「说着另一国语言」的角落。

  • 告别硬编码英文:托盘右键菜单此前由 Rust 侧以写死的英文构建(Show panel / System proxy / Quit),而它旁边的悬浮提示却早已是中文化的——同一个托盘、两套语言,非常割裂。托盘在界面出现之前就由底层建好,读不到前端的语言包,所以语言必须被推过去。
  • 随界面偏好热切换:现在托盘菜单会跟随你在界面里选择的语言即时切换,无需重启;未匹配到的语言统一回落到中文,与前端默认一致。
  • 保住勾选状态:菜单文案是「原地改写」而非重建菜单,因此系统代理那一项的勾选状态在语言切换中不会丢失。

兼容性说明

  • 自动更新链路:可从 v0.6.0 / v0.6.1 直接在客户端内一键静默升级至 v0.6.2;签名密钥未轮换,本版安装器正常签名。
  • 行为变化(均为修复):第二次启动不再产生新进程,而是唤醒现有窗口;「关闭主窗口时退出程序」现已按其所说生效——如果你此前依赖「点 X 只是隐藏」,请在「常规与桌面行为」中确认该选项仍为「最小化到托盘」。
  • 不涉及 配置格式、订阅兼容性或数据结构的破坏性变更。

这一版把代码库收拾得干净利落,正是为了下一步轻装上阵。

完整变更记录:v0.6.1...v0.6.2

FlexClash v0.6.1

Choose a tag to compare

@github-actions github-actions released this 17 Sep 09:34

🚀 What's New in v0.6.1

如果说 v0.6.0 是把内核"彻底驯服",那 v0.6.1 就是把这份驯服端到你眼前。这一版我们暂别底层架构,把全部心力倾注于一件事——让每一次交互都值得被看见。从滚动的每一帧到指尖的每一次点击,软件终于有了"高级感"该有的从容。

本次更新的主题只有一句:界面,应当稳如磐石,美如呼吸。

✨ 零抖动渲染(Zero Layout Shift)

你永远不该为了看一眼数据,去忍受界面的反复抽搐。本版对前端做了一次彻底的"防抖手术"——即使底层 1 秒刷新一次数据泵全速运转,你的视线也再不会被推来搡去。

  • 虚拟列表不再推挤滚动条:曾经在列表顶部硬插/硬撤的提示横幅与列头,如今都裹进平滑的过渡动画,高度伸缩如呼吸般自然,滚动位置纹丝不动。
  • 全量等宽数字(Tabular Nums):速率、流量、延迟、节点计数……所有跳动的数字都换上了等宽字形。数字从 1 翻到 8 时,列宽不再忽胖忽瘦,⚡ 杀链按钮也再不会因宽度抖动而"跳一下"。
  • 稳如磐石:即便在 1s 极速刷新的数据泵下,界面依然像钉死在屏幕上一样安静——快,但不慌。

🌫️ 优雅降级(Graceful Degradation)

内核断线,不该是一场惊吓。本版让"离线"这件事,第一次有了体面的样子。

  • 三态网络指示灯:侧边栏底部新增一颗精致的可用性指示灯——常亮为翠绿(呼吸般轻颤)、降级为琥珀、失联为赤红,内核的每一次状态起伏都一眼可读,再也不藏在某行小字里。
  • 毛玻璃温柔冻结:当内核断线、屏幕上的数据已成过去,我们不再生硬地清空列表、也不再弹刺眼的红色错误闪切;取而代之的是一层半透明的**毛玻璃遮罩(Backdrop Blur)**轻轻覆上,旧数据被温柔"冻结"在原处,居中一行琥珀色提示"数据已过期"——既诚实,又不制造焦虑。
  • 状态切换零重叠:骨架屏、空态、加载、错误、列表之间统一以 out-in 过渡流转,切换不再互相打架、不再带来布局抖动。

⌨️ 极客级微交互(Micro-interactions)

细节,是顶级效率工具与"能用"之间的那道分水岭。本版把交互打磨到了 Raycast 那一类工具的标准。

  • 全局 Toast 丝滑滑行:堆叠的提示不再"啪"地硬跳。新增的位移缓动(cubic-bezier 曲线)让每一条 Toast 在推入与退场时优雅滑移,强迫症从此痊愈。
  • 右键菜单全面键盘流:连接列表的右键菜单重做了进入动效(缩放淡入),并完整支持键盘操作——↑/↓ 选择、Enter 确认、Esc 平滑收起,鼠标与键盘切换毫无割裂感。
  • ⚡ 极客彩蛋:按住 Alt 闪电猎杀:在节点上右键时按住 Alt 键,菜单会瞬间切换为一条带电光前缀的「清理该节点死链」——一键猎杀该节点下所有死链,把效率玩家的爽点拉满。

配套能力

这些体验之所以稳,是因为它们站在 v0.6.0 打下的底座之上(随包发布,无需额外操作):

  • 单一数据泵 + 类型化通知通道:1s 刷新的数据泵与统一的 tauri-specta 类型化事件,是"零抖动"与"优雅降级"得以成立的前提——数据永远只来自一个真相源。
  • 应用内一键更新:沿用 v0.5.x 的静默升级链路,本版可直接在客户端内一键更新至 v0.6.1。

兼容性说明

  • 自动更新链路:自 v0.4.0 起即可在客户端内一键静默升级至 v0.6.1;签名密钥未轮换,本版安装器正常签名。
  • 行为变化:本次为纯前端交互/视觉打磨,不涉及任何内核行为、配置格式或订阅兼容性的变更;数据泵、自动死链清理、崩溃自愈等底层能力均与 v0.6.0 完全一致。
  • 升级建议:若你正卡在某个节点的死链上,不妨试试新加入的 Alt 右键彩蛋——那种"一击清场"的快感,值得亲自体验。

完整变更记录:v0.6.0...v0.6.1

FlexClash v0.6.0

Choose a tag to compare

@github-actions github-actions released this 17 Sep 06:35

🚀 What's New in v0.6.0

从 v0.4.0 到 v0.6.0,我们用 12 个提交、61 个文件、+5734 / −475 行,完成了两个版本周期的厚积薄发——v0.5.x 把"升级"本身做成了一流体验,v0.6.x 则把内核最后的"不可控"连根拔起。这一版的主题只有一句话:让内核彻底听我们的话,而你永远不必知道它在挣扎。

⚡ 自动死链清理:毫秒级嗅探,坏节点当场出局

你永远不该为一条早已死透的链路买单。本版在内核底层植入了异常嗅探——一旦某条连接被内核判定为坏节点,我们不再等超时、不再等重试,而是在毫秒级完成识别,并自动强杀历史死链,把流量瞬间切回健康路径,实现真正极速的重路由。

  • 从"被动等死"到"主动猎杀":此前坏节点要熬到上层超时才会被丢弃,期间整组流量都被拖在泥里;现在嗅探器在异常发生的那一拍就出手,把"重路由"从秒级压缩到毫秒级。
  • 强杀不留尾巴:历史死链被一次性清场,避免它们伪装成"慢节点"反复污染选路。
  • 一键开关 + 诊断日志:autokill 能力配有总开关与可读的诊断日志(v0.6.x Step 5.4),你随时能看清内核清理了什么、为什么清理——一切可观测、可回查。

🛡️ 坚如磐石的守护:Rust 级 Supervisor 下沉

内核崩溃不再是灾难,而是一次你不会察觉的心跳。我们把崩溃监督整个下沉到了 Rust 层(v0.6.x Step 1),用工程手段把"自愈"做成默认行为。

  • 指数退避 + 熔断:重启不是无脑轮询,而是带指数退避、有熔断保护的收敛过程——内核短暂抽风时温柔重试,持续失联时果断熔断,绝不把资源烧在注定失败的循环上。
  • 无感自愈:内核一旦退出,Supervisor 立即拉起新实例并恢复原位;对前端而言,这中间只有一次透明的数据刷新,没有报错、没有白屏、没有"应用坏了"的错觉。
  • panic = "abort" 前提下的绝对安全:监督循环内无 unwrap / expect / 越界,任何一次异常帧都不会让守护进程自己先崩——守护者自己必须先活得比被守护者久。

🎨 UI 状态大一统:告别无效报错,数据过期一眼即知

此前的 UI 像一群各说各话的卫兵——14 路平行的错误状态各自为政,常常在你根本没断网时弹出"连接失败"。本版彻底重构了前端数据流(v0.6.x Step 5.1 / 5.2 / 5.3)。

  • 一条类型化通知通道,取代 14 路平行错误状态:所有内核事件收敛进单一 tauri-specta 类型化通道,前端不再各自维护一套随时会漂移的镜像;无效报错从此绝迹。
  • 唯一的可用性真相:状态派生收敛为单一来源(single availability truth),配合单一数据泵(one data pump)统一推送,彻底消灭重复统计与互相打架的刷新。
  • 琥珀色"数据过期"反馈:当内核离线、UI 拿到的数据是旧的,界面不再假装一切正常、也不再弹刺眼的红色报错,而是以沉静的琥珀色提示"数据可能已过期"——既诚实,又不制造焦虑。

🔄 配套能力:应用内一键更新(来自 v0.5.x)

这一版之所以能"静默推到你面前",靠的是 v0.5.x 打下的一流更新体验(本版一并随包发布)。

  • 检查 / 下载 / 安装三步拆解:check_update → download_update → install_update 解耦,下载进度经 updater://progress 实时回传,前端状态机清晰流转。
  • 安装即干净重启:安装前自动关闭系统代理、停止内核 sidecar 并硬清理,再经 NSIS 钩子完成升级,绝不留下上一个版本的幽灵进程。
  • 冷启动弹窗 + 设置页复用同一份状态:新版本可用时弹窗告知,关于卡片同样可手动检查——同一条更新链路,两个入口,零重复代码。

基础设施

  • 端到端类型化 IPC(tauri-specta):命令面由单一注册表生成类型,前端只经统一的 call / safeListenEvent 桥接层与 @/bindings 取类型,禁止裸 invoke;生成物漂移被 CI 拦截。
  • 发布日志单一事实源:release_notes.md 同时驱动 latest.json > notes(应用内弹窗,marked + DOMPurify 渲染完整 Markdown)与 GitHub Release 正文,永不再手抄第二份——这正是 v0.4.0 曾把 v0.2.5 文案误发给所有用户的那道伤口,本版从流程上彻底缝合。
  • CI 门禁加固:cargo fmt(严格)、clippy -D warnings、bindings 漂移检查、profile 集成测试、Geo 冒烟工具的构建防腐烂检查,全部纳入流水线。

兼容性说明

  • 自动更新链路:自 v0.4.0 起即可在客户端内一键静默升级至 v0.6.0;签名密钥未轮换,本版安装器正常签名。
  • 行为变化:内核异常时会自动清理死链并可能瞬时重路由(属预期内的"自愈"表现);内核崩溃会透明自愈,你通常不会感知到任何中断;内核离线时 UI 以琥珀色标识数据过期,而非红色报错。
  • 不涉及 配置格式与订阅兼容性的破坏性变更。

完整变更记录:v0.4.0...v0.6.0

FlexClash v0.4.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 14:54

🚀 What's New in v0.4.0

v0.3.0 到 v0.4.0 之间共 19 个提交、88 个文件、+6610 / −1603 行。这一版没有零散的功能点缀,而是围绕三根支柱做的结构性升级:让 Geo 数据库自动保鲜、把内核的实时数据面整体下沉到 Rust、以及让万级节点的列表真正跑得动。三者共同的目标只有一个——把运行时的每一分不可控都收进可测、可证、可回退的工程边界内。

1. Feat (Geo):GeoIP / GeoSite 数据库静默热更管线

分流规则的准确性取决于 GeoIP.dat / GeoSite.dat / ASN.mmdb 是否新鲜,但此前的内核自带更新器在实际使用中会静默失效。本版补上了一条完整的自动化管线,并解决了内核层面一个反直觉的陷阱。

  • 为什么不能自己下完再重载:Mihomo 会把解析后的 Geo 匹配器缓存进永久 singleflight(component/geodata/utils.go),而只有内核自己在 update_geo.go 里真的下载成功那条分支才会失效该缓存。更隐蔽的是 UpdateGeoIP 的 if oldHash.Equal(hash) { return nil } 早退位于 defer ClearGeoIPCache() 之前——磁盘上已是新字节时,就永远不会清缓存。因此"我们替它下好、再 PUT /configs 热重载"这条路是不通的,POST /configs/geo 单独调用同样不通。
  • 让内核自己完成传输,但源由我们掌控:新增一个临时 loopback HTTP 服务(core::geo_staging,仅 GET/HEAD、绑定随机 127.0.0.1 端口、随取随关并有生存期兜底),只服务刚刚校验通过的那两个数据库;随后挂载一份瞬时配置,把 geox-url 重指向 loopback,触发内核抓取与热生效,完成后再还原并持久化。
  • 校验先于信任:下载 → sha256 校验 → 原子写盘(atomic_write)→ 暂存到工作目录而非 -d 根目录,避免触发上面那个"早退即失效"的陷阱。
  • 24 小时静默调度:驻留任务在启动后等待 30 秒让内核就绪,之后每 24 小时检查一次。探测先于传输——在提交约 21 MB 的下载之前先 GET /version 确认内核在线,没有内核就绝不白下。
  • 失败处理是一等公民:调度路径无 unwrap / expect / 越界,任何网络抖动都不会杀死一个没人看得见的后台任务;失败按 5 分钟 × 3 次有界补偿,耗尽后等下一个日周期,既不放过内核启动竞态、也不会因上游宕机变成热循环。所有结果统一收敛为一行日志 + UI 已读取的状态。
  • 顺带加固:geodata-mode / geodata-loader / geo-auto-update 在每份配置净化时强制置位——否则订阅自带的值会悄悄绕过整条管线(mmdb 模式会无视我们保鲜的 .dat,内核自带的 ticker 会与我们的调度器赛跑)。

2. Feat (Core):内核实时流量与日志全面下沉 Rust

此前 /traffic 与 /logs 两个 WebSocket 由渲染进程直接拨号——窗口一关 socket 就断,且没有任何节流余地。本版把数据面整体迁到 IPC 线以下。

  • 单一守护任务(core::ingest):同时接管两条流,生命周期长于任何窗口,并能跨内核重启自愈。
  • 按流的形态选择节流策略,而非一刀切:
    • /traffic 是最新值流:会话只保留一个 Option<TrafficPayload> 被每次推送覆盖,由 1 秒的 interval tick 统一发出——是合并(coalescing)而非排队,读写是同一个 select! 的两个分支、缓冲区是栈上局部量,不可能增长。
    • /logs 是全量累积流:丢日志是 bug,因此排队——写入有界 VecDeque,每 500 ms 的 tick 一次性抽干成 LogBatch;洪水期丢的是最旧的(有界而非无界)。
  • panic = "abort" 前提下的安全约束:两个循环内无 unwrap / expect / 索引,畸形帧直接跳过;内核一旦离开 Running,守护任务立即中止两条子任务;每个端点各自以有界指数退避重连;/traffic 额外带空闲看门狗,用于识别那种不发 FIN 的半开连接并重连。
  • 渲染进程不再打开任何 WebSocket:前端只订阅三个 tauri-specta 类型化事件——events.trafficPayload、events.logBatch、events.configRefreshPayload(后者取代了退役的 kernel://config-refreshed 字符串通道及其手写载荷镜像)。同时删除了 useTrafficStream.ts、openTrafficSocket / openConnectionsSocket 与 MIHOMO_WS_URL。
  • 消灭重复统计:删除了 watcher 每秒钟轮询 /connections 去计算、却无人消费、还与 /traffic 打架的那份速度推导。

3. Perf (UI):万级节点的虚拟列表引擎

导入含数千节点的订阅后,此前会一次性挂载数千个 DOM 节点(掉帧、内存飙升),而且每收到一批测速结果就整组重渲。本版把渲染与状态更新两处瓶颈一并解决。

  • 扁平行模型:把「组头 + 每行 N 张节点卡」压平成一维列表,交给单一 @tanstack/vue-virtual。零新增依赖——复用项目中已在使用的同一原语。组头与节点行拆为独立子组件并各自订阅 store,于是一批只重渲命中的那几行。

  • 载荷与结构解耦:批次更新改为原地叶子写入,不再整体替换组对象;布局只依赖结构(成员/顺序/折叠),因此数据洪流不会重建布局。

  • 固定行高,零抖动:组头与节点行高度都精确固定,滚动几何一次算准,无二次测量、无滚动条跳动。

  • latency_asc 合流:延迟排序改用 400 ms 尾随合流,并在边界(测速开始/结束、切换选中、切换模式)立即冲刷,把重排从每批一次降到整轮个位数次;默认排序模式完全不调度。

  • 实测(真实 Chrome / 5005 节点 / 4 组 / 1440×900,机器可读基准):

    维度 重构前 重构后
    挂载 DOM ~24,921 419(−98%)
    批次合并(626 批) 12,174 ms 7.6 ms
    latency_asc 重排 10,287 ms / 626 次重建 11.9 ms / 3 次重建
    默认模式合并 1,878 ms 8.8 ms(零次重排)
    折叠 行数不变 scrollHeight 64210 → 38659
  • 布局上,工具栏提升为固定的面板头,滚动条交给内层容器;页脚完整可见且不产生页面级滚动条。

基础设施

  • 端到端类型化 IPC(tauri-specta):命令面由单一注册表生成类型,前端只经统一的 call / safeListenEvent 桥接层与 @/bindings 取类型,禁止裸 invoke;生成物漂移被 CI 拦截。
  • CI 门禁加固:cargo fmt(严格)、clippy -D warnings、bindings 漂移检查、profile 集成测试、以及 Geo 冒烟工具的构建防腐烂检查,全部纳入流水线。

兼容性说明

  • 自动更新链路不变:签名密钥未轮换,v0.3.0 用户可在客户端内一键静默升级。
  • 行为变化:延迟排序(latency_asc)改为分步刷新(数千节点下观感更平滑);Geo 数据库开始按天自动静默刷新,无需手动干预;内核的 geodata-mode / geodata-loader / geo-auto-update 会被强制统一,订阅自带的同类取值将被覆盖。
  • 不涉及 配置格式与订阅兼容性的破坏性变更。

完整变更记录:v0.3.0...v0.4.0

FlexClash v0.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 07:37

Full Changelog: v0.2.5...v0.3.0

FlexClash v0.2.5 - TUN 进阶开关与 DNS 泄漏修复

Choose a tag to compare

@zhuyikai2002 zhuyikai2002 released this 13 Sep 03:00

🚀 What's New in v0.2.5

本版把设置页「TUN 进阶」里的两个占位开关真正接入了 Mihomo 内核,并修掉一个长期存在的 DNS 泄漏口子,同时清除了前端的历史硬编码版本号。

1. Feat (TUN):开放「严格路由」与「DNS 劫持」进阶开关

  • 解除占位:这两张卡片此前只是只读预览(标着「即将推出」),其背后的取值是写死的常量;现在它们是可点击的开关,状态持久化在本机(flexclash.settings),重启后保持。
  • 严格路由:开启时写入 tun.strict-route: true,强制所有连接走隧道并拒绝试图绕过它的流量。默认为关——它是两者中更激进的一个,会影响局域网互访与嵌套虚拟化环境,因此做成显式选择。取值两个方向都会显式写入,所以即便订阅自带 strict-route: true,关闭开关也能正确覆盖,不会出现「开关显示关闭、内核实际开启」。
  • DNS 劫持:开启时写入 tun.dns-hijack: ["any:53", "tcp://any:53"],关闭时写入 []。默认开启。
  • 运行时热重载:当 TUN 已处于开启状态时,切换开关会立刻重写配置并请求 Mihomo 执行 PUT /configs?force=true 热重载,无需先关闭再开启 TUN。写入顺序是「配置先落盘、再触发重载」,因此即使重载因内核正在重启而失败,磁盘上的配置也已经是正确的,下次启动即生效。

2. Fix (DNS):修复 DNS 劫持仅拦截 UDP 的漏洞

  • Mihomo 把不带协议前缀的劫持目标视为 udp://。因此此前写入的 ["0.0.0.0:53"] 实际只截获 UDP 查询,TCP 查询完全不受影响。
  • 后果是真实的泄漏:当解析器回退到 TCP(被审查网络中极为常见的行为)时,查询会绕过 TUN 直达本机解析器——表现为「DNS 劫持已开启」却依旧泄漏 DNS。
  • 现在补齐 tcp://any:53,同时用 any:53 覆盖全部本机地址而非仅 0.0.0.0,UDP / TCP 两条路径都已受控。

3. Fix (UI):清除前端硬编码版本号

  • 「关于」页面的客户端版本此前被硬编码为 0.1.2,且从未随 tauri.conf.json 一起升级,导致客户端升级到 0.2.x 后仍显示 v0.1.2,并连带影响「检查更新」处的版本提示。
  • 改为运行时通过 @tauri-apps/api/app 的 getVersion() 读取安装包自身的版本;关于卡片与「已是最新」提示共用同一个版本标签,杜绝两者再次各自漂移。在无 Tauri 运行时的浏览器预览中回退为占位符,而不是抛异常。
  • 更新器的「当前版本」本就取自 tauri-plugin-updater,已是动态值,未作改动。

兼容性说明

  • 默认值有变化:严格路由的默认值由原先的写死「开启」变为默认关闭;DNS 劫持仍默认开启,但取值由「仅 UDP」扩展为「UDP + TCP」。如需严格路由,请在「设置 → TUN 进阶」中手动打开。
  • 未轮换签名密钥,v0.2.4 用户可直接在客户端内一键静默自动更新,无需手动下载。

FlexClash v0.2.4 - TUN 路由修复与完全重置

Choose a tag to compare

@zhuyikai2002 zhuyikai2002 released this 12 Sep 05:30

🚀 What's New in v0.2.4

本版为 v0.2.3 的回归修复补丁,集中修复 TUN 模式无法转发流量、以及「重置应用」清理不彻底两个严重问题。

1. Fix (TUN):域名解析黑洞

  • 补上 Fake-IP DNS 注入:开启 TUN 时,此前只写入了 tun: 块,却从未注入配套的 dns: 块。结果是 TUN 网关把 DNS 查询劫持给了 mihomo,而 mihomo 自己的 DNS 服务仍处于关闭状态,查询被直接丢弃——表现为「TUN 已连接,但所有域名都解析不出来」。
  • 现在开启 TUN 会确保 dns: 采用 enhanced-mode: fake-ip(fake-ip-range: 198.18.0.1/16,nameserver: 223.5.5.5 / 119.29.29.29),域名解析恢复为 198.18.x.x 的 Fake-IP 并正常转发。
  • 不覆盖你自己的配置:仅当配置中缺少 dns: 时才补齐;若订阅自带 dns: 块,则原样保留,关闭 TUN 时也只回收由本程序写入的那一份。

2. Fix (TUN):提权内核工作目录落入 %TEMP%

  • 修复严重缺陷:TUN 模式下 mihomo 需经 runas 提权启动。此前解析工作目录的代码在提权路径上会回退到系统临时目录,导致提权后的内核实际运行在 %TEMP% 下——读不到任何订阅、规则与 DNS 配置,TUN 因此形同虚设。
  • 现在提权启动的工作目录统一解析到规范位置 <AppLocalData>/com.flexclash.app/mihomo,解析失败即报错返回,不再静默回退到临时目录。

3. Fix (TUN):残余路由清理失效

  • 重写清理逻辑:此前的路由清扫用 CIDR 形式(0.0.0.0/1)去匹配 route print 的输出,而 Windows 的路由表只输出点分十进制(0.0.0.0 128.0.0.0),因此匹配永远不成立、清扫实为空操作。程序异常退出后,TUN 写入的两条分片默认路由会长期残留,造成断网。
  • 现在按点分十进制解析,并以「下一跳须为 TUN 特征地址」作为安全条件,既能清掉残留的分片默认路由,又绝不触碰系统真实的默认路由。

4. Fix (Reset):实现真正的完全重置

  • 清理 mihomo 策略组状态:重置此前遗漏了 cache.db(及 -shm/-wal)。mihomo 的节点选择、策略组状态正是持久化在这里,这正是「重置后仍记得之前选中的节点」的原因。
  • 修正日志清理范围:原先只匹配 mihomo*,遗漏了 runtime.log;现在清理工作目录下全部运行日志。
  • 修正历史数据库路径:history.db 实际写入的是工作目录的上一级,此前在错误目录里删除,导致流量历史在重置后依然留存。
  • 前端同步清空:重置完成时会清空 localStorage 并重置策略组 / 规则的前端状态,避免界面残留旧数据。

排查说明

针对「自动更新后配置丢失」的反馈已做专项核查:更新器(tauri-plugin-updater)不读写任何数据目录;NSIS 安装脚本中删除用户数据的逻辑被 $UpdateMode <> 1 严格守卫,升级路径下永不删除数据。该问题未能复现,判定为误报。

升级说明

v0.2.4 未轮换签名密钥,v0.2.3 用户可直接在客户端内一键静默自动更新,无需手动下载。

FlexClash v0.2.3 - 内核守护与免 UAC 自启

Choose a tag to compare

@zhuyikai2002 zhuyikai2002 released this 11 Sep 21:05

🚀 What's New in v0.2.3

1. 稳定性:mihomo 子进程生命周期改由 Windows 内核兜底

  • 彻底杜绝僵尸内核进程:为 mihomo 子进程引入 Windows Job Object 守护(JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)。无论 FlexClash 是正常退出、被任务管理器强制结束,还是发生 Panic 崩溃闪退,mihomo 都会被内核在毫秒级自动回收——不再出现"主程序已经没了、代理还在后台跑"导致网络断连的情况。
  • 精确回收,不误伤其他客户端:回收严格按 Job 成员关系执行,而不是 taskkill /IM mihomo*.exe 这类按进程名批量结束。同时安装并使用其他 Clash 系客户端(例如 Clash Party)的用户,其内核进程完全不受影响。

已知边界:Windows 的 Job Object 无法跨完整性级别绑定。TUN 模式下由 runas 提权拉起的 mihomo 属于高完整性进程,不在 Job 守护范围内,仍由原有的优雅停止路径负责善后。普通模式(非 TUN)为全量覆盖。

2. 体验:免 UAC 的开机静默自启

  • 开机不再弹 UAC:新增基于 Task Scheduler 的登录任务(RunLevel=HighestAvailable),由计划任务服务在登录时直接拉起进程,全程无窗口闪烁、无需任何确认。UAC 提示从"每次开机"降为"仅首次开启"。
  • 与旧自启方式强制互斥:新的计划任务自启与原有的注册表 Run 键自启在 Rust 侧强制互斥,避免开机时启动两个实例、抢占同一个 7897 端口。开启新方式时会自动清理注册表自启项。
  • 界面:设置页新增「免 UAC 自启」卡片,可随时开启或关闭。

升级说明

v0.2.3 未轮换签名密钥,v0.2.2 用户可直接在客户端内一键静默自动更新,无需手动下载。

首次开启「免 UAC 自启」时,Windows 会请求一次管理员授权(UAC 在"创建任务"时校验,而不是在"运行时")。授权一次之后,此后每次开机都会永久静默启动。

FlexClash v0.2.2 - 静默 TUN 架构与自动更新通道就绪

Choose a tag to compare

@zhuyikai2002 zhuyikai2002 released this 11 Sep 13:24

🚀 What's New in v0.2.2

1. 核心体验重构:纯静默 TUN 模式提权

  • 彻底消除黑框闪烁:全量重构 Windows 子进程派生逻辑,严格收敛为 CREATE_NO_WINDOW 与显式 SW_HIDE 调用,杜绝 UAC 提权前后的控制台窗口闪烁。
  • 干掉高频子进程轮询:废弃原先每 200ms 调用一次 curl.exe 的暴力探针,重构为 Rust 原生进程内裸 TCP HTTP 探针,TUN 开启路径做到零外部依赖、零进程抖动(Process Churn)。

2. 基础设施:自动更新管线(Auto-Updater)正式闭环

  • 深度集成 tauri-plugin-updater,采用 Minisign (Ed25519 + BLAKE2b-512) 工业级数字签名。
  • 自动化构建脚本支持一键生成并校验 latest.json 签名摘要。

⚠️ 重要升级说明(必读)

由于 v0.2.2 正式重构了签名机制并轮换了最新的 Minisign 密钥对,v0.2.1 及更早版本的存量用户无法通过客户端内置更新自动升级至此版本。

请下载下方的 FlexClash_0.2.2_x64-setup.exe 进行手动覆盖安装一次。安装完成后,后续所有版本均支持客户端内一键静默自动更新!