Kilobat 文档

从菜单栏、终端或 AI 智能体使用 Kilobat 所需的一切。

安装

CLI 免费且开源。用 Homebrew 安装:

brew install seifip/kilobat/kilobat

这会安装 kilobat 以及它的简短别名 kb。下面的所有示例两者都能用。

也可以下载 Mac 应用,它在 Kilobat.app/Contents/Helpers/kilobat 也附带了 CLI。

Mac App Store 上的 Kilobat Lite

Kilobat Lite 是即将登陆 Mac App Store 的免费版本。它在 Apple 的 App 沙盒中运行,保留了在沙盒里能正常工作的功能:健康检查、速度测试、Wi-Fi 雷达和附近的网络、“为什么连不上?”以及保持唤醒。按应用统计的流量、规则和网络过滤器、DNS 更改、合盖辅助程序和 CLI 需要沙盒不允许的权限,所以只在本网站提供的 Kilobat App 中可用。两者可以同时安装。

为你的 shell 开启 Tab 补全:

# zsh
echo 'source <(kilobat completion zsh)' >> ~/.zshrc
# fish
kilobat completion fish > ~/.config/fish/completions/kilobat.fish

快速上手

单独运行 kilobat 会打开交互式菜单:用方向键或 j/k 移动,Enter 打开,数字键跳转,q 退出。

kilobat status --watch     # live traffic by app; q quit, s sort, f filter, / search
kilobat diagnose           # what is slowing your connection
kilobat speedtest          # speed and latency under load
kilobat profile travel     # switch to the Travel profile
kilobat block com.example.App

运行 kilobat <command> --help 查看任意命令的帮助。

命令

监控

kilobat status [--watch] [--json]每个应用的实时流量和本次会话预算;输出一次 JSON 快照,加 --watch 则输出 JSON Lines 流
kilobat report [--csv|--json] [--summary] [--days 1…365]本地记录的用量历史,或每日总量和用量最多的应用;CSV 每个应用一行
kilobat report compare --total 40GB [--unit GB|GiB] [--direction both|download|upload] (--from DATE --to DATE | --period last-month) [--network NAME] [--json|--csv]把路由器或运营商的数字与 Kilobat 在这台 Mac 上同期记录的数据并排显示,使用相同单位,并列出已记录的时长、每一段空缺以及差异的可能原因
kilobat health-history [--hours 1…720] [--json]应用随时间记录的路由器、互联网、抖动和 DNS 检查
kilobat proxy [routes [--app name] | test] [--json]代理应用、系统代理及其问题;每个应用走了哪条规则和哪个节点;每个节点的响应速度
kilobat vpn [--json]VPN,以及 DNS 或 IPv6 是否绕过了它
kilobat calls [--limit 1…200] [--json]每次通话后:卡顿了几次以及原因,来自 App 生成的报告
kilobat overlay [--port 7171] [--target internet|router|host]适用于 OBS 等直播应用的实时 ping 叠加层,在 localhost 上提供,直到按下 Ctrl-C
kilobat support-report [--hours 1…168] [--host h] [--markdown|--html] [--output f]给运营商或 IT 支持部门的报告:发现的问题、延迟、断网和速度测试,不含你的网络名称和本地地址
kilobat networks [forget <name>]见过的网络,以及为每个网络记住的配置、预算和流量计费方式
kilobat networks cost <metered|unmetered|automatic> [name]把当前网络或指定网络视为按流量计费或不限流量,或重新跟随 macOS
kilobat bandwidth [app] [hour|day|week|month] [--back N] [--json]某个应用在一小时、一天、一周或一个月内发送和接收的字节数及峰值;--back 回溯到更早的时段
kilobat access-policy <bundle-id> [--json]应用开发者在其互联网访问策略中声明的连接及原因

诊断

kilobat diagnose [--json]Wi-Fi、路由器、互联网、DNS 和强制门户检查,并给出建议
kilobat radar [--watch] [--json]信号评分和最佳位置查找
kilobat scan [--json]附近的网络、信道和信道宽度
kilobat channels [--json]每个信道的拥挤程度,以及最不拥挤的信道
kilobat speedtest [--json] [--budget-mb 1…80] [--parallel]Cloudflare 测速、负载下延迟,以及通话和流媒体判断,最多 80 MB。默认使用 1 个连接;--parallel 会打开 4 个,和大多数测速网站一样
kilobat speed-compare [<test> <test>] [--json]两次已存速度测试之间有何不同:网络、时间、服务器、连接数、Wi-Fi 频段和信号、VPN、其他流量
kilobat ip [--public] [--json]流量出口:在这台 Mac 上读取的网络接口和 VPN;--public 还会向 Cloudflare 查询你的公网 IP 及其注册国家或地区
kilobat stutter [--seconds 10…60] [--target router|internet|<host>] [--json]每 50 ms ping 一次,找出速度测试漏掉的短暂延迟尖峰、发生时间以及是否重复出现
kilobat airdrop [status|everyone|contacts|off] [--json]隔空投送可见性、隔空投送链路(AWDL)及其使用者;更改可见性会打开系统设置
kilobat bluetooth [--json]蓝牙设备,以及它们是否与 Wi-Fi 共用 2.4 GHz
kilobat dns [automatic|cloudflare|google|quad9|flush]读取或设置 DNS,或清除缓存

Wi-Fi

kilobat wifi [status]当前网络、信号、信道和链路速率
kilobat wifi on|off|restart|disconnect控制 Wi-Fi 电源和连接
kilobat wifi join <name> [--password-stdin]加入已存网络或新网络
kilobat wifi known按优先顺序列出已存网络
kilobat wifi password|share <name>显示已存密码,或生成可用手机扫描的二维码
kilobat low-latency on [--for 15m|1h|2h] [--until-quit <app>]在通话和游戏时暂停隔空投送和 AWDL:默认 15 分钟,最长 4 小时,或直到某个应用退出
kilobat low-latency off恢复隔空投送和 AWDL,在应用中开始的暂停也适用

唤醒与智能体

