Calls, games and streaming
Call and remote session reports, call mode, the check before meetings, game server ping and the overlay.
Call reports
After each call, Kilobat tells you whether it froze and why. It notices a call when Zoom, Microsoft Teams, FaceTime, Slack, Webex, Discord, WhatsApp, Telegram, Signal or a browser uses the microphone for more than ten seconds. It never hears the call: it only sees which app uses the microphone, which macOS shows anyway. Until the call ends it pings the internet and your router once a second, notes the busiest other app, and checks the Mac’s CPU, memory, temperature and GPU every five seconds.
Two or more seconds in a row of lost pings, or pings 200 ms slower than the call’s usual, count as a freeze. Each freeze gets a cause: another app uploading or downloading at the time, another device on your network (from your router’s traffic counters, when the router shares them over UPnP), the Wi-Fi (when the router stalled too), AirDrop scanning, or beyond your router. Separately, the card says when the Mac itself struggled: the CPU maxed out (and by which app), memory running out, the Mac slowing itself down because it’s hot, or the GPU maxed out. The card shows in Health › Calls and as a notification. Without Pro it shows how many times the call froze; Kilobat Pro names the causes and says what to try. Turn it off in Settings › Network › Report after each call. In the terminal, kilobat calls lists the cards, and agents get them through get_call_reports.
When a call froze beyond your router, where the calling service’s own servers are, Kilobat asks that service’s status page as the call ends, and the card says what it reported at the time: “Zoom’s status page reported an outage at the time”, with the incident and a link, or that it reported no problems. This part is free.
SSH and remote desktop reports
After an SSH, Mosh or remote desktop session, Kilobat says whether typing lagged or the screen froze, and why. It counts an ssh or mosh-client that has a terminal of its own (a tty, or a terminal app such as Terminal, iTerm2, Ghostty, WezTerm, kitty, Warp or VS Code among its parents), and Screen Sharing, Parsec, Jump Desktop, Windows App (Microsoft Remote Desktop), AnyDesk, TeamViewer and RustDesk while they show a remote screen. A session needs a minute of input from the terminal or viewer in front before it gets a report, so scp, sftp, rsync, git over ssh, tunnels (-N, -f), ProxyJump hops, single commands and editors’ or agents’ background ssh never count. Sessions to this Mac itself (a VM or container on localhost) are skipped. Chrome Remote Desktop runs inside a browser tab and can’t be told apart from the browser. Kilobat never reads the session: it sees the process, the address it’s connected to and how many bytes it moves.
While a session is open, Kilobat pings the host once a second (the host’s own address, as the connection names it), the internet and your router, reads the connection’s own TCP round trip from macOS every few seconds, and notes the busiest other app, the Wi-Fi and the Mac’s load, the same way call reports do. Two or more seconds of lost pings, or pings 150 ms slower than the session’s usual, count as a lag; for SSH and Mosh only while you were typing. Each lag gets a cause, in the call reports’ order: the Wi-Fi’s sign-in page logging you out, then another app uploading or downloading, another device on your network (named when it’s a paired Mac running Kilobat), jitter or weak signal on the Wi-Fi, AirDrop scanning, Starlink, your provider or beyond (the internet stalled too), or the path to the host itself (the internet answered on time but the host didn’t). When the lag was past your router and the host belongs to a service whose status page Kilobat reads, such as Tailscale, the report says when that service owned up to an outage. A host 150 ms or more away is named as far away even when the line was clean. When keystrokes went unanswered for two seconds or more while the host and your router answered pings on time, the server itself was slow; Kilobat says so only after it happened twice, and only for SSH. A host that ignores ping is measured to the internet, with the connection’s TCP round trip for its distance and for that check.
For SSH, when the lags came from Wi-Fi jitter, AirDrop, Starlink or the path, or the host is far, jittery or drops packets, the report suggests Mosh, which echoes typing at once and survives lost packets and Wi-Fi changes. It doesn’t when an app, another device, the Mac or the server was the cause, since Mosh would only hide it. A session ends when its process quits, or after ten minutes without a keystroke (three for a remote desktop), and the report stops at the last input. Reports show in Health › Remote sessions, which appears once Kilobat has seen a session; a notification comes only after one that lagged or froze. Without Pro the report says how many times; Kilobat Pro names the causes, says what to try and when Mosh would help. Turn reports or their notifications off in Settings › Network › Report after remote sessions. In the terminal, kilobat remote lists them (--kind ssh|mosh|desktop), and agents read them through get_remote_session_reports.
Stream reports for OBS
After each stream from OBS, Kilobat says whether frames dropped, when, and why. It reads OBS Studio 28 or later through the WebSocket server built into it (obs-websocket 5). In OBS, open Tools › WebSocket Server Settings and tick Enable WebSocket server; then turn on Settings › Streaming › Stream reports from OBS in Kilobat, with the port (4455 unless you changed it) and the password if OBS asks for one. The password is kept in your Mac’s Keychain. Test connection says plainly whether it worked, or whether OBS isn’t running or its WebSocket server is off, a password is needed, or the password is wrong. Kilobat connects only to 127.0.0.1 and asks for counters: it never sees the video, the audio, the chat or your stream key. Streamlabs Desktop and other streaming apps aren’t read: Streamlabs has its own remote control (port 59650, with a token) whose one dropped-frames figure doesn’t say whether the network or the encoder dropped them.
While OBS streams, Kilobat asks it once a second for its stream status (frames dropped by the network, what OBS calls Dropped Frames (Network), its congestion figure and the bytes sent) and its stats (frames missed due to rendering lag, frames skipped due to encoding lag, and OBS’s CPU use). Beside them it measures the line the way call reports do: a ping a second to the internet and your router, the busiest other app, the Mac’s load, your router’s traffic counters for other devices when it shares them over UPnP, paired Macs’ own reports, the Wi-Fi signal, AirDrop, a Starlink dish and the Wi-Fi’s sign-in page.
Each window when frames dropped gets a cause, and the network’s are kept apart from OBS’s own. On the network side: another app on your Mac uploading (such as Dropbox), another device on your network, the Wi-Fi or router stalling (weak signal or AirDrop named when they were the reason), Starlink, the Wi-Fi’s sign-in page logging you out, a bitrate set above what your upload sustained, or beyond your router, at your provider or on the path to the ingest server. Frames skipped to encoding lag are the encoder not keeping up, and frames missed to rendering lag are the GPU, usually busy with the game; the report says that wasn’t your connection. The advice follows the cause: lower the bitrate to a figure your upload carries, pause the app, Call mode for streams, Ethernet instead of Wi-Fi, a closer ingest server, a faster encoder preset or the hardware encoder (Apple VT H264), or a lower resolution or frame rate.
Reports show in Health › Streams, beside Calls and Remote sessions, once Kilobat has seen a stream. A notification comes only when the stream dropped enough to notice: 0.5% of its frames or more, or a window where 5% or more dropped. Without Pro the report says how many frames dropped; Kilobat Pro names each cause and what to change. Call mode for streams (Pro) holds the apps Call mode holds, Dropbox, Google Drive, OneDrive, Backblaze and the rest, plus Steam’s downloads while no game is in front, from when OBS starts streaming until it stops.
The go-live check answers whether your upload can carry tonight’s stream. From Health › Streams, the Shortcut Check before going live or kilobat stream check, it runs about eight seconds of upload over one connection to Cloudflare (at most 16 MB) and 20 pings to 1.1.1.1 for jitter and loss. It reads the bitrate set in OBS (in Simple output mode from the profile, in Advanced from the profile’s encoder settings), or your last stream’s, or the one you give it, and compares: the upload should be the bitrate plus 30%. It says ready; tight when the upload covers the bitrate but not the headroom; or not enough, with a bitrate that fits (the upload divided by 1.3, rounded down to 100 kbps). It also names apps uploading right now. On a metered network it never measures without asking, and uses your last speed test on that network instead, saying so. The check is free.
In the terminal, kilobat stream (or stream status) says whether OBS is connected and live, with its dropped frames so far; kilobat stream check runs the go-live check (--bitrate <kbps> to set it, --no-measure to use the last speed test, --measure to test on a metered network anyway); kilobat stream reports lists past streams. Each takes --json. Agents use get_stream_reports and check_stream_readiness, both read-only. See Kilobat for streamers.
Cloud gaming
While a cloud game plays, Kilobat measures the session the way call reports measure a call, and afterwards says when it stuttered and why. It recognises GeForce NOW, Boosteroid and Shadow in their Mac apps, by the app’s name, and GeForce NOW, Xbox Cloud Gaming, Amazon Luna, Boosteroid and Shadow in a browser. A session starts when the app’s or the browser’s own traffic carries a game stream: for ten seconds, mostly 2 Mbps or more of UDP coming in, 3 Mbps on average and four times what goes out. Standard web video on port 443 and most two-way calls do not meet that test. Another busy tab in the same browser can affect the estimate. In a browser, the stream also has to be named: Kilobat looks at the hosts the browser is talking to, from its network filter’s names or reverse DNS, for the service’s own (play.geforcenow.com, the gssv-play hosts under xboxlive.com, luna.amazon., cloud.boosteroid.com, pc.shadow.tech). A browser stream it can’t name is left alone, so without the network filter some browser sessions go unreported. It never sees the game, the video or your account.
During a session, Health › Cloud gaming shows the ping, jitter and loss over the last 30 seconds (to the stream’s own server when it answers ping, else to 1.1.1.1), estimated stream bitrate and data from qualifying client traffic, and what on this Mac is in the way right now: AirDrop scanning, Wi-Fi on 2.4 GHz, a weak signal, and apps uploading or downloading a lot, with iCloud Photos, iCloud Drive, Time Machine and macOS updates named as such. Pause AirDrop and background transfers pauses AirDrop’s link (free; macOS asks for an administrator password) and, with Pro, holds the apps Call mode holds, such as Dropbox, Google Drive and Steam’s downloads, until the session ends, until you switch to one, or for three hours at most. Apple’s iCloud and update services aren’t suspended; the card says how to pause them yourself. On a metered network or a hotspot it adds the data an hour at the current bitrate, the session’s projected total over your usual session length for that service (an hour until it has seen three), and when your budget there runs out.
A stutter is two or more seconds of pings lost or 100 ms over the session’s median, or three seconds or more of the stream’s bitrate under 40% of its median (the service turning the picture down), outside the first half minute and the last seconds. Each gets everything that held at the time: the Wi-Fi’s sign-in page, the Wi-Fi when your router stalled too (split into 2.4 GHz, a weak signal, AirDrop and a far mesh node), a Starlink dish, another app moving a lot, another device on your network, or beyond your router. One reads like “Stuttered at 21:14 for 40s: 2.4 GHz Wi-Fi while iCloud Photos uploaded”. Without Pro the report says how many times it stuttered, with the ping, bitrate and data; Kilobat Pro names each cause and what to change. A notification comes after a session that stuttered (Settings › Streaming › Cloud gaming reports, and Notify after a session that stuttered). Reports are kept on this Mac, the last 200.
In the terminal, kilobat cloud-gaming (or cloud-gaming status) shows the session now and kilobat cloud-gaming reports the past ones, each with --json. Agents use get_cloud_gaming, read-only. See cloud gaming on a Mac, with pages for GeForce NOW, Xbox Cloud Gaming, Boosteroid, Amazon Luna and Shadow.
Call mode
Call mode stops the apps that freeze calls while you’re on one. When a call starts, Kilobat suspends Dropbox, Google Drive, OneDrive, Box, Backblaze, Arq, Creative Cloud, torrent clients and similar apps that are running, and refuses their new connections, so an upload already under way stops at once. Game launchers (Steam, Epic Games, Battle.net) are held only while they download and no game is in front, so a game and its voice chat keep working. Everything resumes the moment the call ends, when you switch to one of the apps, when Kilobat quits, or after three hours at most; a list written before each pause makes sure nothing stays suspended, even after a crash. Apple’s own iCloud and update services aren’t suspended. Choose the apps under Settings › Network › Call mode › Choose…, where you can also pause AirDrop during calls (macOS asks for your password as each call starts). The call’s card then says which apps Call mode held. Call mode is part of Kilobat Pro.
The check before meetings
Turn on Settings › Network › Check before meetings and allow Calendars once. About five minutes before an event with a Zoom, Google Meet, Microsoft Teams, FaceTime, Webex, Whereby or similar link, Kilobat spends ten seconds checking other apps’ traffic, the Wi-Fi, 100 quick pings to the internet, AirDrop and the Mac’s load. It notifies you only when something would freeze the call, such as “Dropbox is uploading and Wi-Fi is weak”; with Kilobat Pro the notification has a button that pauses those apps until the call ends. The calendar is read on this Mac and nothing about the meeting is kept or sent anywhere.
Ping to game servers
Which region should you queue for? In Speed › Game servers, open the game picker, search for your game and click Ping servers. Kilobat pings every data center of that game five times, a few at a time, and lists them by median ping with jitter and loss, the closest one first as Best for you. A steadier region within 2 ms beats a jumpier one. It takes about five seconds and runs only when you ask. The picker lists the games you used last first, then every game by how many play it.
What it pings depends on where each game publishes or hosts its servers, and the number is always your ping to that region’s data center, not to the match server you end up on, which can add a little:
- Valve relays, for Counter-Strike 2, Dota 2, Deadlock and Team Fortress 2: Valve’s relay in each data center, from the relay list Steam publishes for each game. Their matchmaking traffic goes through these relays, and CS2’s own
net_print_sdr_ping_timesmeasures the same ones. - Epic ping servers, for Fortnite: the ping server Epic names for each matchmaking subregion. Where a network blocks ping, Kilobat times a TCP connection to it instead.
- AWS regions, for Apex Legends, Dead by Daylight and Marathon: these games host matches on Amazon GameLift, and Kilobat sends a UDP echo to GameLift’s own ping beacon in each AWS region the game uses (Apex and Marathon list theirs in their Steam data-center config). It’s labelled with the region, such as “Frankfurt · AWS eu-central-1”.
- Azure regions, for Rainbow Six Siege, Age of Empires II, III and IV and Age of Mythology: Siege’s data centers are PlayFab regions on Azure, and every Age of Empires lobby names the Azure region of its relay server. Kilobat sends PlayFab’s latency probe to its beacon in each region; where a region has no beacon (UK West), it times a TCP connection to Azure Storage there.
- Official test hosts, for Brawlhalla and Hunt: Showdown 1896: the ping-test hosts Brawlhalla’s help lists for each region (timed by TCP, as they don’t answer ping), and the two test addresses Crytek publishes for Hunt’s Europe and US East.
Games that publish nothing to ping are listed in the picker with the reason and aren’t guessed at: Valorant and League of Legends (Riot publishes no target, and the addresses players share no longer answer), Overwatch 2, Call of Duty, PUBG, Marvel Rivals, Roblox, World of Warcraft and others with no published servers or regions; GTA Online, Helldivers 2, Destiny 2 and Warframe, where players host; Minecraft, Rust, Palworld and Valheim, where you join servers others run; and EVE Online, whose address answers at a Cloudflare edge rather than London. For them, use your current match.
Your current match, at the top of the panel, works for any game. While you play, Kilobat looks at the game in front, or the last one that was (an app in the Games category, a game in your Steam library, or a Windows game in CrossOver, Whisky or Wine), takes the server it exchanges the most UDP data with, leaving out web, DNS and voice-setup traffic, names the country DB-IP registers the address in (or the Valve data center, when it’s one of Valve’s relays) and pings it five times. Many game servers don’t answer ping; Kilobat then says “This server doesn’t answer ping” instead of showing loss. Some games send from a connection macOS doesn’t label with an address, and Kilobat says it can’t see their server.
Click Use on overlay to put either ping on stream: the overlay then pings that data center, or your match’s server, once a second and names it on the pill, such as “CS2 · Frankfurt” or “Match · Germany”; for the match, it looks for the server again every 30 seconds. In the terminal, kilobat games lists the games, kilobat games --game aoe4 prints one game’s table and overlay target, kilobat games --match checks your match, and kilobat overlay --target aoe4:westeurope or --target match streams it; agents use get_game_ping.
Streaming overlay
Show your live ping on stream. Turn on Settings › Streaming › Streaming overlay, then add http://localhost:7171/ as a Browser Source in OBS, Streamlabs or any streaming app (640 × 80 is plenty). A small pill shows ping, jitter, loss and the last minute as a line. It pings the internet (1.1.1.1) by default; pick your router, your current match or a game’s data center beside the setting, or from Game servers, and the pill names it, which server=0 in the URL hides. The bat at its start smiles in blue while the line is good, turns violet when it slows, and frowns in rose when it's poor. Change it in the URL: ?show=ping,jitter,loss,graph,speed, theme=dark, light or clear, and size=s, m or l. With Pro, brand=0 hides the wordmark and face=0 shows a plain dot instead of the bat. While it's on, Kilobat pings its target once a second; the page is served on 127.0.0.1, so only this Mac can open it. Without the app, kilobat overlay serves the same page until Ctrl-C, with --target for the router, match or a game region. To find out afterwards why OBS dropped frames, and to check your upload before going live, see Stream reports for OBS.