v1.7.0
domcyrus/rustnetv1.7.0Oct 6, 2026by github-actions[bot]
Upgrading?
AI Summary
A major version bump introducing significant traffic analysis capabilities, including headless mode, eBPF process tracking, container attribution, and enhanced UI polish for the TUI.
Key Highlights
- Headless mode (`--headless`) for traffic capture with optional duration and shared filters.
- eBPF process identity retention after exit or exec.
- Container attribution (Docker, Podman, LXC) and VPN detection (WireGuard, OpenVPN).
- Passive DNS analytics and Host Socket Inventory tabs.
- Traffic surge visibility with automatic linear scales and preserved peaks.
Breaking Changes
- Internal workspace crates published as 0.6.0 (library API change).
- Graph and Details UI simplified to automatic independent RX/TX scales (removed manual scale, log, and lock controls).
New Features
- Headless mode (`--headless`, `--duration`).
- eBPF process identity.
- VPN detection (WireGuard, OpenVPN).
- Container attribution (Docker, Podman, LXC).
- Passive DNS analytics.
- Host Socket Inventory.
- Traffic surge visibility.
- Inline Connection Health (TCP/QUIC/UDP badges).
- Reusable Connection Filters.
- State-Aware Status Bar.
Full Release Notes
### Security - Reject Unix output files owned by unrelated users before changing or writing them, anchor opens to validated directories, and create diagnostic logs exclusively ### Added - **Traffic surge visibility**: automatic linear scales, preserved sampled peaks, time labels, and two-second rate averages in Graph/Details and Activity sorting - **Traffic reporting clarity**: graphs follow the capture interface; label smoothed process rates, use binary byte units, and show explicit idle rates - **Retained Linux process identity**: eBPF preserves bounded executable paths and immediate-parent metadata after exit or exec, and checks task birth times before extending ancestry through procfs (#640) - **Generic container attribution (Linux)**: identify Docker, Podman and LXC from socket/process cgroups without daemon sockets. Show runtime, ID and available names in Details, `container:` / `runtime:` filters, headless JSON, JSONL logs, PCAP sidecars and PCAPNG comments - **Database DPI**: identify MySQL classic greetings and TLS requests, Redis RESP command arrays, and PostgreSQL startup messages and TLS requests. Details shows bounded metadata without retaining credentials, SQL, Redis keys, or values. Recognition uses complete messages within one TCP payload; no stream reassembly or TLS decryption is added - **Observed VLAN IDs**: preserve captured 802.1Q IDs in connection details, headless snapshots, JSON event logs, and PCAP sidecars, including priority tags (VID 0). Supports Ethernet and Linux cooked capture; stripped tags remain unknown - **Headless Traffic Counters**: JSON/JSONL stats include lifetime packet and original-length byte totals from capture, independent of connection snapshots and TUI clears, for external metrics exporters - **Initial Connection View**: `[view] group_by_process` in `config.toml` enables process grouping at startup and on view reset; the default stays flat. - **Headless Mode**: `--headless` runs without the TUI, with optional `--duration` and shared `--filter` syntax. Versioned snapshots stream as JSONL by default, while `--output json` emits one final snapshot. Stdout is reserved for machine-readable output. A bounded asynchronous writer replaces stale queued snapshots before JSON serialization and prevents blocked consumers from delaying shutdown, while runtime capture and critical worker failures emit terminal error state and return a nonzero status. Connection IDs remain stable through archival and distinguish reused endpoints, traffic rates have explicit bytes-per-second field names, and timed-out workers retain a `stopping` terminal status. Documentation clarifies snapshot-history limits, separate PCAP collection, and full-snapshot costs - **Reusable Connection Filters**: the complete filter language now lives in `rustnet-core`, with the existing TUI path retained as a compatibility re-export for future headless frontends - **Inline Connection Health**: connection rows now show compact TCP retransmit/out-of-order, QUIC Retry/version, and transactional UDP retry/timeout badges, with a severity-first Health sort. The Details Transport Health card marks the counters behind the badge with their letters, e.g. `TCP Retransmits (R)` and `Out-of-Order (O)` (#583) - **VPN Traffic Detection**: identify WireGuard and OpenVPN connections through packet signatures, including OpenVPN over UDP and TCP (#581) - **Passive DNS Analytics**: the Host tab now shows rolling response codes, timeouts, matched latency, question names, and DNS health, with a compact health line in Overview - **Host Socket Inventory**: the new Host tab shows TCP LISTEN sockets, UDP BOUND endpoints, TCP state totals, observed RTT, process owners, and the detailed interface table on Linux, macOS, FreeBSD, and Windows - **State-Aware Status Bar**: the Overview footer highlights active process grouping and history modes and shows whether Space will expand or collapse the selected process group ### Changed - Publish the internal workspace crates as 0.6.0 for the changed library APIs. - Label the Overview interface error and drop counters as Interfaces. - Simplify Graph and Details to automatic independent RX/TX scales, with no scale, log, or lock controls. Current rates and peak labels retain raw measurements. Details gains taller plots, aligned totals, and clear messages when no live history is available. - Smooth scrolling in Overview, Graph, and Details at 20 fps, preserving the 500 ms sampling interval. Activity, DNS, and Graph bars animate value changes over 250 ms; numeric readings update immediately and settled bars redraw slowly. - Restore Activity's application and interface traffic-share charts on roomy terminals, plus capture coverage bars, while keeping the table and drill-down. Share charts use 60-second totals and live interface rates stay in fixed columns. - Improve TUI readability with wrapped Host records on narrow terminals, Unicode cell-aware truncation, consistent headings and gutters, and labeled RX/TX chart scales. TCP state rows can scroll; Help shadows are opt-in through `[ui] popup_shadow = true` - Move DNS-inferred hostnames from Remote to App and their Details metadata into the Application card, retaining the `~` marker and SNI / Host precedence (#638) - **Documentation accuracy**: Align English, Chinese, and Japanese feature claims, installation and profiling steps, sandbox limits, and the roadmap with the current implementation. - **App artwork**: use a cyan and green terminal signal for desktop icons, the macOS installer, and the README logo in all three languages. - Document Scoop installation in all three README languages and both installation guides - **Contextual help**: each tab and Host section now explains its purpose before listing controls. Activity defines Egress (TX) and Ingress (RX) from the device's perspective; Host DNS explains passive lookup outcomes and coverage limits. - **Compact layouts**: Overview, Details, Activity, and Graph share clickable section selectors with `v` / Shift+`v` when the full layout does not fit. Overview shows System inline with dividers; Host uses the same controls for its two views. Section tabs share the main tabs' styling and show shortcuts in the footer. Activity groups traffic by application name, with scrollable PID lists, stable selection, inline details, and exact connection jumps to Overview. Application peers are deduplicated and peaks use simultaneous rates. Overview filters do not affect Activity totals. The new `pid:` filter matches exact process IDs. Capture stays accessible at every size; interface inventory lives in Host. Capture panels omit explanatory footnotes. - **TUI visual polish**: Activity uses compact TX/RX summaries, a roomier process ranking, and a separate capture-quality sidebar on wide terminals. Share bars use theme-derived gradients with textured ANSI fallbacks. The default keeps TX blue / RX green; other themes retain their own traffic tokens. Shared section rules and table headings improve hierarchy throughout the TUI, with responsive navigation and NO_COLOR support. Graph's health, TCP state, and application distribution bars share Activity's shading, fractional tips, and dotted tracks while preserving semantic colours. - **Frontend Modules**: startup and the TUI loop now live in library modules; headless orchestration, schema projection, and output handling are separate modules. Overlapping JSON, PCAP, sidecar, PCAPNG, and regular-file stdout destinations are rejected before RustNet truncates or writes output data - **Packet Processing**: consolidate tracker lookups, reuse parsed-packet buffers, and group up to 16 already queued batches per ordered update without waiting to fill the group. A sole processor parses and updates each packet immediately, without staging DPI allocations. Parallel workers keep packet cleanup outside the ordered commit and skip notifications without waiters. The queue remains bounded at 10,000 packets, plus up to 1,600 in-flight packets per worker (6,400 across at most four workers). A full queue uses a 5 ms send timeout. Linux, macOS, FreeBSD, and Windows capture share bounded idle-wait and fallback handling, using Unix descriptor readiness or Npcap events where supported to wake promptly for new traffic. Overload can still cause queue or capture-backend loss - **Runtime Lifecycle Foundation**: privileged capture and process attribution are prepared synchronously before sandboxing, while all long-lived workers start through a typed post-sandbox handoff and stop under one owned, bounded supervisor - **Staleness Cue**: idle connection rows now show a stripe at their left edge and a removal countdown in the bandwidth column from halfway through their timeout (previously 75%), both running yellow to red as cleanup nears, while the rest of the row softens toward gray instead of recoloring whole rows, so Health, RTT, and State keep their colors and stale rows stay distinct from gray historic rows on dark terminals - **Responsive System Sidebar**: Traffic now appears before the static Security details, which collapse to the sandbox status when terminal height is limited - **Contextual Help Overlay**: Help now opens above the active tab and only shows controls and concepts relevant to that view. The tab bar now contains the five application views, with direct shortcuts `1` through `5` - **Internal Deduplication**: duplicated helpers, fixtures, and workflow steps were consolidated across the workspace, removing about 2,000 lines with no intended change in behaviour. Small visible differences: truncated names in the connection table, Activity tab, and filter chip no longer leave a space before the ellipsis, GeoIP lookups also skip multicast, reserved, benchmarking, documentation, and discard addresses, hostnames stuck in a pending DNS state are retried after 30 seconds, a connection superseded by a new SYN is archived with its cached rates zeroed like an expired one, the sandbox report uses one wording for a failed root uid drop on every platform and, on builds without Landlock, for the success case as well, the standalone aarch64 and Android static build workflows are removed since the release workflow already produces those binaries, and dispatching the release workflow with `skip_downstream` now also skips the crates.io, Docker, COPR, PPA, and OBS publish jobs so a backfill cannot republish - **Release Backfills**: a re-run of the release workflow no longer overwrites assets that are already on the release unless `overwrite_assets` is set, since Chocolatey, Scoop, and the AUR binary package pin checksums of the published files - **Acronym Casing**: the Details header chip reads `RTT` instead of `rtt` and PCAPNG export errors spell the format in uppercase ### Fixed - Restore FreeBSD builds with mio 1.2.4, which supports libc 0.2.190. - Apply Overview's PTR visibility setting to Activity totals, including retained connections; use `--show-ptr-lookups` to include reverse DNS traffic in both tabs. - Preserve Linux Host socket owners discovered at startup across restricted procfs refreshes, including listeners and bound UDP sockets - Keep packet rates, connection lifecycle, and health updating when interface counters are unavailable; prevent compact RX/TX rates from losing leading digits. - **macOS traffic graphs**: use aggregate counters for default PKTAP capture, keep Details scrolling independently, and publish complete interface-rate snapshots - Add the missing divider between Overview traffic and interface counters. - Keep the filter cursor on UTF-8 character boundaries when typing, moving, or deleting non-ASCII text, avoiding TUI panics. - Preserve regex syntax in connection filters, including uppercase escapes such as `\D` and explicit case-sensitive groups. - ARM DEB compatibility with Ubuntu 22.04 and Debian 12/13: use a glibc 2.35 build baseline, declare runtime dependencies, and embed ARMv7 libpcap to avoid Debian 13's time64 ABI mismatch. Test package installation and capture. - **Traffic graph stability**: remove hollow outlines and preserve the scroll position across sample arrivals; interpolate before rasterizing to prevent contour wobble - Keep Activity summary TX/RX labels, numbers, and units aligned as live rates change - **QUIC handshake storage**: coalesce bounded CRYPTO ranges in either arrival order, keep assembling through ClientHello for ALPN, and release bytes after extraction. UI/history snapshots retain metadata only. Library consumers must adapt `get_fragments()` from a map reference to an `(offset, slice)` iterator - **32-bit parser validation**: test QUIC and SNMP length boundaries in debug and release CI; constrain SNMP nested fields to their declared containers - **Short Kubernetes flows**: retain cgroup v2 pod/container identity with eBPF socket records after process exit, match both endpoint orientations, and evict old records when the map fills. Track evidence export before debug-pod cleanup in the separate [kubectl-rustnet follow-up](https://github.com/domcyrus/kubectl-rustnet/issues/20). - Clarify unreleased features and Windows setup in all three documentation languages; link v1.6.0 docs and add release checks for availability notes (#620) - **Connection viewport**: paging, scrollbars, and mouse targets track the current layout immediately after resizing, including filters and two-row capture errors. - **Details information pages**: replace overflowing information scrollbars with sections and numbered pages reached with v/V. Keep j/k, paging, and the wheel for connection navigation; retain Traffic plots when they fit - **Details layout**: use the terminal's full width and anchor RX/TX plots above the footer with a proportional height capped at 18 rows - **TUI alignment**: align Activity pane headings, expand Host interface columns, and size Graph process names and rows to the available space - **Required UID Drop**: abort startup before packet-processing workers when a requested root UID/GID drop fails, including in best-effort mode - **Windows Connection History**: connections that reuse a tuple with the same capture timestamp keep distinct history entries - **Idle Capture Shutdown**: nonblocking capture reads and bounded idle polling let worker shutdown finish even after packet traffic stops - **Windows Address Discovery**: collect IPv4, IPv6, and subnet broadcasts through IP Helper without loading the Npcap capture driver - **Loss and Export Accounting**: queue backpressure drops are reported separately from libpcap and interface drops, partial batches drain during shutdown, and classic PCAP output remains bound to its securely pre-opened file descriptor - **32-bit eBPF Map ABI**: explicitly align the shared C and Rust `ConnInfo` structures to 8 bytes, fixing compilation on i586 (#611) - **macOS Host Tab SYN_RCVD**: sockets that `lsof` reports as `SYN_RCVD` now show as SYN received instead of an unknown state - **Bogus "unknown" Process Group on Linux**: a process that exited while RustNet scanned `/proc` was recorded under the literal name `unknown`, which showed up as its own process group next to the real `<unknown>` bucket and, with eBPF attribution, overrode the correct name the kernel had captured at socket creation. Such a process is now skipped instead (#590) - **TCP Window Size Per Direction**: the Details Transport Health card kept a single window slot that every segment overwrote, so the value flipped between the local and remote advertised windows. Both are now shown (`↓` local, `↑` remote), in bytes only when the captured handshake proved the window scale. Without it the scale is unknowable from the wire, so the row reads `unknown (no handshake)` rather than a raw header field that stands for anything up to 16384 times its value; the Details help and USAGE explain it (#589) - **TCP Analytics for a Connection's First Packet**: the packet that creates a connection now reaches the TCP analytics. For a connection this host initiates that packet is its own SYN, the only carrier of the local window-scale option, so windows could never be reported in bytes even with the whole handshake captured (#589) - **Duplicate ACK False Positives**: a repeated ACK only counts as a duplicate when this host has data outstanding and the advertised window is unchanged (RFC 5681), so an idle connection's keepalives and the peer's window updates no longer inflate the counter or report a fast retransmit on a connection that never retransmitted. A RST no longer overwrites the last advertised window with its meaningless zero (#589) - **Default Npcap Installations on Windows**: RustNet now finds Npcap in its standard `System32\Npcap` directory, so WinPcap API-compatible mode is no longer required. `--help` and `--version` also work without Npcap installed - **Attribution of Pre-Existing Connections on Linux**: connections that were already open before RustNet started keep their process name after privilege reduction, including root services when RustNet runs with file capabilities on Linux 5.11 and newer. A one-shot BPF task-file inventory and the privileged procfs scan feed a validated fallback shown as the "startup snapshot" match quality (#575) - Keep new releases in draft until Linux, macOS and Windows installer jobs all succeed, preventing publication with missing installer assets. ### Removed - Unused screenshots, the macOS PNG export, duplicate PPA setup notes, obsolete manual build/debug tools, and redundant services copies in local installers and Docker. Release archives retain services for the AUR package. - Unused internal APIs, ineffective DPI packet limits, and sandbox pathname write exceptions. Capture outputs continue using descriptors opened before sandboxing - **Ubuntu 25.10 (Questing) PPA**: the series reached end of life and Launchpad rejects new uploads for it, so the PPA build matrix and install docs drop it. Already-published questing packages stay in the PPA archive
Related Repositories
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one