- extract the headless search out of `easy` into an engine that
measures the baseline, resolves the target, and drives the
producer/consumer loop, so the CLI and web share one search
- make `State` fully observable — structured discovery feed, run phase,
baseline/target, and final outcome — and render the same snapshots two
ways: the in-place terminal panel and an SSE stream
- serve a small embedded page (HTML/JS/Pico baked in via include_str!)
on a hand-rolled hyper service: POST /api/run runs one search at a
time, GET /api/events streams live snapshots as JSON until it settles
- open the UI on a bare invocation (double-clicked binary); `web` with
--host/--port/--no-open controls it explicitly
- bump to 0.2.0
- drop the *8 bit conversion so throughput is MB/s, matching what
clients like v2rayN display
- rename speed_mbps -> speed_mbs across speed/report/commands
- narrow the ranking bucket to 0.1 MB/s so slow (~0.1-0.3 MB/s) nodes
still separate by speed instead of collapsing into one bucket
- update table/CSV/alias labels, color thresholds, --min-speed help,
and README
- lat-top now defaults to 0 so every IP within --lat-max feeds the speed
stage, instead of capping at the fastest 30
- speed-top now defaults to 0 so every IP passing --min-speed is written
to result.txt, instead of capping at 10
- downstream truncation already treats 0 as keep-all; update README
- replace the two-phase availability pre-scan with a single-stage
continuous stream that round-robins segments and keeps concurrency
probes in flight, so a slow unreachable IP only blocks its own slot
- drop the now-unused --probe-sample knob
- show per-probe reasons (unreachable / too fast / too slow / loss) in
the live feed across all stages
- cut the auto speed timeout to 5s