One command for real-time, human-readable network intelligence on macOS and Linux. See which local app is talking, the real domain behind shared CDN IPs, first-seen destinations, encrypted-DNS bypasses, and heavy uploads as they happen.
python3 wirewatch.py
$curl -fsSL https://wirewatch.net/install.sh | bash
Maps active TCP/UDP sockets to local processes (Brave, Cursor, Opera, curl, iCloud) without slow lsof calls, while flagging unsolicited inbound packets with IN ↙.
Correlates TLS SNI, QUIC, HTTP, and conn.log by Zeek's connection uid first. Two apps talking to different sites on the same Cloudflare/Fastly IP never overwrite each other's domain label.
Spots when an app or browser connects to a domain via TLS SNI without ever making a local DNS query ([No-DNS/DoH]), or connects to a bare public IP with neither DNS nor SNI ([DIRECT-IP]).
Remembers registrable base domains across sessions in .wirewatch-known.json and badges brand-new destinations with ★ NEW. Press n or pass --only-new to watch only new/anomalous activity.
Automatically tags [AI], [TELEM], and [OS/SYNC] endpoints and translates cryptic Bonjour/mDNS queries like _companion-link._tcp.local into [Apple Continuity] or [AirPlay].
Shows ↑sent ↓rcvd bytes on every connection, flags heavy outbound uploads, folds noisy certificate chains into [TLS] (alerting on [EXPIRED-CERT]), and collapses parallel browser socket bursts.
| --only-new | Only show ★ NEW domains, alerts & heavy uploads |
| --hide-lan | Suppress unnamed LAN/mDNS/local chatter |
| --only dns,ssl,conn | Show specific Zeek protocol logs exclusively |
| --match TEXT | Case-insensitive substring filter across rows |
| --min-bytes N | Hide connections transferring fewer than N bytes |
| --watchlist FILE | Flag domains, IPs, or CIDRs with [WATCH] |
| --pcap FILE | Analyze an existing capture file (no sudo needed) |
| --verbose | Show all raw X.509 & parallel handshake rows |
wirewatch/ folder so Zeek logs and `.wirewatch-known.json` stay contained.sudo to start packet capture with Zeek's output isolated from your terminal.q or Ctrl+C, then prints a full session summary.