kilobat awake [--display]保持 Mac 唤醒,直到按下 Ctrl-C;合上盖子仍会睡眠,除非加上 --lid-closed
kilobat awake --lid-closed [--for 2h|--until-quiet|-- <command>]合盖时也继续运行,最长 8 小时,通过应用的电源辅助程序实现;需要在设置中开启“允许合盖运行”
kilobat awake --for 90m|2h|45s保持唤醒一段时间
kilobat awake --until-quiet [--app <id>] [--quiet 1…60]保持唤醒,直到下载或某个应用安静下来:默认为连续 3 分钟低于 16 KB/s
kilobat awake -- <command> [args]在命令运行期间保持唤醒,然后报告其进程传输的数据量,并以该命令的状态退出
kilobat awake --while-frontmost <app> [--display] [--for 2h]仅在该应用位于前台时保持唤醒,适合阅读或演示。切换到其他应用后 Mac 可以睡眠;应用退出、电量降到 20% 或到达 --for 时长后结束。--display 还会让屏幕保持常亮
kilobat settings awake-on-power on|off接通电源适配器时应用始终保持唤醒,拔掉后让 Mac 恢复睡眠
kilobat settings keep-screen-on on|off应用保持唤醒的所有情况下都让屏幕常亮:定时、下载、智能体、前台应用和接通电源
kilobat sessions [--days N] [--json]应用记录的唤醒会话和 AI 智能体运行,包括使用的流量和网络变化
kilobat agent-event <start|working|waiting|done|failed> [--agent name] [--stdin-json|--json-arg]供智能体的钩子使用:告诉应用某次运行已开始、正在等待你或已完成。无输出,始终以 0 退出
kilobat why <url|host> [--app <id>] [--proxy <url>] [--context container|vm|remote|provider] [--failed-at <time>] [--json]找出阻断连接的那一层:网络和接口、代理及应用自己的代理、DNS、Kilobat 规则、IPv4 和 IPv6、TLS、服务器以及每次重定向。会请求确切的 URL;输出中隐藏查询参数值
kilobat conditions [--json]按流量计费、低数据模式、VPN、延迟、电池和发热、能否合盖,并为长时间运行给出建议

控制

kilobat profile [travel|work|unrestricted]列出或选择配置
kilobat allow|block <bundle-id> [--minutes 1…1440] [--profile name]保存应用规则,可设为临时规则或用于其他配置
kilobat reset <bundle-id> [--profile name]移除应用的规则,让它遵循默认设置
kilobat rules [--profile name] [--json]某个配置的规则
kilobat limit [GB] [--cycle session|daily|weekly|monthly] [--reset-day N] [--alert 50,80,100]读取或设置当前网络的流量预算、重置时间和提醒时机
kilobat quota <bundle-id> <GB> [--upload] [--all-networks]限制单个应用在每个预算周期内的流量;quota <bundle-id> --remove 可取消限制
kilobat quota --list [--json]各应用的配额及本周期已用量
kilobat updaters [--json]在按流量计费的网络上暂停的更新程序、在此网络上仍然漏过的更新流量,以及在自身进程内更新的应用
kilobat updaters on|off当网络按流量计费时,暂停 Google Updater 和 macOS 软件更新等更新辅助程序(默认开启);应用本身照常工作
kilobat settings [name [value] ]读取或更改设置,例如 new-apps(allow、ask 或 block)、apple-software、auto-travel、pause-updaters、awake-on-power、public-ip(默认关闭)、speed-streams、alerts 和 menu-bar
kilobat approvals [--json]在询问新应用模式下等待批准的应用,附签名者和目标地址
kilobat approve|deny <app-id> [--minutes 1…1440]立即阻止等待中的应用,或请用户在 Kilobat 中确认允许
kilobat block-host|unblock-host <domain|IP|CIDR> [--app <id>]为所有应用或单个应用阻止一个域名(含子域名,也接受 *.example.com)、IP 或地址段
kilobat quit <PID> [--force]退出进程

初始设置

kilobat open打开 Mac 应用
kilobat doctor检查应用、网络过滤器和监控
kilobat completion [zsh|bash|fish]输出 shell 补全脚本
kilobat mcp通过 stdio 为 AI 智能体运行 MCP 服务器
kilobat update更新通过 Homebrew 安装的版本

进阶

kilobat destinations [--pid PID] [--json]观察到的进程套接字
kilobat devices [--bonjour] [--json]你网络中的设备和 Bonjour 服务
kilobat devices name <MAC> <name>为设备命名
kilobat trace <host> [--rounds 2…10] [--json]最多 12 跳的路由探测;--rounds 会多次追踪,并显示每一跳的丢包和延迟
kilobat route-history --host <host> [--json]到某个主机的所有已存追踪,像 mtr 一样逐跳汇总:丢包、最佳、平均、最差、路由变化以及延迟从哪里开始
kilobat http-check <URL> [--json]DNS、连接、TLS 和首字节耗时
kilobat dns-benchmark解析器耗时
kilobat lan-test <server> [--reverse] [--json]对运行 iperf3 -s 的设备进行 5 秒 iperf3 测试;需要 iperf3,Kilobat 不会替你安装
kilobat interfaces [--json]物理接口和 VPN 计数器,分开显示
kilobat capture <interface> <file.pcap>有限时长的数据包捕获
kilobat connection-rule allow|block <app> <host> [port]保存目标规则
kilobat blocklist status|import <path>|clear管理域名阻止列表
kilobat wake <MAC-address>发送网络唤醒(Wake-on-LAN)数据包
kilobat spots [save <name>|remove <id>]已存的 Wi-Fi 位置
kilobat outages / speed-history [--days N]以 JSON 格式输出记录的断网事件和速度测试

脚本与 JSON

通过管道输出时会自动切换为 JSON,脚本永远不用解析给人看的排版。也可以传入 --json 明确指定。

kilobat diagnose | jq .health            # "good", "degraded", "poor" or "unknown"
kilobat status --watch --json             # one JSON object per line, every second
kilobat report --summary --days 7 --json  # daily totals and top apps
kilobat report compare --total 40GB --period last-month --csv  # beside your provider's figure

