v0.2.0
Release Notes — v0.2.0
A major quality release focused on accuracy, usability, and community contributions. This version ships across 5 merged PRs and fixes the most-reported user pain point: inflated packet-loss readings on restricted networks.
Bug Fixes
False-positive LOSS% on restricted/DPI networks (PR #14 · e411c1c)
The most impactful fix in this release. In v0.1.0, TLSHandshakeTimeout and http.Client.Timeout were both set to the same value (e.g. 3 s). On ISPs that throttle Cloudflare-bound TLS traffic, the handshake would silently consume the entire time budget — leaving zero time for the HTTP GET — causing client.Do to return an error and the try to be counted as lost. Meanwhile, ICMP ping to the same IP would show 0% loss, creating a confusing mismatch.
Fix: The per-phase budget is now split: TCP dial gets ¼ of the timeout, TLS gets ½, guaranteeing at least ¼ for the HTTP response phase. The same fix applies to probeDownload.
New Features
Auto-save healthy IPs after Quick Scan (commit 7b966f2)
Quick Scan now automatically writes all healthy IPs to a timestamped file (e.g. results_20260529_031340.txt) in the working directory as soon as the scan finishes — no manual configuration required.
Copy to clipboard (commit 7b966f2)
Press c from the Live Scan or Results screen to copy all healthy IPs (one per line) directly to the system clipboard, ready to paste into Xray / Sing-Box / any proxy config.
Output files now contain only healthy IPs (commit 7b966f2)
Previously, the output file received every scanned result — including thousands of failed probes — making it unusable without post-processing. Now only IPs that pass all health checks (TLS, HTTP status, colo, download) are written. This applies to both Quick Scan and Custom Scan.
.txt format changed to plain IP-per-line (commit 7b966f2)
The .txt output writer now emits a bare IP address per line instead of a verbose stats line, so the file can be used directly in proxy tools without editing.
Smarter Quick Scan defaults for restricted networks (commit e411c1c)
| Setting | v0.1.0 | v0.2.0 |
|---|---|---|
| Timeout | 3 s | 5 s |
| Workers | 100 | 50 |
| Download sample | 256 KB | 64 KB |
The preset labels are updated to mark these as the recommended defaults for restricted networks. The aggressive 2 s and fast 200-worker presets are still available.
Performance
Eliminate heap allocations in result calculations (PR #11 · f51de64 · @Mralimoh)
result.Avg(), Jitter(), Min(), Max(), and Loss() were rewritten to avoid unnecessary intermediate allocations on the hot path. Under high concurrency (hundreds of workers) this reduces GC pressure measurably.
Scanner Stability
De-duplicate IPs in random stream (PR #13 · 12eaf3c · @Hoot-Code)
ipsrc.Stream now tracks every emitted IP and skips duplicates, so a scan of N IPs tests exactly N distinct addresses. Previously the same IP could appear multiple times, wasting probe budget.
Output and engine clean-up (PR #13 · 1998522, a1de328 · @Hoot-Code)
Redundant code paths in output.go and engine.go were simplified.
HTTP probe TLS requirement clarified (PR #13 · 96570f7 · @Hoot-Code)
IsHealthy() code comment now explicitly documents that HTTP mode requires a successful TLS handshake, making the intent clear for future contributors.
Installation
One-line install script (PR #4 · eb6c303, 52c6580 · @M-logique)
bash <(curl -fsSL https://raw.githubusercontent.com/matinsenpai/senpaiscanner/main/install.sh)Supports first-time install, in-place updates, and Termux on Android.
TUI / UX
Menu alignment fix (commit fa26fce)
The home-menu ▶ cursor was visually indented further right than the other items due to \n characters being rendered inside a lipgloss style block, which padded blank lines with spaces and offset the first entry. Menu items are now backed by a typed struct instead of hand-formatted strings.
Compiler warning clean-up (PR #1 · 1c8dfde · @ProArash)
Unused variables in model.go removed.
Contributors
Thank you to everyone who opened a PR for this release:
- @ProArash — PR #1
- @M-logique — PR #4
- @Mralimoh — PR #11
- @Hoot-Code — PR #13