CLI reference

Every kilobat command, JSON output and scripting.

Commands

Monitor

kilobat status [--watch] [--json]Live per-app traffic and session budget; a JSON snapshot, or a JSON-lines stream with --watch
kilobat report [--csv|--json] [--summary] [--days 1…365]Locally recorded usage history, or daily totals and top apps; CSV has one row per app
kilobat report compare --total 40GB [--unit GB|GiB] [--direction both|download|upload] (--from DATE --to DATE | --period last-month) [--network NAME] [--json|--csv]A router's or provider's figure beside what Kilobat recorded on this Mac for the same period, in the same unit, with the hours recorded, every gap and likely reasons for a difference
kilobat health-history [--hours 1…720] [--json]Router, internet, jitter and DNS checks the app recorded over time
kilobat proxy [routes [--app name] | test] [--json]Proxy apps, the system proxy and their problems; which rule and node each app took; how fast each node answers
kilobat vpn [--json]The VPN, whether DNS or IPv6 skip it, and the VPN kill switch's state
kilobat vpn leaks [--json]Leak test: whether DNS, IPv6 or UDP (what WebRTC uses) goes around the VPN, each with the setting that fixes it; asks bash.ws, Cloudflare and a STUN server
kilobat calls [--limit 1…200] [--json]After each call: how many times it froze and what caused it, from the reports the app writes
kilobat remote [--limit 1…200] [--kind ssh|mosh|desktop] [--json]After each SSH, Mosh or remote desktop session: why typing lagged or the screen froze, and when Mosh would help
kilobat stream [status|check|reports] [--json]OBS over its local WebSocket: whether it is live and dropping frames, a go-live check of your upload against its bitrate plus 30% (check [--bitrate <kbps>] [--measure|--no-measure]), and the reports after each stream (reports [--limit 1…200])
kilobat cloud-gaming [status|reports] [--limit 1…200] [--json]GeForce NOW, Xbox Cloud Gaming, Boosteroid, Amazon Luna and Shadow: the session now (ping, jitter, loss, bitrate, data, what is in the way) and the report after each, with when it stuttered and why
kilobat overlay [--port 7171] [--target internet|router|cs2:fra|host]A live ping overlay for OBS and other streaming apps, served on localhost until Ctrl-C; a game region such as cs2:fra pings that data center
kilobat support-report [--hours 1…168] [--host h] [--include-sites] [--markdown|--html] [--output f]A report for your provider or IT desk: findings, latency, outages and speed tests, without your network’s name or local addresses
kilobat plan [--days 7…90] [--json]Speed tests against the plan you pay for on each network: the median, evenings beside the rest of the day, and how often a test got under half
kilobat credit [--provider id] [--price n] [--month this|last|YYYY-MM] [--draft] [--json]The month’s outages beyond your router against your provider’s published credit rule, what they may qualify for, and a drafted claim; <code>credit providers</code> lists the rules
kilobat week [--weeks-ago 0…12] [--json]The weekly digest: last week’s most notable outages, frozen calls, router, blocks and metered data, compared with the week before
kilobat router [--all] [--json]Router check-up: its usual replies, loss and drops against the last three days, restarts and whether they helped, from the checks the app keeps
kilobat router connect [fritzbox|unifi|mikrotik|openwrt] [--json]Setup steps for the app’s Pro router connection; never takes credentials on the command line
kilobat router devices [--json]The connected router’s clients, measured rates and today’s totals through the app; FRITZ!Box and other whole-home counters never imply a single device’s share; client counters may include LAN traffic
kilobat router disconnect [--json]Forget the router for this network; the app removes its Keychain credential, or does so on its next start
kilobat service-speed [--all] [--test <service>] [--list] [--json]Your own downloads from GitHub, iCloud, Steam, npm and more against the line, and when your provider’s route to one is slow; <code>--test</code> downloads up to 25 MB from one now
kilobat hotspot [--all] [--carrier <id>] [--detect] [--json]On a phone hotspot: whether every download stops at a carrier’s hotspot cap, the measurements behind it and the carrier’s published rules; <code>hotspot carriers</code> lists them
kilobat networks [forget <name>]Networks seen, with the profile, budget and data cost remembered for each
kilobat networks cost <metered|unmetered|automatic> [name]Treat this network, or a named one, as metered or unmetered, or follow macOS again
kilobat bandwidth [app] [hour|day|week|month] [--back N] [--json]One app's sent and received bytes over an hour, day, week or month, with the peak; --back steps to earlier periods
kilobat access-policy <bundle-id> [--json]The connections an app's developer declares in its Internet Access Policy, and why