设置 NO_COLOR 可关闭颜色。更改 DNS 需要管理员批准。

AI 智能体与 MCP

Claude Code、Codex、Cursor、Gemini CLI、Claude Desktop、Windsurf、Cline、Zed 和任意 MCP 客户端的分步设置,请见在 AI 智能体中设置 Kilobat。

把这段提示词交给 Claude Code、Codex 或 Cursor 之类的智能体:

Install the Kilobat CLI with `brew install seifip/kilobat/kilobat`. Run `kilobat diagnose --json`, `kilobat status --json` and `kilobat scan --json`, then tell me what is slowing my connection and how to fix it. Ask me before changing DNS, profiles or rules.

MCP 服务器

kilobat mcp 通过 stdio 使用 Model Context Protocol。添加到 Claude Code:

claude mcp add kilobat -- kilobat mcp

或者添加到任何读取 mcpServers 配置的客户端:

{ "mcpServers": { "kilobat": { "command": "kilobat", "args": ["mcp"] } } }

只读工具:get_status、diagnose_network、diagnose_connection、get_conditions、get_updaters、get_wifi、scan_wifi、suggest_wifi_channel、get_usage_report、compare_usage、get_app_bandwidth、get_access_policy、get_network_history、list_sessions、benchmark_dns、check_url、list_connections、list_devices、trace_route、get_route_history、compare_speed_tests、get_exit_path(仅当智能体传入 public_ip 时,才会向 Cloudflare 查询你的公网 IP)、list_networks、list_rules、list_approvals、list_blocked_connections、run_stutter_test(只发送 ping)、get_nearby_radios 和 create_support_report(给运营商的报告,由智能体交给你)。它们返回与 CLI 相同的 JSON。run_speedtest 会消耗流量;run_lan_test 会在你自己的网络上传输 5 秒数据,并会先询问;keep_awake 和 release_awake 在设定时间内阻止闲置睡眠,不更改任何设置;keep_awake 配合 lid_closed 可在你允许后让 Mac 合盖继续运行,并会先询问你。更改类工具(set_profile、set_app_rule、set_new_app_mode、decide_approval、block_destination、set_budget、set_app_quota、set_network_cost、set_updater_pause、set_dns(同时会清除缓存)以及 set_airdrop_visibility(会打开隔空投送设置))都标记为更改,其描述会要求智能体先征得你的同意。

某个东西连不上时

kilobat why <host>(MCP:diagnose_connection)从这台 Mac 逐层检查一个主机,不经过 curl 或 nc,因此严格的配置不会把检查本身拦下。它分别尝试 IPv4 和 IPv6,所以 IPv6 出了故障的网络(这是智能体卡住或反复重连的常见原因)也能得到明确的答案。它会指出所用的接口,比如 Wi-Fi、手机热点或 VPN;有多个接口时会逐一尝试。它会报告系统或其 PAC 文件选中的代理;加上 --app 时,还会报告该应用环境中的 HTTPS_PROXY,但不含密码。开启 VPN 或代理时,它会对比直连路径和隧道。发往 VPN 自身解析器的私有名称,会注明是哪个解析器、是否有响应。容器、虚拟机或远程机器中的代码有自己的网络:传入 --context,报告末尾会附上一条可以在那里运行的命令。当托管服务从自己的服务器发出请求时(比如 Warp 对自定义推理端点的做法),如果目标是私有地址(localhost、LAN 或 Tailscale 地址),--context provider 会说明它们访问不到,即便从 Mac 上可以连通。

请给出失败的确切 URL,包括查询部分:它会请求该 URL,但所有输出都把查询参数值显示为 [redacted],所以带签名的下载链接不会泄露。它会以应用的方式发送请求:通过应用的 HTTPS_PROXY、系统代理,或者用 --proxy <url> 指定应用在自身设置中配置的代理地址。当这个代理能用而直连不行时(许多公司网络就是这样),它会如实说明,而不是判定失败;当直连可用而经应用代理的请求失败时,它会说明网络没问题,是应用的路径有问题。对于它无法读取或无法经由的设置,比如 LM Studio 在下载 huggingface.co 内容时使用的 Hugging Face 代理开关,会单独附上一条说明,引用用户反馈的情况,此时结论只会说网络能到达该主机,而不会说应用的请求可以成功。Kilobat 从不更改其他应用的设置。拒绝 HEAD 的服务器只会收到一次读取 1 个字节的 GET,绝不会真的下载。它最多跟随 5 次重定向,指出失败的那一跳,并对重定向最终到达的主机检查 IPv4 和 IPv6。加上 --app 时,它会列出该应用到这个主机或其代理的已打开连接,指出它们是否使用了与本次检查不同的 IP 版本或服务器,并在几秒后再看一次:没了动静的传输会被报告为静默,绝不会报告为已完成。报告会记录应用的名称和版本、发送的方法、经过的路径;加上 --failed-at 时,还会把应用失败的时间与检查运行的时间并列。检查通过,意味着这个请求此刻能从这台 Mac 经该路径完成;它看不到已在进行的传输状况如何,那要用 kilobat bandwidth <app> 来观察。

连接智能体

没有额外帮助时,Kilobat 根据智能体的流量和 CPU 判断,所以一个安静的智能体可能已经完成,也可能在等你。智能体的钩子会告诉 Kilobat 某次运行属于哪个项目、何时在等你、何时完成。每个钩子都运行 kilobat agent-event,它不输出任何内容、立即返回且始终以 0 退出,因此不会搞坏智能体。如果应用没在运行,事件会先存进一个小文件,应用打开时再读取。Kilobat 只读取会话 ID、文件夹和简短的状态文字,从不读取提示词或回复。请把这些钩子与你已有的钩子合并。

Claude Code,写在 ~/.claude/settings.json 中。每个钩子都会通过 stdin 收到包含会话 ID 和文件夹的 JSON,由 --stdin-json 读取。出现权限或输入提示表示在等待;Stop 表示后台任务结束后即完成;遇到速率限制表示要等限制重置。

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "Notification": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "StopFailure": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }],
    "SessionEnd": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent claude --stdin-json" }] }]
  }
}

