默认没有绿色
健康的行保持安静。没有检查就是 unknown,而不是在线。
v1.7.0 · MIT · 自托管
从哪里出发,经由哪条路径,抵达了什么——依据又是什么。
整张网络尽在一屏:哪条路径从哪里走得通,哪些服务有应答,每个状态背后的证据是什么。自托管,一个 Go 二进制文件,在终端里查看。
go install github.com/WhitenWhiten/topophany/cmd/topo@latest
按 x,家里到洛杉矶中转线路的连接被阻断。只有确认的失败才会变红。
1–9 章节 space 暂停。也可以自己运行 topo preview。
02 语义
没有通过的检查,就不会变绿。没人监控的服务保持 unknown。
健康的行保持安静。没有检查就是 unknown,而不是在线。
从一个地方看到的失败,是那条路径的故障,而不是服务器宕机。
法兰克福worker · DigitalOcean
Cloudflare边缘 · FRA
纽约源站 · Oracle
GET /
连接被拒
HTTP 521cf-ray: …-FRA
● 在线它作出了应答
▲ 受影响未经证明
结论 故障在边缘之后 · 源站未经证明
CDN 的应答无论自称什么,都只能证明边缘;只有不经过边缘、直达源站的检查,才能证明源站。
✖ INCIDENTVLESS+Reality 入口搬瓦工 · 洛杉矶
事件给出证据,此外的一切都标为假设。
03 架构
topo 既是客户端,也是采集器和观测点。不需要 CGO、数据库或外部模块。
观测点
采集器
客户端
topo worker家里的笔记本topo worker东京的服务器topo serve --observer采集器自身的基准topo serve日志 A · 先 fsync 再 ACKtopo serve日志 B · 相互独立topoTUI,支持故障切换topo --json供脚本使用的快照worker 同时投递给两者,一方离线时先行缓冲。
没有远程配置 API,也没有远程 shell。拓扑是你审阅过的本地 JSON。
配额用满时,探测报错停止,而不是丢弃证据。
04 探针
原生探针、代理链,以及针对现有工具的只读适配器。
200 · 182 ms符合预期的状态码、正文、头部和出口 IPSSH-2.0 · 38 msSSH banner,不代表能登录A 192.0.2.10 · 9 ms符合预期的 A / AAAA 记录TLS 1.3 · verified · 41 ms经过验证的证书链和名称connected · 23 ms连接已建立,仅此而已nonce echoed · 27 ms随机 nonce 被原样回显echo reply · 31 ms回显应答,仅限 IPv4最多 12 跳。HTTP、TCP、TLS 和 SSH 检查会依次穿过每一跳。
GET /proxies内核报告的模式、链路和当前选择tailscale status --json对端是否在线,直连还是中继wg show wg0 dump最近一次握手与收发字节;从不保留密钥GET /ready连接器报告的隧道会话与 colo工具报告的状态只当作报告展示,绝不算作端到端的通过。
edgeWorkers 与 Pages;以及应答的 POPedgeFunctions;以及边缘与函数区域platform所在区域的托管服务应答记在发出它的边缘名下,绝不算到其后的源站头上。
05 交给 Agent
监控最费工夫的一步,是把网络描述清楚,而这恰好是你手边的编程 Agent 擅长的事。它读取机器上现成的信息,写出拓扑,并在任何东西运行之前,先用 topo validate 检查一遍。
请把我的网络写成 Topophany 拓扑,保存到 topology.json。格式参考 `topo preview --print-topology` 的输出,以及 github.com/WhitenWhiten/topophany 里的 docs/REFERENCE.md。读取我的 SSH 配置、`tailscale status`,以及你能找到的 Compose 文件和反向代理配置:为每台机器写明所在位置、上面跑的服务、服务所属的应用和监听的地址,再从我要运行 worker 的机器发起检查,并把你了解到的情况写进各台机器的 notes。不要把任何密钥写进文件。反复运行 `topo validate --config topology.json` 直到通过,然后告诉我哪些是查到的、哪些是推测的。Claude Code、Codex、Gemini CLI、Cursor,或任何能执行命令的 Agent 都行。密钥不会进文件:格式里只写环境变量名和密钥文件的路径,不写内容。
topology.json一份审阅过的文件,写清什么跑在哪里、每台机器怎么连上,旁边附着笔记和处置手册。Agent 动手之前先读它;它改了什么,你看 diff 就知道。topo status · show · history一条命令,文字或 JSON,你和 Agent 都能用:现在有没有问题、那台服务器上跑着什么、某项检查昨晚表现如何。topo preview --config预览模式用合成证据画出你自己的网络,在启动任何一个 worker 之前,你和 Agent 都能先过一遍。06 在 Mac 上
topophany-bar 是 Topophany 的 macOS 伴侣应用。它通过 topo 读取 collector:状态显示在菜单栏,面板告诉你问题是从哪里看到的,桌面小组件让服务器和服务一直留在视野里。
07 为 iPhone Duo 设计
iPhone App 还没有做。现在有的是 TUI 为它做的设计:--device 让 TUI 按 iPhone、iPad 以及 iPhone Duo 每种姿态的屏幕排版,并在终端里模拟出这块屏幕。在展开的 Duo 上,要看的和要点的分在折痕两侧。

topo preview --device duo-laptop。go install github.com/WhitenWhiten/topophany/cmd/topo@main
topo preview --device duo-laptop[ 和 ] 切换姿态,\ 换下一台设备,鼠标代替手指。终端需要约 99×70 个字符格。下一个版本发布之前,--device 只在 main 上。
08 安装
预编译归档,或者一条 go install。
go install github.com/WhitenWhiten/topophany/cmd/topo@latest需要 Go 1.26.11 或更新版本。
Linux、macOS、Windows,amd64 与 arm64,附带 SHA256SUMS.txt。
git clone https://github.com/WhitenWhiten/topophany
cd topophany
go build -trimpath -o topo ./cmd/topo内置演示。按 x 弄坏点什么。
topo preview在 127.0.0.1:7447 上运行演示。
topo init --dir ./demo
topo serve --config ./demo/topology.json \
--auth ./demo/auth.json \
--data ./demo/collector-data \
--observer demo在另一个终端里运行。
topo --credentials ./demo/credentials.json