Diagnose

kilobat diagnose [--json]Wi-Fi, router, internet, DNS and captive-portal checks with advice
kilobat radar [--watch] [--json]Signal score and best-spot finder
kilobat scan [--json]Nearby networks, channels, widths and security
kilobat channels [--json]Congestion per channel and the least crowded one
kilobat speedtest [--json] [--budget-mb 1…80] [--parallel]Cloudflare speed, loaded latency and call and streaming verdicts, 80 MB at most. One connection by default; --parallel opens four, as most speed-test sites do
kilobat speed-compare [<test> <test>] [--json]What differed between two saved speed tests: network, time, server, connections, Wi-Fi band and signal, VPN, other traffic
kilobat ip [--public] [--json]Where traffic leaves: the interface and any VPN, read on this Mac; --public also asks Cloudflare for your public IP and its registry country
kilobat portal [open] [--json]Wi-Fi sign-in pages: a check now (open, sign-in page or offline, with the page’s address, query values redacted), whether this network wants a sign-in, logged you out or how long is left, and each network’s usual sign-in length; open opens the page in your browser
kilobat stutter [--seconds 10…60] [--target router|internet|<host>] [--json]Ping every 50 ms to find the short latency spikes speed tests miss, when they happen and whether they repeat
kilobat starlink [--hours 1…720] [--json]A Starlink dish on this network, read from it locally: state, ground-station ping, alerts, the sky map and which way it’s blocked, and outages split into your setup, Starlink’s network and dish restarts
kilobat games [--game <game> | --all | --match] [--json]List the games Kilobat pings and the ones it can't, with why; with --game, ping each of that game's data centers (Valve relays, Epic ping servers, or the AWS and Azure regions it hosts in) five times and name the one closest to you; with --match, find and ping the server of the match you're playing, for any game, ready for the streaming overlay
kilobat airdrop [status|everyone|contacts|off] [--json]AirDrop visibility, the AirDrop link (AWDL) and what uses it; changing visibility opens System Settings
kilobat bluetooth [--json]Bluetooth devices and whether they share 2.4 GHz with your Wi-Fi
kilobat bluetooth audio [--json]While AirPods or other Bluetooth headphones play: what can make them crackle (2.4 GHz, AirDrop, a big download, a weak signal) and what to change, in order
kilobat local [check] [--quick] [--json]Can I cast or print here? The Chromecasts, AirPlay receivers and printers that answer, whether the network may keep devices apart (never confirmed from discovery alone), a printer's or camera's own Wi-Fi, and what makes a cast stutter
kilobat dns [automatic|cloudflare|google|quad9|flush]Read or set DNS, or flush the cache
kilobat dns fastest [--all] [--json]The fastest DNS on this network, from the app’s quiet runs against Cloudflare, Quad9 and Google, with who runs each and where, and its answered lookups over 14 days
kilobat dns auto on|off [--network <name>]Pro: switch to the fastest DNS on joining, everywhere or on one network
kilobat dns exclude|include <resolver>Never time or pick a resolver, or add your own by IP address
kilobat dns fallback <resolver>|offThe resolver to move to when the fastest fails, before your network’s own

Wi-Fi

kilobat wifi [status]Current network, signal, channel and width, link rate, Wi-Fi standard, security and transmit power
kilobat wifi on|off|restart|disconnectControl Wi-Fi power and the connection
kilobat wifi join <name> [--password-stdin]Join a saved network, or a new one
kilobat wifi knownSaved networks in order of preference
kilobat wifi password|share <name>Show a saved password, or a QR code to scan with a phone
kilobat wifi nodes [name <node> <name>] [--json]Mesh nodes or access points of this network, which one the Mac is on, and whether a much closer one is in range; name one, such as Office
kilobat wifi reconnect [--json]Move to the closer node, then say where the Mac ended up
kilobat low-latency on [--for 15m|1h|2h] [--until-quit <app>]Pause AirDrop and AWDL during calls and games: 15 minutes by default, up to 4 hours, or until an app quits
kilobat low-latency offRestore AirDrop and AWDL, also for a pause started in the app

Awake & agents