Codex,最简单的方式:在 ~/.codex/config.toml 中设置 notify。Codex 每轮结束后会传入一个 JSON 参数,由 --json-arg 读取。它只会报告完成,而且 Codex 只运行一个 notify 程序。

notify = ["kilobat", "agent-event", "done", "--agent", "codex", "--json-arg"]

如果还想知道等待状态,请改用 ~/.codex/hooks.json 中的 Codex 钩子,并用 /hooks 信任它们:

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "PermissionRequest": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent codex --stdin-json" }] }]
  }
}

Gemini CLI,写在 ~/.gemini/settings.json 中。Gemini CLI 以 node 的身份运行,因此 Kilobat 无法把它的流量对应到这次运行,但状态可以正常传递。

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "BeforeAgent": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "Notification": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }],
    "AfterAgent": [{ "hooks": [{ "type": "command", "command": "kilobat agent-event --agent gemini --stdin-json" }] }]
  }
}

Cline(CLI、SDK 和 Kanban):安装 Kilobat 的插件,它只会在 Cline 的插件存储中添加一个文件,不改动其他设置。cline plugin uninstall kilobat 可将其移除。

cline plugin install https://kilobat.app/agents/cline/kilobat.ts

它会报告运行处于工作中、已完成、失败(在 Cline 保持打开时)、已取消、被限速(Cline 自身的重试用尽后),以及 Cline 向你提问时的等待状态。它会等子智能体和协作成员都结束后才判定运行完成。插件看不到 Cline 的审批提示,这部分由流量和 CPU 检测来覆盖。

其他任何智能体都可以从自己的钩子调用 kilobat agent-event start|working|waiting|done|failed --agent <name> --session <id> --cwd <folder>。手动试用时加上 --verbose,即可看到发生了什么。

为什么各家测速结果不一样

Kilobat 的速度测试每次只向 Cloudflare 最近的数据中心发起一个 HTTPS 连接,每个方向 8 秒、最多 80 MB,并在传输前和传输中 ping 1.1.1.1。Ookla 的 Speedtest、fast.com 和 macOS 的 networkQuality 会同时打开多个连接并自行选择服务器,所以在高速或远距离链路上通常显示得更快。在速度标签页的测试按钮旁选择 4 个连接,或运行 kilobat speedtest --parallel,看看这对你的连接影响有多大。每次保存的测试都会记录 Cloudflare 数据中心、连接数、链路(Wi-Fi 频段、信道、信号和链路速率,或以太网)、所经过的 VPN,以及期间这台 Mac 传输的其他流量。“历史记录 › 速度测试对比”、kilobat speed-compare 和 MCP compare_speed_tests 可以把两次测试并排比较,列出不同之处,并说明每一项会如何影响结果。它们列出的是差异而非原因:你网络中的其他设备也在争用带宽,而 Kilobat 看不到它们。

VPN 与公网 IP

“健康 › 流量出口”、Wi-Fi 菜单和 kilobat ip 会显示默认路由使用的接口以及它是不是 VPN,信息来自这台 Mac 的路由表和 macOS 列为已连接的 VPN。如果 VPN 已连接但默认路由仍走 Wi-Fi(例如未设置出口节点的 Tailscale),会显示为“分流”:只有部分目标经过它。打开“设置 › 网络 › 查询公网 IP”,还能看到网站看到的地址:在网络变化时以及每 30 分钟向 Cloudflare 查询一次,并根据 Kilobat 内置的 DB-IP 数据显示其注册所在的国家或地区。该功能默认关闭,因为 Cloudflare 会看到这个请求;kilobat ip --public 只查询一次。注册国家或地区并不代表你或服务器所在的位置,它和 VPN 都不能证明连接是私密或匿名的。“设置 › 菜单栏 › VPN”会在蝙蝠旁显示“开启”“分流”或“关闭”(打开查询时附带国家或地区代码),历史记录会列出 VPN 何时开启或关闭、公网 IP 何时变化。

路由历史

“工具 › DNS 与 LAN › 追踪 3 次”或 kilobat trace <host> --rounds 3 会对一条路由追踪三次,每跳发送三个探测包,并保存每次追踪。“历史记录 › 已存路由”把到某个主机的所有已存追踪逐跳合并,像 mtr 一样:丢包、最佳、平均、最差和最近一次延迟,哪些跳点换了路由器,以及持续延迟从哪里开始。如果某一跳不回应而后面的跳点有回应,那是路由器在限制探测速率,并不是丢包。若只测本地网络,kilobat lan-test <device> 会对运行 iperf3 -s 的设备执行 5 秒 iperf3 测试;iperf3 需要自行安装,Kilobat 从不安装任何东西。

某个应用在前台时

阅读或演示时,茶杯菜单里的“某个应用在前台时”只在你选定的应用位于前台时保持 Mac 唤醒,一旦切走就允许它重新睡眠。茶杯菜单里的“保持屏幕常亮”决定屏幕是否也保持点亮,这对 Kilobat 保持唤醒的所有情况都一样。Kilobat 跟随 macOS 自身的应用切换事件:它不轮询、不移动鼠标,也不伪造活动,所以无法让你在监控软件面前显得“在线”。应用退出、你手动关闭,或使用电池时电量降到 20%(或你为合盖运行设定的下限)时,它就会结束,而且从不阻止合盖睡眠。它有自己独立的唤醒保持,所以切换应用或退出应用都不会结束唤醒会话或智能体运行。在终端中:kilobat awake --while-frontmost Keynote --display。

接通电源时

打开“接通电源时保持唤醒”(设置 › 唤醒与智能体),或茶杯菜单里的“接通电源时”,插上电源适配器后 Mac 会一直保持唤醒,直到你拔掉电源,状态条上也会显示“接通电源时保持唤醒”。“保持屏幕常亮”决定屏幕是否也保持点亮。关闭后,它会保持关闭直到你下次插电,即使 Kilobat 重启也是如此。Kilobat 通过 macOS 自身的电源变化通知得知插拔,无需轮询。拔掉电源只会结束由插电开启的会话:你自己开启的会话、正在等待的下载、前台应用、智能体运行或来自终端的唤醒保持都会继续。它从不让 Mac 在合盖时继续运行。在终端中:kilobat settings awake-on-power on,屏幕用 kilobat settings keep-screen-on on;kilobat conditions --json 会将其报告为 awakeOnPower。

