第一幕 · “需要一步步来”:简单易用的承诺
2024 年 6 月 23 日凌晨 3:46(UTC+8),在 FlClash 的第 67 号 Issue 里,一位用户希望添加自定义规则。chen08209 的回复很短,其中一句是:“但是需要一步步来。”没有交付日期,也没有长篇解释。把这句回复放回后来的代码历史,它恰好给了我们一条阅读这位维护者的线索:一个需求提出之后,中间那些不显眼的修补,也属于产品的成长。
故事的开头却不能写得过于确定。GitHub 记录 FlClash 仓库创建于 2023 年 8 月 15 日;当前官方仓库保留的根提交,则是 2024 年 4 月 30 日 23:38 的 df4d380。两者相隔八个多月,而这份名为“Initial commit”的代码,版本号已经是 0.7.0。它能证明当时已有一款成形的应用,却无法替我们补出此前的开发经过。
这份最早可见的 README 已经列出 Android、Windows、macOS 和 Linux,也写明 Material You、屏幕与色彩适配,并坦率注明界面参考 Surfboard。项目介绍里的承诺很朴素:“simple and easy to use, open-source and ad-free”——简单易用、开源无广告。对使用者而言,这是一个关于日常体验的承诺;对维护者而言,接下来必须让同一个界面上的开关,在不同系统里都做对事情。[7][1][2]
第二幕 · 好看的界面之后,是关得掉的服务和带得走的配置
根提交之后的第一天,历史里出现的并非一连串新功能,而是 Android 服务的收尾问题。2024 年 5 月 1 日下午,一次提交修复快捷设置 TileService 在某些情况下不能正确销毁;当天晚上,另一次提交处理 VpnService 在特殊情况下无法正常关闭。用户看到的只是一个开关,系统里却有各自运行、各自结束的服务。把按钮画出来以后,才开始面对按钮背后的复杂性。
到了 5 月 20 日,“add WebDAV”进入提交记录。沿着代码看,备份的对象包括应用设置、内核配置和订阅配置文件,恢复时还可以选择只恢复配置文件。这使“多平台”多了一层实际含义:不仅在手机和电脑上看见相似的界面,还能把积累下来的设置带走。
六月的一次修补更能说明“简单易用”需要付出什么。6 月 16 日,chen08209 提交“Fix the problem of excessive memory usage in traffic usage.”,处理流量统计占用过多内存的问题。修改后的图表只保留最近 60 个采样点,累计流量则由内核提供,不再依靠界面把不断增长的历史样本全部加起来。走势图只需要展示最近一段,累计用量则需要另一种记法;把两者分开,才不用为了画一张图而一直积攒旧数据。
这些修复没有“全平台突破”那样醒目的名字,却让项目最初的承诺有了具体形状。跨端体验的一致,要靠逐个处理服务、配置和状态的差异来维持;漂亮的流量卡片,也要经得住长时间运行。[3][4][5][6]
第三幕 · 需求终于进入代码,界面与内核开始分开生活
回到那个自定义规则的请求:2025 年 3 月 12 日,主分支出现“Add rule override”。这次修改加入规则解析与配置模型,也加入独立的覆写编辑界面。九个月前讨论的那类个性化需求,此时已经有了具体实现。对只想导入配置的人,默认路径可以继续保持简单;对想修改分流规则的人,应用开始提供进一步干预的空间。
同年 7 月 31 日,提交“Add android separates the core process”把问题推向更深一层。Android 清单中,VPN 服务和相关服务被安排到独立的 :remote 进程,新加入的跨进程接口负责沟通。界面与网络服务不再共用一个进程;这也意味着,启动、停止、状态传递都需要重新协调。它与早期那些“服务关不掉”的修复有着相同的关注点:屏幕上的状态,怎样才能与后台实际发生的事情一致。
这条工程路线延续到了 2026 年 9 月 5 日。chen08209 在提交说明中写下“rebuild the Go core IPC, hub, and ownership model”,重建 Go 内核的进程通信、消息分发与所有权模型。代码里有一个很小、却很能说明问题的处理:向界面投递日志失败时,不再把这个错误交回同一条内核日志链路,以免“发送失败→记录错误→再次发送”循环下去,而是另走标准错误输出,并限制重复报告。
从给流量图留下 60 个点,到避免错误日志不断触发新的错误,维护者面对的始终有同一种难题:方便观察系统的界面,不能反过来拖累系统本身。早期是不断增长的数据,后来是可能循环触发的错误消息;功能越丰富,越需要为这些不容易被使用者看见的路径设好边界。[7][8][10][13][6]
第四幕 · 被继续使用的代码,与维护者给出的边界
FlClash 的代码也开始进入别人的作品。Bettbox 在 2026 年 2 月 24 日的一份早期 README 中,直接写着“Forked from FlClash”。这是一条具体的继承关系:后来者可以从已有的客户端出发,继续做自己的选择。这让 FlClash 的影响从下载和使用,延伸到代码层面的接续:原来为自己项目解决过的问题,成为另一个项目可以继续搭建的基础。
影响扩大以后,公开回复里也能看到对功能边界的说明。2025 年 4 月 19 日,有人在 WebDAV 相关问题下讨论可用性,他提醒:“依赖第三方服务,不保证绝对可用性”。到 2026 年 8 月 29 日 22:40(UTC+8),面对持续出现的 iOS 需求,他在置顶 Issue 中明确写下“iOS: no plans for now”,说明暂时没有开发计划或时间表,支持范围仍是 Android、Windows、macOS 和 Linux,并请用户用首帖表态汇集需求。一个被不断提出的愿望,被集中到同一个入口记录下来,而没有变成一张缺乏日期的路线图。
2026 年 9 月 10 日发布的 v0.8.97,把此前的 Go 内核、桌面插件、Android 服务、应用状态与界面重构汇集到发布说明中。版本号背后,不只有新增了什么,还包括已经存在的功能怎样重新组织、怎样继续维护。至此再读“需要一步步来”,它就不只是一句等待答复:从服务关闭、流量内存、规则覆写,到独立进程与通信重建,每一步都有能回到代码检查的痕迹。
chen08209 留下的这段公开技术经历,最有分量的地方正在这些具体工作里。一款宣称简单易用的工具,逐渐承担起更多设置、更多平台差异和更多用户期待;开发者一边补上能力,一边公开说明边界。故事仍在继续,而已有记录足以让人看见,“简单”的体验是怎样一点点维护出来的。[11][9][12][14][7]