Skip to content

Releases: jamesccupps/PingerPlot

PingerPlot 1.2.0

04 Jun 19:39

Choose a tag to compare

PingerPlot 1.2.0 — headless mode + reliability.

The big one: PingerPlot now runs without a GUI, so you can monitor 24/7 from a server or a VLAN-probe host under Task Scheduler. Plus correctness/robustness fixes and the snappier UI from 1.1.1. Still pure Python standard library — zero third-party dependencies.

New

  • Headless / service mode. python -m pingerplot.headless --init monitor.json writes a starter config; python -m pingerplot.headless monitor.json runs it (Ctrl-C to stop). A JSON config drives N targets (defaults + per-target overrides), each logging to its own crash-safe, rotating CSV, with periodic status lines to the console. Built for Windows Task Scheduler; pip install . also adds a pingerplot-headless command.

Reliability & correctness

  • Fixed a TCP-traceroute bug: in elevated full-traceroute mode a hop that returned a hard unreachable could vanish from the round and be logged as a plain timeout. It now always records a definite result.
  • Session saves are atomic (temp + replace) — a crash mid-write can't truncate the file.
  • Session load caps hops and samples against a crafted/corrupt file.
  • Faster UI (from 1.1.1): per-tick CPU ~30 ms → ~2–3 ms; the sidebar is ~97× cheaper with several targets, so it stays responsive as you add more.

Tested

95 tests across Windows + Linux × Python 3.10–3.13, including new coverage for the route grow/shrink logic and the geo-IP resolver.

Install / run (no Git needed)

  1. Download Source code (zip) below and extract it anywhere.
  2. GUI: double-click PingerPlot.vbs. Headless: python -m pingerplot.headless --init monitor.json.

Requires Windows 10/11 and Python 3.10+. Full TCP/UDP traceroute needs an elevated session; ICMP works as a normal user. The headless engine runs anywhere Python does.

Full changelog: v1.1.1...v1.2.0

PingerPlot 1.1.1

04 Jun 18:04

Choose a tag to compare

PingerPlot 1.1.1 — performance.

A focused speedup of the live UI. The 700 ms refresh was doing ~30 ms of pure-Python stats work each tick — holding the GIL against the probe threads — which made the app feel sluggish, and worse the more targets you watched. Now ~2–3 ms.

  • Per-hop stats (loss / avg / min / max / jitter) are computed in a single pass instead of ~5 — snapshot() ~4× faster, the sidebar grid ~97× faster with several targets.
  • The sidebar reads only the destination hop's stats instead of every hop of every monitor.
  • Redundant canvas redraws are skipped on ticks where nothing changed (resize / tab-switch still redraw).

No feature or behavior changes. 75 tests green on Windows + Linux, Python 3.10–3.13.

Install / run (no Git needed)

Download Source code (zip) below, extract anywhere, double-click PingerPlot.vbs. No build, no pip install.

Full changelog: v1.1.0...v1.1.1

PingerPlot 1.1.0

04 Jun 17:45

Choose a tag to compare

PingerPlot 1.1.0 — the "leave it running" release.

Quality-of-life and operational features for monitoring you actually leave running, plus reliability fixes from a full code audit. Still pure Python standard library — zero third-party dependencies.

New

  • Persists between launches — theme, engine options, alert thresholds, and your target list save to %APPDATA%\PingerPlot and restore on start. View → Resume targets on launch re-arms the last session's monitors.
  • Pause / Resume — right-click a target to halt probing without losing history; resume continues where it left off.
  • Per-target settings — each target keeps its own engine/alert config; right-click → Edit settings… to inspect or change just that one.
  • Copy — right-click a hop to copy its IP or hostname.
  • Webhook alertsEngine → Webhook URL gets a JSON POST (http/https) when the destination alert raises or clears. Fired off-thread, so it never blocks probing.
  • Custom app icon in place of the default Tk feather.

Reliability & hardening

  • Probe log is size-capped with rollover (~25 MB, one backup) — unattended multi-week runs can't fill the disk.
  • Fixed a monitor restart race (a slow worker from a previous run could write stale probes into a freshly restarted one) and made the engine reusable after shutdown.
  • Session load clamps sample history so a crafted/corrupt file can't exhaust memory.
  • python -m pingerplot entry point; CI least-privilege (permissions: contents: read).

Install / run (no Git needed)

  1. Download Source code (zip) below and extract it anywhere.
  2. Double-click PingerPlot.vbs — no console window, no build, no pip install.

Requires Windows 10/11 and Python 3.10+ (Tkinter ships with the python.org installer). Full TCP/UDP traceroute needs an elevated session; ICMP and TCP final-hop work as a normal user.

Full changelog: v1.0.0...v1.1.0

PingerPlot 1.0.0

04 Jun 16:29

Choose a tag to compare

PingerPlot 1.0.0 — first public release.

A continuous-traceroute network path monitor for Windows (MTR-style): it discovers every hop to a target, then re-probes the whole path on an interval, so you get per-hop latency, jitter, and packet loss over time — making it obvious where a problem lives (your LAN, your ISP, a peering point, or the destination).

Highlights

  • Continuous per-hop monitoring with a live latency graph and an all-hops timeline
  • Multi-target sidebar showing loss / latency / MOS per target at a glance
  • Sustained-degradation alerts (loss or latency over a window) with banner + beep
  • MOS (VoIP quality) score for the destination
  • ICMP / TCP / UDP probe modes — ICMP needs no admin (Windows IP Helper API)
  • Session save/load, crash-safe CSV logging, optional world-map view
  • Pure Python standard library — zero third-party dependencies

Install / run (no Git needed)

  1. Download Source code (zip) below and extract it anywhere.
  2. Double-click PingerPlot.vbs — launches with no console window. No build, no pip install.

Requires Windows 10/11 and Python 3.10+ (Tkinter ships with the python.org installer). Full TCP/UDP traceroute needs an elevated session; ICMP and TCP final-hop work as a normal user.

See the README for full details.