合盖运行

合上盖子会让 Mac 睡眠,即使 Kilobat 正在保持唤醒也一样,除非你在“设置 › 唤醒与智能体”中允许合盖运行。这会安装一个以 root 身份运行的小型辅助程序;macOS 会请你在“系统设置 › 通用 › 登录项”中允许它。开启后,正在工作的智能体运行会让 Mac 在合盖时继续运行;在茶杯菜单中勾选了“合盖时也保持”的唤醒会话也是如此。等待你操作的智能体只有在开启“智能体等待时保持唤醒”后才会保持,且最长 30 分钟。

合上的 Mac 放在包里可能过热、耗光电池,所以辅助程序本身会在以下情况让 Mac 睡眠:电量降到你设定的下限(默认 20%)、Mac 温度过高、选择仅在接通电源时保持则一拔电源就睡眠、超过你设定的最长时长(最多 8 小时),以及 Kilobat 退出 1 分钟后。如果辅助程序或 Mac 在保持期间重启,它会先恢复原来的设置。Kilobat 会显示每次唤醒保持是如何结束的,例如“已允许 Mac 睡眠:电量为 20%”。

在终端中,kilobat awake --lid-closed 会向应用请求同样的唤醒保持,做不到时会说明原因;命令结束时,保持也随之结束。智能体使用 keep_awake 配合 lid_closed,其描述会要求智能体先与你确认。kilobat conditions --json 会报告 lidClosedAllowed 和当前的 lidHold。

智能体技能

9 个 Agent Skills 教编程智能体排查 Mac 网络问题,并借助 Kilobat 让长时间运行不中断。它们会解读 Kilobat 的测量结果,说明哪些地方不确定,并在更改设置前先询问。请一起安装;kilobat 技能会把智能体引向最合适的那个技能。

npx skills add seifip/kilobat-skills
kilobat从这里开始。设置、安全规则,以及哪个技能适合当前问题。
mac-network-troubleshooting网速慢或不稳定、原因不明:找出出故障的那一层。
mac-wifi-troubleshootingWi-Fi 信号弱或经常掉线、信道拥挤、Mac 或路由器的最佳摆放位置。
mac-hotspot-data-saver手机热点和流量上限:什么在用流量、出行配置、预算。
mac-dns-troubleshooting解析慢、解析器基准测试、切换 DNS、强制门户。
video-call-network-check卡顿的通话和游戏串流:延迟尖峰、抖动、丢包、缓冲膨胀和后台上传。
mac-bandwidth-monitor哪些应用在用网络、用量历史,以及它们连接到哪里。
mac-app-firewall阻止或允许应用、域名和 IP;询问新应用并作出回应。
mac-agent-runs长时间的智能体运行:保持 Mac 唤醒、检查运行条件、连接智能体钩子,查看运行何时完成、在等你操作或已卡住。

用上面的 Homebrew 命令单独安装 Kilobat CLI,或连接它的 MCP 服务器。CLI 需要 macOS 14 或更高版本;通过 Homebrew 从源码构建需要 Xcode 16 或更高版本。查看 skills.sh 上的技能,或阅读它们的源码和参考资料。

Mac 应用

  1. 下载磁盘映像,把 Kilobat 拖到“应用程序”文件夹,然后从那里打开。
  2. 实时流量、Wi-Fi 选择器、速度测试、保持唤醒和“为什么连不上?”都是免费的,整个 CLI 也免费。Pro 在应用中增加规则和询问、预算、Wi-Fi 健康、连接地图、雷达和历史记录。要解锁 Pro,可以开始 7 天试用,或把许可证粘贴到设置中。
  3. 在设置中选择菜单栏项目。按住 Command 键拖移菜单栏项目,即可移动它的位置。

系统询问时请允许定位访问,这样 Kilobat 才能显示 Wi-Fi 名称并扫描附近网络。你的位置不会被发送到任何地方。

按应用查看带宽

每一行应用都显示它最近一分钟的流量,上传在线上方,下载在线下方。点按即可查看这个应用的回声:先是一句话说明它传输了什么,然后是最近 5 分钟的实时波形,有 Pro 时还能按小时、天、周或月查看历史。标记会显示 Mac 何时加入其他网络、何时有智能体运行用到了该应用;卡片显示哪些网络承载了流量、与该应用前四个时段相比如何,以及它占全部流量的比例。图表下方是该应用已打开的连接(含每个连接传输的数据量和国家或地区),以及应用开发者在互联网访问策略中声明的连接(如果有提供的话)。

与路由器或运营商对比

如果路由器、宽带运营商或移动运营商显示的总量与 Kilobat 不同,打开“历史记录 › 与路由器或运营商对比”,或运行 kilobat report compare。按对方显示的样子输入数字、单位,以及它统计的是下载、上传还是两者,然后输入相同的时段和对应的网络。Kilobat 会以相同单位显示自己的总量和差值,并按另一套单位制换算对方的数字,因为许多运营商写的 GB 实际是 1,073,741,824 字节(GiB),而不是 1,000,000,000。

一条时间条显示 Kilobat 实际记录的时长及空缺:Mac 睡眠的时间(从 Kilobat 1.3 开始记录)、关机、离线或 Kilobat 未运行的时间、在其他网络上的时间,以及历史记录开始之前的时间。下方按可能性从高到低列出差异的可能原因。Kilobat 只能看到这台 Mac,看不到路由器或运营商统计在内的手机、电视和其他电脑。它不计入从不到达互联网的本地网络和隔空投送流量,并把不属于任何应用的数据包头计为未归属。运营商可能按其他时区计算日期,或者延迟公布用量。Kilobat 不会判定哪个数字是对的。可以把对比导出为 CSV 或 JSON,包含时段、网络、已记录时长和每一段空缺,方便发给运营商。

卡顿测试