kilobat awake [--display]Keep the Mac awake until Ctrl-C; closing the lid still sleeps it unless you add --lid-closed
kilobat awake --lid-closed [--for 2h|--until-quiet|-- <command>]Keep running with the lid closed too, 8 hours at most, through the app’s power helper; needs Allow running with the lid closed in Settings
kilobat awake --for 90m|2h|45sStay awake for a while
kilobat awake --until-quiet [--app <id>] [--quiet 1…60]Stay awake until downloads or one app go quiet, below 16 KB/s for 3 minutes by default
kilobat awake -- <command> [args]Stay awake while a command runs, then report the data its processes moved and exit with its status
kilobat awake --while-frontmost <app> [--display] [--for 2h]Stay awake only while that app is in front, for reading or presenting. Switching away lets the Mac sleep; it ends when the app quits, at 20% battery or after --for. --display keeps the screen on too
kilobat settings awake-on-power on|offThe app stays awake whenever the power adapter is in and lets the Mac sleep again when it comes out
kilobat settings keep-screen-on on|offKeep the screen on too for everything the app keeps awake: timers, downloads, agents, the app in front and plugged in
kilobat sessions [--days N] [--json]Awake sessions and AI agent runs the app recorded, with data used and network changes
kilobat agent-log [--all] [--since 2h|3d|date] [--agent claude] [--flagged] [--json]Every host an AI agent and the commands it started contacted, with bytes and flags: the latest session, or the agent's own when run from it. Recorded by the app with Pro
kilobat history forget <host> [--subdomains] [--json]Remove a host from blocked attempts, the agent network log, agent-run destinations and Protection notification memory
kilobat history clear --hour|--today|--all [--json]Clear those host histories for the last hour, since midnight or entirely; future activity can be recorded again
kilobat agent-log --watch [--agent claude] [--flagged] [--json]Records the same live in this terminal, without the app; nothing is saved
kilobat protect [status|on|off|update] [--threats|--trackers|--agents] [--json]Protection: block known malware, phishing and scam hosts (Pro), trackers in apps (free, off by default) and the agent guard (Pro); update downloads the lists now
kilobat protect check <host> [--json]Whether a host is on a threat or tracker list, which one, and whether Kilobat blocks it; exits 1 if it does
kilobat protect allow|unallow <host>Let a site and its subdomains past every Protection list, or undo it
kilobat agent-event <start|working|waiting|done|failed> [--agent name] [--stdin-json|--json-arg]For an agent's hooks: tells the app a run started, waits for you or is done. Silent, always exits 0
kilobat why <url|host> [--app <id>] [--proxy <url>] [--context container|vm|remote|provider] [--failed-at <time>] [--error <text>] [--json]Find the layer that stops a connection: network and interface, proxy and the app's own proxy, DNS, Kilobat rules, IPv4 and IPv6, TLS, the server and each redirect, and whether this network blocks it or the service refuses your region. Requests the exact URL; output hides query values. Also kilobat doctor <url|host>
kilobat down [service|host…] [--all] [--list] [--json]Is it them or me? What the public status pages of Slack, Zoom, GitHub, Claude, OpenAI and about seventy other services report now, and whether each connects from here: blocked on this network, or not available in your region; with no service, those of the apps running on this Mac
kilobat explain <process|host…> [--process name --host name] [--json]What a macOS process or host is, how much traffic is normal, whether blocking it is safe and what breaks, from Kilobat's own database on this Mac. The facts Kilobat has for anything it doesn't know
kilobat conditions [--json]Metered, Low Data Mode, VPN, latency, battery and heat, whether the lid may close, with advice for long runs

Control

