Repository navigation
Releases
Per-host network adapter binding
Per-host network adapter binding
- New crates/core/src/adapters.rs: GetAdaptersAddresses through the module's own extern "system" block, so core still takes no GUI dependency and no new crate.
- probe.rs drops ping-rs entirely for its own FFI: IcmpCreateFile/IcmpSendEcho2Ex (with SourceAddress) for ICMP and a TcpSocket::bind before connect for TCP.
- Storage: TargetConfig.adapter (absent = Automatic) with the usual serde/migration, and a "Network adapter" ComboBox in the host editor.
- Behavior: a bound probe leaves from that adapter's current IPv4; a saved adapter that isn't attached fails the sample rather than silently falling back to another interface.
The sample cursor — the visual fixes from this session's thread.
- The empty band above the grid is gone: the box no longer grows at the ceiling end for the cursor (short = graphHeightPx·dpi + bottom_room), the plot's top is the 2px stroke pad, and the grid and lines now fill the box instead of leaving a bare 13px strip.
- The bounce parks whole: its rest is the box's top edge — topmost pixel flush — where it used to hang half out above the grid, and the shake became a one-sided decaying dip into the graph.
- The gap now reads against the graph, not the box: the cursor's base is anchored to the axis's end, so the rim's outer edge sits 2px inside the grid's last column; the line's newest pixels run on past the cursor's flat side.
- The box hugs the graph again: the leading reserve stopped being the cursor's own band and became stroke_pad of the line's width — the same pad every other edge keeps — so 314×136 at 125% DPI, with the time axis keeping its configured length.
Cool Visual Features
PingLatencyOverlay — changes since 7468388
Base: 7468388427147aa9849ad4df5263929b333ad0cb ("Keep one extra sample so the
line leaves the left edge", 2026-10-05). Tip: 57cddbf (2026-10-09), branch
split/renderer-process, pushed to origin. 25 commits, 30 files,
+5689/-1290 as of 55dfdb2; installer at the tip is
PingLatencyOverlay_0.2.66_x64-setup.exe.
New features
Discrete-band history compression — 55dfdb2. The canvas stays
windowSeconds × scale px; older history is drawn inside it as bands: newest at
the raw density (scale px/s), then an equally wide ladder of ratios stepped
evenly from 2× to historyCompressionRatio, then the reserve at the maximum
ratio. x_of is piecewise linear with a density step at each join, and the grid
columns follow it (30 px cells in the newest band, 30/ratio_k in band k).
crates/core/src/compression.rs is the single statement of the geometry; nine
new keys in crates/core/src/config.rs: historyCompression,
historyCompressionRatio, …NoZoneShare, …NoZoneMinPx, …MaxZoneShare,
…MaxZoneMinPx, …MinAxisPx. The rejected "grow the axis" path
(axis_growth, the Axis width row, its tests) is removed in the same commit.
The editor gets a Zones row.
Background grid — also 55dfdb2. Per-overlay backgroundGrid +
backgroundGridColor (#334155), off by default, drawn under Colors;
30 × 20 px cells, single 1 px stroke, drawn first in the graph's frame so it
rotates and mirrors with the lines.
Per-overlay timeout indicator — 808b72b. New timeoutIndicator:
Stick (default, the old full-height mark), Stub (2 px line on the canvas
bottom), Gap (nothing — the line's break is the mark). Same x positions, host
timeout colour, stroke width and draw order for all three.
Sample-cursor bounce — ce1ab95. On a live timeout reaching the drawn
cursor head, the cursor is flung to the top of the graph, hangs half out of the
overlay edge, shakes ~0.5 s, then eases back. Always on with the cursor; no new
key, no reserve/layout/draw-order change.
Cursor blink on timeout — a3c2587. cursorTimeoutBlink (off by default) +
cursorTimeoutBlinkColor (#ef4444): the triangle's fill breathes 35% → full
over two seconds, anchored to the run's first failed sample, reading the raw
buffer so it starts even under smooth rendering. A stale newest sample ends it.
Glow reach scales with intensity — b87be52. Reserve is now
radius * sqrt(intensity / 100), and below the zero line the glow's band and the
cursor's room are shared (the larger, not the sum). The live Default overlay is
312×135 where it was 312×144.
Changes
- UI label pass —
7f391b2: units moved into values ("Sampling 30 seconds",
"Y axis height 60 px", "Latency ceiling 1000 ms", …), time spelled out as
"seconds"; display-mode / startup / border-effect labels settled into sentence
case. The README table anddocs/SPEC.mdfollowed. - Documentation system — feature-map scaffold plus 18 pages under
docs/features/, then split into sections a reader can open one at a time
(b40f042);AGENTS.mdslimmed to process and hard rules (fa6261e);
HANDOFF.mdtracked and trimmed to session state (27393ed); read order
changed to handoff → map (615f704). - Handoff and ignore fixes —
57cddbf: HANDOFF.md refreshed to the shipped
state,.gitignorecovers a member crate's owntarget/, stray
crates/core/target/plo-grid/deleted.
Bug fixes
e8efedb— cursor shake parked mid-run. The shake's clock was the run's
first failure, so a run older than the 0.9 s window left the cursor parked
after the first timeout while failures kept arriving. It now counts from the
newest failure (timeout_run_latest), so each further timeout restarts the
shake; the blink keeps counting from the first. Shake retuned 12 Hz / 2 px →
4.5 Hz / 0.6 × half-height / 0.9 s (the 12 Hz version was invisible under a
30 fps overlay).808b72b— prefill test flake. Its real samples were all younger than
smooth rendering's reveal hold, so the "green" it counted was the cursor rim's
antialiasing; it now builds explicit older samples.b87be52— wasted glow reserve. A faint cast kept a full-radius band of
empty window; the reserve now follows the reach.- Version drift in the 0.2.65 bundle. Its exes were built before the commit,
so they report 0.2.64. Fixed by the rebuild at57cddbf: all three exes and
PingLatencyOverlay_0.2.66_x64-setup.exereport 0.2.66, at Medium integrity.
Cursor, Smoother Rendering and Graph cutoff visual improvement
- Optional Cursor to follows the latest Sample segments
- Smooth rendering is even smoother now it also animates the latest line from the previous sample point
- Graph cutoff visual improvement - renderer now keeps an extra oldest sample so that it has a reference where to connect the line when oldest sample goes out of the canvas
Configurable Line stroke + Glow cast fixes + Robust Probing mechanisms
- New lineStrokePx setting (0.5–6 px, default 1.5) with a slider in Colors
- Probe now uses resolved IP address instead of trying to resolve every Ping (both ICMP echo and TCP connect)
- Glow cast as a sweep below the line, glow no longer cast above the lines
New visual feature: Graph Line Glow
- Added optional under glow/line glow option for the lines on the graph, customizable intensity and glow radius
- Disabled logging by default, set env variable PLO_LOG to enable logging
Two new overlay modes
- Wallpaper mode, works like Rainmeter widgets. It draws on top of the Wallpaper and icons layer but never goes higher than that.
- Sticky mode - sticky mode sticks the overlay to a window, multiple choices on how to target Window. not as advanced as the Auto Switching rules but close enough. Added window picker so that it will figure out the process and class name for you. there are 2 behaviors, either the overlay is always on top or it can be covered by other windows.
- Changed how the prefill fake samples are rendered (no longer using Sin curves).
Auto Profile Switching + Background Tracking + Appearance Options
New features
-
Profiles can switch automatically to match the windows on your screen - Rules on the Global page match a window's process name, title or class name, with exact, contains and regex comparisons; the first match wins and a fallback profile cover everything else. A rule can look at any visible window or only the focused one.
-
A switch has to hold for about two seconds, so alt-tabbing or a launcher handing over to its game does not flip the profile. The Global page previews what the rules are deciding right now and switching keeps working while the Config window is open - a settled switch waits for unsaved changes and lands when you save or discard.
-
Profiles you switch away from can keep probing - Background tracking (on by default) keeps the targets of the profile you left running, so its graph is continuous when you come back. A host you disable or delete keeps probing while the change is unsaved; Discard brings it back with its history and Save stops it for good. Turning the setting off stops every kept probe immediately.
-
The graph no longer draws through time it was not tracking - With background tracking off, or after Pause, the line breaks across the gap and resumes at the last known value instead of jumping straight over it.
-
The System / Light / Dark picker is now three-square tiles - Sun, crescent and half-filled circle icons, drawn to match the window's theme; System follows Windows.
-
The animated border that highlights the overlay you are editing can be switched off - A new option under Appearance stops the selection animation, while each overlay's own startup border effect is left as it is.
Multiple Hosts per Overlay + Live Overlay Editing + Bug fixes
New features
- One overlay can graph several hosts - An overlay now holds multiple hosts with shared properties except for the line color, timeout line color, probe method and timeout value.
- Even unsaved changes to Host related settings are rendered as soon as possible now
Bugs fix
- All other unsaved changes were supposed to be rendered live, but it wasn't - it is fixed now.
UI Light and Dark mode + Multi-monitor support
- UI now follows your system theme by default
- Can be overridden at Global page, support Light and Dark theme for now (custom theme support in the future)
- Multi-monitor support is still fairly experimental
- Improved the installer so that it doesn't spawn terminal while trying to kill the existing PLO processes
Significant Memory Footprint Reduction
This release is a significant rewrite of the core architecture. The graphs renderer is now its own independent process/executable. Memory usages are reduced from the single process/executable - 80-100MB-ish to 40-50MB-ish. Since the new tray governs/guard the Renderer process and Config UI is no longer needs to be running in background as it was the biggest memory hog due to egui framework.