通话、游戏串流和远程桌面可能卡顿,而速度和丢包看起来都正常,因为几百毫秒的 ping 尖峰会被平均值掩盖。健康标签页里的卡顿测试会在 20 秒内每 50 ms ping 一次路由器(或互联网),画出每一次回应,尖峰用玫红色标出,并给出中位数、p95、p99 和最差 ping。它会告诉你尖峰是按固定间隔重复出现(通常指向隔空投送/AWDL 扫描),还是随机出现(指向网络繁忙、干扰或信号弱)。许多路由器每秒只回应约 10 个 ping;Kilobat 能识别这种模式,不会把它算作丢包。有 Pro 时,开启低延迟后对比会在暂停隔空投送/AWDL 的情况下再测一次,并告诉你是否有改善。

低延迟暂停会关闭隔空投送、随航和通用控制,持续 15 分钟、1 小时或 2 小时,或直到游戏、通话等应用退出,最长 4 小时。时间到、应用退出、Kilobat 退出或网络变化时,它都会恢复;如果 Mac 崩溃,下次启动时也会恢复。macOS 会要求管理员批准。健康标签页的“附近”面板还会显示隔空投送的无线电是否活跃、被谁使用、你的隔空投送可见性,并可按需显示与 Wi-Fi 共用 2.4 GHz 频段的蓝牙设备。

Wi-Fi 菜单会在网络下方列出你的蓝牙设备:点按即可连接或断开。已连接且与 Wi-Fi 共用频段的耳机、键盘和鼠标会带有 2.4 GHz 标签,并提供切换到已知 5 GHz 网络的快捷方式。再往下是隔空投送,显示其可见性、正在使用该链路的程序以及低延迟暂停。只有在你选择“显示蓝牙设备”后才会出现蓝牙,macOS 也只在那时请求访问权限。

代理和 VPN

Kilobat 可以与代理应用(Clash Verge、ClashX、mihomo、Mihomo Party、FlClash、Surge、sing-box、Stash、V2Ray、Xray、Shadowsocks)和 VPN 一起使用。它只读取信息,从不转发流量,也不更改它们的设置。

  • 流量计入正确的应用。通过本地代理发送流量的应用会计入它自己的流量,转发流量的代理核心或 VPN 隧道则标为“承载其他应用的流量”,不会重复计算。
  • 每个应用走了哪条路线。使用兼容 Clash 的 API(Clash Verge、ClashX、mihomo、Mihomo Party、FlClash、sing-box 的 clash_api)时,应用的那一行会显示它经过的节点,例如“经由 HK-01 · 2 个直连”,提示中会列出每个主机、节点和规则。Kilobat 从该应用自己的配置中读取 API 地址和密钥,并且从不显示密钥。
  • “健康 › 流量出口”中会显示的问题:
    • 系统代理指向未运行的应用,这会让所有浏览器都无法上网;
    • DNS 或 IPv6 绕过了 VPN;
    • 代理和 VPN 同时在接管流量;
    • 全局模式;
    • 阻止功能看不到系统代理背后的应用。macOS 过滤器永远看不到发往 127.0.0.1 的连接,所以请打开代理的 TUN 模式,或在代理的规则中阻止该应用。
  • 为什么连不上?会增加一个“代理应用”层,显示代理的模式及其当前节点的响应速度,并在问题出在失效节点时指出来。

在终端中:kilobat proxy、kilobat proxy routes --app Telegram、kilobat proxy test 和 kilobat vpn。如果 Kilobat 自己找不到某个代理核心,可以传入 --controller 127.0.0.1:9090 --secret …。智能体可以通过 get_proxy_status、test_proxy_nodes 和 check_vpn 获得同样的信息。

小组件

把 Kilobat 添加到桌面或通知中心:右键点按桌面,选择“编辑小组件”,然后搜索 Kilobat。网络状态用蝙蝠表示连接的健康状况,并显示互联网和路由器的 ping;中号尺寸还会加上最近 30 分钟的延迟、你最近一次速度测试和一个“测试”按钮。今日流量按小时显示今天的互联网流量(下载和上传);使用 Pro 时还会显示你的预算。速度测试显示你最近一次的结果,点按一下即可运行新的测试(在按流量计费的网络上为 10 MB)。小组件不显示任何网络名称或地址,有变化时就会更新,Kilobat 未运行时会注明数据是多久以前的。

通话报告

每次通话后,Kilobat 都会告诉你通话是否卡顿以及原因。当 Zoom、Microsoft Teams、FaceTime、Slack、Webex、Discord、Skype、WhatsApp、Telegram、Signal 或浏览器使用麦克风超过十秒时,它就会察觉到通话。它从不收听通话内容:它只看到哪个 App 在使用麦克风,而这一点 macOS 本来就会显示。在通话结束前,它每秒 ping 一次互联网和你的路由器,记下最忙的其他 App,并每五秒检查一次 Mac 的 CPU、内存、温度和 GPU。

连续两秒或更长时间 ping 丢失,或 ping 比该通话平常慢 200 ms,就算作一次卡顿。每次卡顿都会标出原因:当时有其他 App 在上传或下载、Wi-Fi(路由器也同时停顿时)、隔空投送扫描,或发生在路由器之外。此外,卡片还会说明 Mac 本身何时吃力:CPU 满负荷(以及是哪个 App 造成的)、内存不足、Mac 因过热而自行降速,或 GPU 满负荷。卡片会显示在“健康 › 通话”中,并以通知形式出现。没有 Pro 时,它会显示通话卡顿了几次;Kilobat Pro 会指出原因并给出可以尝试的办法。可以在“设置 › 网络 › 每次通话后报告”中关闭。在终端中,kilobat calls 会列出这些卡片,智能体可以通过 get_call_reports 获取它们。

直播叠加层