kilobat profile [travel|work|unrestricted]List or select a profile
kilobat allow|block <bundle-id> [--minutes 1…1440] [--profile name]Save an app rule, optionally temporary or for another profile
kilobat reset <bundle-id> [--profile name]Remove an app's rule so it follows the default
kilobat rules [--profile name] [--json]A profile’s rules
kilobat limit [GB] [--cycle session|daily|weekly|monthly] [--reset-day N] [--alert 50,80,100]Read or set this network’s data budget, when it starts over and when it notifies
kilobat quota <bundle-id> <GB> [--upload] [--all-networks]Limit one app’s data per budget cycle; quota <bundle-id> --remove takes it off
kilobat quota --list [--json]App quotas with what each used this cycle
kilobat pack [status] [--json]Data packs such as a travel eSIM, with what is left and the day each runs out at the last three days’ pace
kilobat pack add <GB> <days|YYYY-MM-DD> [--network <name>] [--name <label>] [--start YYYY-MM-DD]Add a data pack on this network, on networks Kilobat has seen, or on any network whose name contains some text
kilobat pack correct <GB-left> [--pack <name>]Set what the carrier’s app says is left, since Kilobat counts this Mac only
kilobat pack end [--pack <name>]End a data pack now; it stays in the history
kilobat updaters [--json]Updaters paused on metered networks, the update bytes that still got through on this network, and the apps that update from inside themselves
kilobat updaters on|offPause updater helpers such as Google Updater and macOS Software Update while the network is metered (on by default); the apps keep working
kilobat settings kill-switch on|offPro: block new connections whenever the VPN is down; kill-switch-lan on|off keeps the local network reachable meanwhile
kilobat uploads [--json]Apps uploading a lot right now, with the rate, what they sent so far and the time left when the total is known, and the uploads held for later
kilobat uploads hold <app> [--until unmetered|fast|fast:<Mbps>|2h|manual]Hold an app’s upload until an unmetered or faster network, for a while, or until you resume it (Pro); uploads resume <app> lets it go
kilobat settings [name [value] ]Read or change settings such as new-apps (allow, ask or block), apple-software, auto-travel, pause-updaters, kill-switch, awake-on-power, public-ip (off by default), speed-streams, alerts and menu-bar
kilobat verdict <host> [--app <id>] [--port N] [--incoming] [--json]Why Kilobat allows or blocks a connection: every rule that matches, in the order the filter checks them, the one that decides and the command that changes each; verdict --app <id> for an app's own rules
kilobat verdict --blocked [1…50] [--json]The rules behind the latest blocked attempts, as the filter recorded them when it blocked
kilobat approvals [--json]Apps waiting for approval while new apps are asked about, with signer and destinations
kilobat approve|deny <app-id> [--minutes 1…1440]Block a waiting app at once, or ask the person to confirm allowing it in Kilobat
kilobat block-host|unblock-host <domain|IP|CIDR> [--app <id>]Block a domain (subdomains included, *.example.com accepted), an IP or a range for every app, or for one app
kilobat quit <PID> [--force]Quit a process

Setup

kilobat openOpen the Mac app
kilobat doctorCheck the app, network filter and monitoring
kilobat completion [zsh|bash|fish]Print a shell completion script
kilobat mcpRun the MCP server for AI agents over stdio
kilobat updateUpdate a Homebrew install

Expert

kilobat destinations [--pid PID] [--json]Observed process sockets
kilobat devices [--all] [--bonjour] [--json]Devices on your network, each new, known, unknown or ignored, with its type and how sure Kilobat is; --all adds ones that aren’t here now
kilobat devices name <MAC> <name>Name a device
kilobat devices mark <MAC> mine|unknown|ignoredAnswer for a new device, as the app’s alert does
kilobat devices type <MAC> <type>|autoSet a device’s type (camera, doorbell, tv, speaker, printer, plug, hub, console, phone, computer, drone, router, nas…); auto goes back to Kilobat’s reading
kilobat household [--json]Macs paired in the app and what each moves now; pairing stays in the app
kilobat smarthome [--json]Thread networks and border routers, Matter and HomeKit devices, and whether the network is ready for Matter; read-only
kilobat trace <host> [--rounds 2…10] [--json]Bounded 12-hop route probe; --rounds traces several times and shows each hop’s loss and delay
kilobat route-history --host <host> [--json]Every saved trace to a host, hop by hop like mtr: loss, best, average, worst, route changes and where delay starts
kilobat http-check <URL> [--json]DNS, connect, TLS and first-byte timing
kilobat dns-benchmarkResolver timings
kilobat lan-test <server> [--reverse] [--json]Five-second iperf3 test to a device running iperf3 -s; needs iperf3, which Kilobat never installs
kilobat interfaces [--json]Physical and VPN counters, separately
kilobat capture <interface> <file.pcap>Bounded packet capture
kilobat connection-rule allow|block <app> <host> [port]Save a destination rule
kilobat blocklist status|import <path>|clearManage a domain blocklist
kilobat wake <MAC-address>Send a Wake-on-LAN packet
kilobat spots [save <name>|remove <id>]Saved Wi-Fi spots
kilobat outages / speed-history [--days N]Recorded outages and speed tests as JSON

Scripting and JSON

Output switches to JSON automatically when piped, so scripts never parse the human layout. Pass --json to be explicit.

kilobat diagnose | jq .health            # "good", "degraded", "poor" or "unknown"
kilobat status --watch --json             # one JSON object per line, every second
kilobat report --summary --days 7 --json  # daily totals and top apps
kilobat report compare --total 40GB --period last-month --csv  # beside your provider's figure

Set NO_COLOR to turn off colors. Changes to DNS require administrator approval.