Nothing is green by default
Healthy rows stay quiet. No check means unknown, never up.
v1.7.0 · MIT · self-hosted
From where, via which path, reaching what — and on what evidence.
Your whole network on one screen: which paths work from which places, which services answer, and the evidence behind every state. Self-hosted, one Go binary, read in the terminal.
go install github.com/WhitenWhiten/topophany/cmd/topo@latest
01 The terminal UI
A recording of topo preview: the real TUI, on synthetic evidence. Try it in your browser →
Press x and home loses the line to the transit host in Los Angeles. Only confirmed failures turn red.
1–9 chapters space pause. Or run topo preview yourself.
02 Semantics
Nothing turns green without a passing check. What nobody monitors stays unknown.
Healthy rows stay quiet. No check means unknown, never up.
A failure seen from one place is a fault on that path, not a server outage.
Frankfurtworker · DigitalOcean
Cloudflareedge · FRA
New Yorkorigin · Oracle
GET /
refused
HTTP 521cf-ray: …-FRA
● upit answered
▲ affectednot proven
verdict the fault lies behind the edge · origin unproven
An answer from the CDN proves the edge, whatever it says. Only a check of its own proves the origin.
✖ INCIDENTVLESS+Reality entryBandwagonHost · Los Angeles
Incidents show their evidence. Anything more is marked as a hypothesis.
03 Architecture
topo is the client, the collector and the observer. No CGO, no database, no external modules.
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 send to both and buffer while one is away.
No remote config API, no remote shell. Topology is local JSON you review.
When a quota fills, probing stops with an error rather than dropping evidence.
04 Probes
Native probes, proxy chains, and read-only adapters for tools you already run.
200 · 182 msexpected status, body, headers and egress IPSSH-2.0 · 38 msan SSH banner, not a loginA 192.0.2.10 · 9 msexpected A and AAAA recordsTLS 1.3 · verified · 41 msa verified certificate chain and nameconnected · 23 msa connection, and nothing behind itnonce echoed · 27 msa random nonce, echoed backecho reply · 31 msan echo reply, IPv4 onlyUp to 12 hops. HTTP, TCP, TLS and SSH checks run through every one, in order.
GET /proxiesmode, chain and selection, as the core reports themtailscale status --jsonpeer online, direct or relayedwg show wg0 dumplast handshake and byte counts; keys never keptGET /readytunnel sessions and their colos, as the connector reports themWhat a tool reports is shown as reported, never as an end-to-end pass.
edgeWorkers and Pages; the POP that answerededgeFunctions; the edge and function regionplatformmanaged services, in their regionAn answer is credited to the edge that sent it, never to the origin behind it.
05 With your agent
Describing a network is the slow part of monitoring it, and the coding agent you already use is good at it. It reads what your machines already say about themselves, writes the topology, and checks it with topo validate before anything runs.
Write a Topophany topology of my network to topology.json. Learn the format from `topo preview --print-topology` and docs/REFERENCE.md in github.com/WhitenWhiten/topophany. Read my SSH config, `tailscale status`, and the Compose files and reverse-proxy configs you can find. Declare each machine with where it is, the services on it, the applications they belong to and the addresses they answer on, add checks from the machines I will run workers on, and write what you learn about each machine into its notes. Never put a secret in the file. Run `topo validate --config topology.json` until it passes, then tell me what you found and what you guessed.Claude Code, Codex, Gemini CLI, Cursor or any agent that can run commands. Secrets stay out: the format names environment variables and key files, never what is in them.
topology.jsonOne reviewed file says what runs where and how each machine is reached, with notes and runbooks beside them. Your agent reads it before touching anything; you review its edits as a diff.topo status · show · historyText or JSON in one command, for you or your agent: is anything wrong, what runs on that server, how a check fared overnight.topo preview --configPreview draws your own network on synthetic evidence, so the two of you can look it over before a single worker starts.06 On your Mac
topophany-bar is Topophany’s macOS companion. It reads your collectors through topo: the status sits in the menu bar, a panel shows where a problem is seen, and desktop widgets keep servers and services in view.
07 Designed for iPhone Duo
There's no iPhone app yet. What there is, is the TUI's design for one: --device lays the TUI out for the screen of an iPhone, an iPad, or iPhone Duo in each of its poses, and simulates that screen in your terminal. On the open Duo, what you look at and what you touch go on either side of the crease.

topo preview --device duo-laptop.go install github.com/WhitenWhiten/topophany/cmd/topo@main
topo preview --device duo-laptop[ and ] fold it through the poses, \ picks the next device, and the mouse stands in for a finger. The terminal needs about 99×70 cells. Until the next release, --device is on main.
08 Install
Prebuilt archives, or one go install.
go install github.com/WhitenWhiten/topophany/cmd/topo@latestNeeds Go 1.26.11 or newer.
Linux, macOS and Windows, amd64 and arm64, with SHA256SUMS.txt.
git clone https://github.com/WhitenWhiten/topophany
cd topophany
go build -trimpath -o topo ./cmd/topoA built-in demo. Press x to break something.
topo previewServes a demo 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.
topo --credentials ./demo/credentials.json