在直播中显示实时 ping。打开“设置 › 网络 › 直播叠加层”,然后在 OBS、Streamlabs 或任何直播应用中把 http://localhost:7171/ 添加为浏览器源(640 × 80 就够了)。一个小胶囊会显示 ping、抖动、丢包和最近一分钟的曲线。开头的小蝙蝠在曲线良好时是微笑的蓝色,变慢时变成紫色,很差时变成皱眉的玫红色。可以在 URL 中更改:?show=ping,jitter,loss,graph,speed、theme=dark、light 或 clear,以及 size=s、m 或 l。使用 Pro 时,brand=0 会隐藏文字标志,face=0 会用一个简单的圆点代替小蝙蝠。开启期间,Kilobat 每秒 ping 一次 1.1.1.1;页面在 127.0.0.1 上提供,所以只有这台 Mac 能打开。不使用 App 时,kilobat overlay 会提供同一页面,直到按下 Ctrl-C。

给运营商的报告

连接很差时,你的运营商或 IT 支持部门需要证据。在“健康”中,报告按钮会根据 Kilobat 在这个网络上过去 24 小时或 7 天记录的数据生成一份报告。内容包括断网、路由器处及更远处的延迟、ping 丢包、与你的套餐对照的速度测试,如果你添加了出问题的网站,还会附上对它的检查。每条发现都说明测量了什么、在哪里测量,从不说是谁的责任。可以拷贝为文本用于客服聊天,或存储、分享为 PDF。报告不含你的网络名称、任何本地 IP 和硬件地址、设备名称以及哪些应用使用过这个网络。在终端中运行 kilobat support-report --host github.com,或运行 --html --output report.html 获取网页版本。

分享卡片

右键点按菜单栏图标,选择“分享与导出”,即可生成一张可以发布的方形图片:每周回声(你传输的数据、最忙的一天和最“能吃”的应用)、最近一次速度测试,或“这个地方”(为你正在工作的咖啡馆、联合办公空间、酒店或图书馆生成的 Wi-Fi 报告)。“这个地方”会显示地点名称(可以输入,或从 Apple 地图搜索中选取),以及这个网络上最近一次速度测试的下载、上传和 ping、是否足够进行视频通话、有负载时表现如何,以及 Wi-Fi 频段。从搜索中选取地点后,卡片会附上一张所在街区的小地图,并用圆点标出位置;关闭“显示地图”即可去掉。可以添加“有插座”“安静”“营业到很晚”等标签,以及一行备注。Kilobat 会在这台 Mac 上为该网络记住它们。可以拷贝卡片、存储,或分享到 Nomad List、Google 地图评价或联合办公群聊。任何卡片都不会显示网络名称或地址。地图显示的是你选取的地点,而不是你所在的位置,除非你选择“使用我的位置”,这也是“这个地方”唯一会请求定位权限的时候。

其他 App 可以用 kilobat:// 链接(1.3.4 起)在正确的位置打开 Kilobat:kilobat://open/speed 会打开一个标签页(overview、connections、health、radar、speed、history、tools 或 settings),kilobat://share/speed、kilobat://share/week 或 kilobat://share/place 会打开一张分享卡片,kilobat://speedtest 会运行速度测试。可以在“终端”中用 open kilobat://open/history 运行,或在启动器中绑定到某个按键。Raycast 扩展中的 Open in Kilobat 操作使用的就是这些链接,Kilobat 的快捷指令操作可以在“快捷指令”App 中运行检查、速度测试、保持唤醒和报告。

连接去向

连接标签页会在地球上显示每个打开的连接,连向其地址注册所在的国家或地区,最繁忙的国家或地区列在一旁,套接字在下方。点按某个国家或地区即可筛选。国家或地区信息来自应用内置的 DB-IP 免费数据库,因此没有任何地址离开你的 Mac。这是注册地:CDN 或 VPN 的地址显示的是其所有者的国家或地区,而不是服务器所在地。

阻止与过滤

监控无需过滤即可使用。要执行规则,请在 Kilobat 中打开过滤设置,并在 macOS 询问时批准扩展和内容过滤器。在当前的 macOS 上,扩展位于“系统设置”→“通用”→“登录项与扩展”→“网络扩展”。

过滤只影响新连接;已有连接可能会持续到重新连接为止。如果某条规则打断了重要的事情,可以切换到不受限,或在设置中关闭过滤。

新应用:允许、询问或阻止

应用列表上方的胶囊按钮决定出行和工作配置如何处理没有规则的应用。允许让它们连接。询问会拦住应用的首批连接,并弹出一个窗口,显示它的签名者、路径和要连接的地方;允许或阻止一次后,Kilobat 会保存规则。未作答的连接一分钟后放弃,应用会再次询问。阻止只让你允许过的应用连接。打开允许 Apple 软件,macOS 服务和 Apple 的应用无需询问即可放行。你的阻止列表和连接规则在所有模式下都适用;如果 Kilobat 没有运行,新应用会被允许,而不是被拦住。

热点与流量计费

macOS 会把某些连接标记为按流量计费,比如 iPhone 热点,但并非所有 Android 热点都会被标记,通过 USB 或以太网共享网络的手机也不会。每个网络都有流量计费方式:自动跟随 macOS,按流量计费或不限流量则由你决定。可以在 Wi-Fi 菜单、预算菜单、健康标签页或设置中设置,也可以用 kilobat networks cost metered。在按流量计费的网络上,Kilobat 会切换到出行(除非你为该网络选了其他配置),离开时恢复之前的配置,并跳过定时速度测试。kilobat conditions --json 和 MCP 服务器会同时报告 metered 和 macOS 的判断(osMetered)。Kilobat 需要先能区分网络,你才能设置它的计费方式,所以对于 Wi-Fi,它需要定位权限才能看到网络名称。

在按流量计费的网络上暂停更新程序

在按流量计费的网络上,网络过滤器还会暂停那些自行下载更新的辅助程序:Google Updater(以及旧版 Keystone agent)、Microsoft AutoUpdate、macOS 软件更新(softwareupdated)、App Store 下载(appstored、appstoreagent、storedownloadd)、Sparkle 的下载服务,以及 Sparkle 和 Squirrel 的安装程序(Autoupdate、Updater.app、ShipIt)。它们通过普通的过滤规则被阻止,被阻止连接的日志会写明“在按流量计费的网络上暂停了更新程序”,而应用本身照常工作。网络不再按流量计费后,更新会继续。其他应用、它们的暂存文件夹和系统设置都不会被改动,因此无需恢复任何东西。该功能默认开启;可以在设置中或用 kilobat updaters off 关闭。已经适用于某个连接的规则(例如目标规则或临时允许)优先,所以“允许 30 分钟”可以放行一次更新。不受限配置不会暂停任何东西。

