Pure-Python · No dependencies · MIT

Watch every hop on your way out.

FTS Net Mon continuously probes your router, ISP gateways, DNS, and an upstream public host over ICMP and TCP. It tracks loss, latency and jitter, and surfaces it all through a fast local web UI — so when the internet feels weird, you know exactly which hop is misbehaving.

3.10+Python
0pip deps
1Hzdefault probe
3 OSesWin · Mac · Linux

Why FTS Net Mon?

Built for home-office and small-business networks where a flaky link is invisible until something important breaks.

ICMP + TCP probes

Per-target ping and connect probes on independent threads. Catch issues that ICMP alone misses — DNS soft-failure, port-blocked upstreams.

Group rollups

Targets are grouped LAN / ISP1 / ISP2 with per-group health. One glance tells you which side is broken.

Rolling history

Loss %, recent loss %, avg / min / max latency, jitter — all updated live. Sparklines per target, full chart for everything together.

Event log

State transitions only — first fail, sustained DOWN after 3 strikes, recovery. No alarm fatigue from a single dropped packet.

Auto-detect setup

First-run wizard pre-fills router IP and DNS from your active interface. Confirm and you're monitoring in seconds.

Pure stdlib

No pip install. Just Python 3.10+. The optional Tk GUI ships with CPython on Windows and macOS.

JSON HTTP API

Every panel is backed by a documented endpoint. Plug into Prometheus, a custom dashboard, or your own tooling.

Local-first

Defaults to 127.0.0.1 — no telemetry, no cloud, no accounts. Your network data stays on your machine.

A live look at the UI

The web UI auto-opens in your browser when you start the server.

Quick start

Three commands. No virtualenv. No package install.

  1. 1

    Clone

    git clone https://github.com/MuchDevSuchCode/FTS-Network-Monitor.git
    cd FTS-Network-Monitor
  2. 2

    Run

    python fts_netmon.py

    A browser tab opens at http://127.0.0.1:8765. The first-run wizard pre-fills your router and DNS from the active interface.

  3. 3

    Customize

    python fts_netmon.py --gui          # native Tk window too
    python fts_netmon.py --bind 0.0.0.0 # expose on the LAN (read security notes!)
    python fts_netmon.py --port 9090    # custom port
Heads up. The web UI has no auth. Keep it on 127.0.0.1 unless you've put it behind something that does authentication, or you're only exposing it to a network you fully trust.

JSON HTTP API

Every UI surface is a documented endpoint. Bring your own dashboard.

MethodPathPurpose
GET/api/statusPer-target stats, samples, group health rollup
GET/api/configCurrent configuration as JSON
POST/api/configUpdate configuration; restarts probes atomically
GET/api/events?since=<seq>Event log entries newer than seq
GET/api/events/exportFull event log as a downloadable text file
GET/api/netinfo?refresh=1Local interfaces, gateway, DNS, MAC, DHCP
GET/api/setup/suggestSuggested config based on the active interface

Example: change probe targets via curl

curl -X POST http://127.0.0.1:8765/api/config \
  -H 'Content-Type: application/json' \
  -d '{"isp2_gateway": "10.0.2.1", "probe_interval": 0.5}'

How it's wired up

A small core, one thread per probe, two read-only consumers.

fts_netmon.pyargparse · browser launch
AppStateconfig · monitor · event log
Monitorper-target probe loops
EventLogseq-numbered transitions
probes.pyICMP via ping
probes.pyTCP via socket
stats.pyrolling deque
▲ read-only consumers
web.pyHTTP + JSON API
gui.pyTk window (optional)

Stop guessing which hop is sad.

Drop FTS Net Mon onto any machine on your network and start watching the path that matters.