Nothing is green by default
The state column stays empty for healthy rows, so problems are the only words lit. A service that is registered but has no check is not up. It is registered, not monitored.
v0.2.0 · MIT · self-hosted
From where, via which path, reaching what — and on what evidence.
Self-hosted monitoring of network topology and service availability, read in the terminal. One Go binary with no dependencies is the client, the collector and the observer. It tells you what was measured, from where and how recently. It never shows a check as green that hasn't passed.
go install github.com/WhitenWhiten/topophany/cmd/topo@latest
01 The terminal UI
The Overview answers before you read a word: a verdict, a map of every place and path, and the short list of what needs attention. Below is topo preview recorded frame by frame from the TUI's own renderer. The evidence is synthetic, but it goes through the real state engine.
All is well until x switches the preview to a scenario where the DMIT line is blocked from mainland China.
1–9 chapters m map v view x scenario space pause, or click the tabs inside the terminal. Run topo preview to try the real thing.
02 Semantics
Health, the source of the evidence and its freshness are separate fields. Nothing turns green without a passing check, a service nobody monitors stays unknown, and a cached view says so.
The state column stays empty for healthy rows, so problems are the only words lit. A service that is registered but has no check is not up. It is registered, not monitored.
Each observer measures from where it actually is. A failure seen from home is a fault on that path, not a server outage, and the incident shows which observers still get through.
Behind Cloudflare, Vercel or another CDN, any answer from the edge, even an error page, proves the edge. The origin counts only a passing response the edge did not serve from cache. The probe records which edge answered and from where.
FAILED CHECKS m-exit-dmit-aaitr OTHER-OBSERVER RESPONSE EVIDENCE w-exit-s2-aaitr, w-exit-s2-qqpr HYPOTHESIS (NOT A FINDING) source/path-specific interference, filtering or routing fault is possible; blocking authority and untested protocols are not established No inference about all IP ports, untested UDP, physical power or GFW authority.
Incidents carry the failed checks and what other observers still see. Nothing is inferred about ports or protocols that nobody tested.
policy outcome. Reachability and egress policy are judged separately.03 Architecture
No CGO, no database daemon, no Node.js, and zero external Go modules. topo is the terminal client, the collector and the observer, and closing the client does not stop monitoring.
observers
collectors
clients
topo workera laptop at hometopo workera server in Tokyotopo serve --observerthe collector's own baselinetopo servejournal A · fsync before ACKtopo servejournal B · independenttopothe TUI, with failovertopo --jsona snapshot for scriptsWorkers deliver to both collectors on their own and buffer in a bounded outbox. Duplicates are dropped by observation ID, and records from a mismatched configuration revision are quarantined.
There is no remote configuration API, no remote shell and no automated remediation. Topology lives in reviewed local JSON, edited with topo edit and checked with topo validate.
By default it keeps 24 hours or 20,000 raw records and gives the worker outbox 32 MiB. When a quota fills, probing stops with an error rather than dropping evidence.
04 Probes
Native probes and explicit proxy chains, plus read-only adapters for the tools already on your hosts.
-W · verified hosts05 Install
Prebuilt archives for Linux, macOS and Windows, or one go install. The demo probes only its own loopback API and generates fresh credentials each time it runs.
go install github.com/WhitenWhiten/topophany/cmd/topo@latestNeeds Go 1.26.9 or newer. Building downloads no modules.
Archives for Linux, macOS and Windows on amd64 and arm64, each with SHA256SUMS.txt.
git clone https://github.com/WhitenWhiten/topophany
cd topophany
go build -trimpath -o topo ./cmd/topoNO_COLORThe full TUI on a built-in topology with synthetic evidence. Press x to break something.
topo previewWrites a demo topology and fresh credentials, then serves on 127.0.0.1:7447.
topo init --dir ./demo
topo serve --config ./demo/topology.json \
--auth ./demo/auth.json --data ./demo/collector-data \
--observer demoIn another terminal. Later, topo login saves a remote profile, and then plain topo is enough.
topo --credentials ./demo/credentials.json