健康标签页、kilobat updaters 和 MCP 工具 get_updaters 会显示哪些更新程序在覆盖范围内、哪些更新流量仍在此网络上漏了过去(更新程序自身的流量,以及为其发起连接的系统下载,如 nsurlsessiond,其流量也包含其他下载),以及哪些已安装的应用在自身进程内更新。大多数基于 Sparkle 或 Electron 的应用在应用内部下载更新,只把安装交给辅助程序,所以不阻止应用本身就无法暂停它们。过滤器只阻止新连接,因此网络变为按流量计费之前已经开始的下载可以完成。Kilobat 自己的定时更新检查也会等到不限流量的网络;手动“检查更新”仍然可用。

流量预算与应用配额

每个网络都有自己的预算。默认情况下,它会一直累计到你手动重置。可以设为每天重置、每周在你选定的某天重置,或每月在套餐续期日重置;如果套餐在 31 日续期,较短的月份会在当月最后一天开始新周期。设了周期的预算会统计该网络的用量历史,所以重启后会接着计算。Kilobat 默认在每个周期达到 80% 和 100% 时各提醒一次,你也可以加上 50%。

应用可以有自己的配额:每个周期对它传输的全部流量或仅上传流量设定上限,可针对一个网络或所有网络。可以在应用的带宽面板中设置,也可以用 kilobat quota com.getdropbox.dropbox 2 --upload。开启过滤后,预算用完会阻止新连接,配额用完会阻止该应用的新连接。临时允许或连接规则仍可放行。Kilobat 每秒采样一次流量,所以预算和配额是近似值:应用在被阻止之前可能会稍微超出一点。

哪些会计入:互联网、本地网络和 VPN

预算、配额和已用流量只计算互联网流量。发往本地网络(打印机、NAS、其他电脑、路由器管理页面)的流量,以及隔空投送和其他近距离设备链路(AWDL)的流量会单独显示,例如“本地网络:2.1 GB,不计入”:把指针悬停在预算卡片的已用数字上,或在每个应用的带宽面板中都能看到。Mac 的总量来自 Wi-Fi 和以太网计数器,因此包含不属于任何应用的部分:数据包头和确认包(应用的字节计数不含这些,通常会多出 5–10%)、在两次采样之间启动并结束的进程、互联网共享,或由 macOS 自己运行的 VPN。同一提示会把这部分显示为“未关联到应用”;它永远不会被分配给某个应用。

使用 VPN 时,应用的流量进入隧道,再由 VPN 通过 Wi-Fi 或以太网送出。Kilobat 像运营商一样,在流量离开 Mac 的地方只计一次,并把该应用的部分标为“经由 VPN”。使用代理时(系统代理、HTTPS_PROXY 或本地代理应用),应用与这台 Mac 上的代理通信,由代理建立互联网连接,所以流量显示在代理名下;Kilobat 无法得知背后是哪个应用。TUN 模式的代理对 Kilobat 来说就是 VPN:每个应用自己的连接标为“经由 VPN”,代理的出站流量显示在代理名下。位于私有地址的公司代理计为本地网络。

系统下载

应用会把部分下载交给 macOS:nsurlsessiond(为“音乐”和“播客”等应用进行后台传输)、mobileassetd(Apple Intelligence 和 Siri 的模型、语音、字体)、softwareupdated、appstored 和 appstoreagent、cloudd 和 bird(iCloud)、fileproviderd 以及内容缓存。应用列表把它们归为“系统下载”,并说明各自的用途。开启过滤后,过滤器能看到每个连接是为哪个应用发起的,所以列表会显示“为音乐”,阻止记录会显示“com.apple.Music via nsurlsessiond”。不开过滤时,nettop 只能看到服务本身,所以 Kilobat 无法知道某个下载是为哪个应用进行的。

既不是应用、也不属于 macOS 的进程,比如 node、python、deno、bun,或你个人文件夹或 Homebrew 中的 Go 二进制文件,展开它的行时会显示可执行文件路径,这样陌生的智能体或工具就会很显眼。

在设置中打开异常上传,当某个应用一小时内的上传量达到平时的 5 倍且至少 50 MB 时就会提醒你,每个应用每天最多一次。它只发通知。临时规则和会过期的连接规则会列在“配置”下并显示剩余时间,你可以提前结束。

阻止域名和 IP

右键点按应用的某个已打开连接,即可为该应用或所有应用阻止该主机。阻止列表支持域名(含子域名;*.example.com 也可以)、IP 地址和 CIDR 地址段,还可以与导入的 hosts 列表并用。在终端中:kilobat block-host ads.example.com。

送出 Pro,换来 Pro

每个 Pro 许可证都有自己的推荐链接 kilobat.app/r/ 和一个短代码。你可以在“设置”的“Kilobat Pro”部分或分享卡片下方找到它,旁边有“拷贝链接”和“分享”。无需注册账户:代码来自你的许可证,不会泄露你的许可证密钥。

朋友打开你的链接再打开 Kilobat,就能获得 30 天 Pro 试用,而不是 7 天。每台 Mac 只能使用一个推荐链接,且只能用一次。朋友通过你的链接后在 App 中或网站上购买 Pro,你的许可证就多一台 Mac。每满三位朋友,你就能获得一份免费 Pro 许可证:一个显示在“设置”中的一次性兑换码,结账时输入,可以给自己用,也可以送给任何人。

购买会在 14 天退款期结束后计入;在此之前,“设置”会显示为等待中。已退款的购买、免费许可证以及通过你自己的链接购买都不计入。

隐私

流量历史、网络名称和规则都保存在你的 Mac 上。没有账户,也没有遥测。诊断会连接测试服务,许可证激活和更新检查会连接各自的服务。请阅读隐私声明。