跳到正文

Neko Master

一个自托管面板,把家庭网关的流量去向摊开给你看——按域名、按 IP、按代理节点——数据经 WebSocket 实时取自 Clash、mihomo 或 OpenClash。

Screenshot of Neko Master
编辑截图, 29 Sep 2026Neko Master ↗

这是什么

一个可自托管的本地网关流量面板:通过 WebSocket 从 Clash、mihomo 或 OpenClash 采集,回答流量去了哪里——按域名、按 IP(含 ASN 与地理位置)、按代理节点——并给出半小时、一小时、一天的趋势,支持同时监控多个网关后端,有 PWA 外壳、深色模式和英文/中文界面。它以单个 Docker 镜像运行,默认用 SQLite、可选 ClickHouse,另外提供一套命令行 agent,给跑不了容器的网关用。

谁做的GitHub 账号 foru17,提交署名 luolei、邮箱 i@luolei.org,这里的 175 次提交里有 173 次出自他。另外两次是被保留原作者身份摘取进来的单次贡献——维护者自己在发布说明里提到了这件事。和这个体量的多数仓库不同,这里每一次提交都挂在真实账号上,所以贡献者图说的是它看起来在说的话。

制作过程

7 个阶段
  1. 01

    模型写在第一次提交里

    2026-02-05 的首次提交写的是 init:create clash master project,powered by kimi k2.5。很少有仓库会写明白自己是被什么造出来的,更少有人把它放在历史的第一行。后面的提交保持了这个习惯:175 次里有 40 次带共同作者尾注,写明模型——Claude Fable 5 十五次、Sonnet 4.6 九次、Opus 4.8 八次、百万上下文的 Opus 4.6 与 4.7 合计五次,还有一次单写 Claude Code。按顺序读这些尾注,看到的是一个从某个模型起步、后来换到另一个模型的项目——这比一句「用 AI 做的」有用得多。

  2. 02

    一个把看不见的流量摊开的面板

    一个跑着 Clash、mihomo 或 OpenClash 的网关决定了每条连接的去向,然后就把它忘了。Neko Master 把它留下:采集器通过 WebSocket 订阅并写入 SQLite,界面回答随之而来的问题——用过哪些域名、它们解析到哪些 IP(连同 ASN 与地理位置)、流量如何分布在各个代理节点上,以及这些在过去半小时、一小时、一天里怎么变。可以同时监控多个网关后端,也能装成 PWA。README 里有一段免责声明值得原文引出,因为这个题材容易被误解:本项目不提供任何网络接入服务、代理订阅或跨网络连通性,它显示的每一个数字都来自用户自己的网络。它是个观察器,并且自己这么说。

  3. 03

    二月把活干完了

    提交分布偏得值得记下来,而不是抹平:175 次里 140 次落在 2026 年 2 月——项目开始的那个月——随后 3 月 4 次、4 月 5 次、5 月 2 次、6 月 6 次、7 月 18 次。同期发了十八个 release,分两条并行的线:给命令行采集器(用在跑不了容器的地方)的 agent-v1.3.1 到 agent-v1.4.5,以及给应用本体的 v1.3.9 到 v1.4.0。agent 那条先开始,并且领先应用那条好几个月——这和 issue 区的形状吻合:相当一部分报告来自 OpenWrt 路由器和树莓派,而不是服务器。

  4. 04

    仓库把自己 agent 的工作说明也一起发布

    顶层放着 12,446 字节的 AGENTS.md,以及一个 664 字节、指向它的 CLAUDE.md;.claude/skills/ 里有六个技能——add-stats-dimension、agent-probe-dev、db-conventions、release、ui-conventions、verify-changes——每个都有自己的 SKILL.md。这和 PocketPilot、DeepSeek Harness 是同一套布置,而在这里它不只是存在,而是在承重:一个新增韩语翻译的社区 pull request 明确写着所有键都按 AGENTS.md 第 5 条约定与 en.json 的结构对齐,并自报覆盖率为 505 个键里的 339 个。一份会被外部贡献者按条款号引用的指令文件,是在真的干活。

  5. 05

    在公开场合做根因分析

    这些 issue 串里有一些在这个体量上少见的调试记录。有人测到树莓派 4B 上跑三十天后 stats.db 涨到约 770 MB,并把它背后的行数逐表列了出来;维护者的回复是这份数据让确认变得很容易,并指出有三个彼此独立的 bug 在静默地让保留策略失效——没有配置行时 autoCleanup 默认为 false,与它自己声明的默认值相反;启动路径用的是一段只覆盖分钟级和小时级表的内联清理,而真正那个还会清理健康日志的清理服务从未被实例化;以及那个服务在开关为 false 时本来就会提前返回。另一串始于某个后端在改过凭据后不再采集;答案是编辑表单只用 host、port 和 TLS 重建了 URL,丢掉了原有的路径、查询串和内嵌凭据,于是任何一次编辑——包括只改 token——都会把采集器悄悄指到另一个地址。两条回复给的都是机制,不是症状。

  6. 06

    一位贡献者的修复:保留署名摘取进来,然后又丢了

    一位贡献者报告流量采集器会静默挂死:GatewayCollector 只在 WebSocket 的 error 和 close 事件上重连,所以一条没有收到 reset 就被丢掉的连接——路由器重启、mihomo 重启、NAT 空闲超时——会让套接字永远停在打开状态,而流量同步早已停止。因为后端健康是另一条独立的 HTTP 轮询在查,界面一直显示绿色;这位报告者有一个后端失同步超过一周才发现。他提交了一个心跳看门狗,维护者把它保留原作者身份摘取进 v1.3.9,并在上面加了带抖动的指数退避。另一位贡献者修掉了「代理组被当成规则记录」的问题,在同一个 release 里得到了同样的处理。而 2026-07-30,这位贡献者问:为什么他的改动现在被回退了,因为规则页面又出现了代理组。这个问题公开挂着,没有回答。

  7. 07

    issue 区是什么构成的

    大部分是部署现实,而不是功能之争。有人在平板上装 PWA 被强制竖屏、转不过来,报告者对着 W3C 规范分析了 manifest 里的 orientation: "natural",并解释了它为什么对手机和平板的作用不同。有人发现命令行 agent 在 OpenWrt 上 ps 能看到进程、status 却说 stopped。有人要「按进程归属」——究竟是哪个程序产生了这条流量——并附上观察:Clash Verge 在 TUN 模式下已经能显示。有人想要一个不需要密码的只读模式,好把一个公开实例展示出去而不至于被人乱改。还有人问 sing-box 支持。这些功能请求大多来自在自己已有的硬件上跑它的人——那正是 agent 那条线存在的原因。

相关档案

全部档案 →