v1.5.0

KoljaB/RealtimeSTTv1.5.0Jul 21, 2026by github-actions[bot]

AI Summary

Introduces Kubernetes awareness with pod/container attribution and native PCAPNG export, along with event-driven Windows process tracking and security improvements like dropping root privileges.

Key Highlights

  • Kubernetes Pod/Container Attribution (off by default)
  • Native Annotated PCAPNG Export for Wireshark
  • Event-driven Windows Process Attribution via ETW
  • Security: Drop Root Privileges after initialization

New Features

  • Kubernetes attribution with pod/ns/container filters
  • PCAPNG export with DPI and GeoIP annotations
  • Process Activity View ranking traffic by share
  • Gradient Braille Graphs and adaptive rendering
  • Pane scrolling with mouse wheel and vim keys
  • TLS, SSH, DNS, and QUIC DPI improvements

Full Release Notes


This release makes RustNet Kubernetes-aware: connections can be attributed to their
owning pod and container, and the new native PCAPNG export writes Wireshark-ready
captures with process, DPI, GeoIP, and pod annotations. A new Activity view ranks
processes by traffic, the graphs got a gradient braille overhaul, Windows process
attribution went event-driven with ETW, and rustnet now drops root privileges after
initialization on Linux, macOS, and FreeBSD.

### Added
- **Kubernetes Pod/Container Attribution**: New optional `kubernetes` feature
  (off by default, no extra dependencies) that attributes connections to their
  owning pod and container on a node, including `hostNetwork` pods. Pod, namespace,
  and container appear in the Details pane, JSONL/PCAPNG exports, and the new
  `pod:`, `ns:`, and `container:` filter keywords. The container image enables the
  feature by default (#299, #450)
- **Native Annotated PCAPNG Export**: New `--pcapng-export FILE` writes a
  Wireshark-ready PCAPNG file whose packet comments carry best-effort process, PID,
  direction, DPI/SNI, and GeoIP metadata, preserving libpcap timestamps and original
  packet lengths. The Overview panel reports export progress and annotation stats (#432)
- **Process Activity View**: The Interfaces tab is now a process-focused Activity
  view (key `3`) ranking egress and ingress traffic with 60-second share bars,
  retained totals, connection counts, and top remote peers; `d` flips direction,
  `s` changes the sort metric, and `i` opens the detailed interface table (#465)
- **Gradient Braille Graphs and Adaptive Rendering**: Flow-inspired braille area
  graphs with gradient ramps across the Graph tab, Overview mini graphs, and
  per-connection Details waves, plus a draw-on-demand main loop with event
  coalescing that roughly halves terminal-emulator CPU (#459)
- **Pane Scrolling and Filled Traffic Chart**: Details, Help, and Interfaces tabs
  scroll with mouse wheel and vim keys instead of silently clipping, and the
  traffic chart renders RX/TX as filled areas (#452)
- **Event-driven Windows Process Attribution**: Use kernel network and process ETW
  events to retain connection ownership for short-lived processes, with IP Helper
  polling as reconciliation and fallback. IPv6 UDP ownership is now included (#474)

### Security
- **Drop Root Privileges After Initialization**: Under sudo, rustnet now drops to
  `SUDO_UID`/`SUDO_GID` (or `nobody` for plain root) once capture and eBPF are
  initialized on Linux, macOS, and FreeBSD, so a DPI compromise no longer runs as
  root. Opt out with the new `--no-uid-drop` flag; `--sandbox-strict` fails hard if
  the drop fails. Trade-offs are documented in SECURITY.md (#456, #457, #458)
- **No More `CAP_SYS_ADMIN` Auto-Grant**: DEB/RPM installs no longer grant the
  broad `cap_sys_admin` eBPF fallback capability; on pre-5.8 kernels process
  detection degrades to procfs instead (#431)
- **Hardened File Writes**: Log and capture files are created atomically with
  `O_NOFOLLOW` and mode `0600`, and `lsof`/`sockstat` are invoked by absolute path
  to prevent symlink and `$PATH` attacks (#430)

### Fixed
- **Dynamic local-address detection**: Refresh endpoint-orientation addresses after
  network changes and retry ambiguous unicast packets once. On Windows, supplement
  the IPv4-only adapter data with `GetAdaptersAddresses()` so IPv6 traffic is not
  shown with reversed local and remote endpoints (#475)
- **Transport Payload Length**: Trim the transport slice to the IP datagram length,
  so Ethernet frame padding no longer produces phantom 6-byte payloads, false
  retransmission counts, resurrected closed connections, or DPI misclassification
  from trailing bytes (#479, thanks @0xghost42)
- **Connection Lifecycle**: Reused connection tuples no longer inherit their
  predecessor's process/DPI metadata in PCAPNG annotations or rate history in
  Details; immutable history is preserved across tuple reuse; UI-side expiry no
  longer hides tracked connections; rows stay yellow through the whole warning
  window; and the recently-closed tombstone table keeps a capacity floor for tiny
  archive configs (#469, #470, #473)
- **Grouped Overview Navigation**: Space collapses or expands a process group from
  a child row, and `g`/`G` jump to the first and last visible rows in grouped
  mode (#471)
- **Live Graph Rendering**: Graphs sample and redraw more frequently with stable
  scaling, so waves no longer wobble or flatten after spikes, and the connection
  count graph now shows opened/closed lifecycle activity (#472)
- **Overview Status Polish**: Clarified filtered result counts, kept Statistics
  totals unfiltered with process counts, and added an expiry color gradient with a
  matching Help legend (#466)
- **Stable Details Layout**: The Details tab uses fixed Connection, Network
  Context, Application, and Transport Health cards with placeholder rows, so
  sections no longer shift while navigating (#462)
- **Help Scrollbar**: Restored the inset Help scrollbar and the `Help · ↑/↓ scroll`
  title hint (#460)
- **QUIC DPI**: Parse Retry and Version Negotiation packets correctly, merge CRYPTO
  fragments across coalesced Initial packets (restoring SNI for large ClientHellos),
  and use the right Initial salts for draft/mvfst versions (#453)
- **Protocol Detection Switches**: Correct DPI misclassifications (SIP/RTSP as
  HTTP, SMTP as FTP, WireGuard as BitTorrent uTP), add MQTT QoS 2/AUTH types and
  structural SNMPv3 parsing, fix NetBIOS datagram offsets, and drop non-first IP
  fragments at the parser (#454)
- **DNS Label Parsing**: Reject RFC 1035 reserved label top-bits in
  `parse_question`, matching `skip_dns_name` (#434, thanks @0xghost42)
- **SSH State Detection**: Inspect the final 6-byte packet window, so signatures at
  the end of the payload are no longer missed (#406, thanks @0xghost42)
- **TLS Cipher Names**: Correct six mislabeled ARIA and Camellia cipher-suite
  names (#404, thanks @0xghost42)
- **macOS PKTAP PIDs**: Accept PIDs up to Darwin's 99999 ceiling instead of
  dropping attribution for PIDs at or above 65535 (#415, thanks @0xghost42)
- **eBPF Map Cleanup**: Compare map timestamps against `CLOCK_MONOTONIC` instead of
  wall-clock time, so cleanup no longer flushes the entire map and attribution no
  longer silently falls back to procfs (#451)

### Performance
- **Ratatui Hot Paths**: Cache selected row positions, aggregate Graph tab metrics
  in one borrowed pass, and select only the top process rows instead of sorting
  every process (#461)
- **HTTP Parser**: Drop the per-packet `Vec` allocation in the HTTP start-line
  parser (#402, thanks @0xghost42)

### Internal
- **Library Crates 0.4.0**: `rustnet-core`, `rustnet-capture`, and `rustnet-host`
  are released as 0.4.0 with the new Kubernetes, PCAPNG, and parser APIs
- **CI Auditing**: Replaced cargo-deny with RustSec cargo-audit for CI and
  scheduled supply-chain checks (#464)
- **OUI Database**: Monthly vendor database refresh (#439)
- **Dependencies**: Routine dependency and GitHub Actions updates across the cycle
  (Dependabot)

### Contributors

Special thanks to the contributors in this release:
- [@0xghost42](https://github.com/0xghost42): the transport payload-length fix,
  TLS cipher-suite corrections, SSH and DNS DPI fixes, the PKTAP PID ceiling fix,
  and HTTP parser performance (#402, #404, #406, #415, #434, #479)