- Voice calls
- Video · 1080p
- Streaming · 4K
Will this call hold up? A speed test for capacity, and a stutter test for the short spikes that speed tests average away.
For streamers
OBS goes red, chat says you’re buffering, and the speed test swears you have plenty of upload. Kilobat reads OBS’s own frame counters while you stream, lines them up with what your network did, and afterwards says which minutes dropped frames and why, including when it wasn’t the network at all.
brew install seifip/kilobat/kilobatDropped 2.1% of frames: Dropbox was uploading. Your upload is 12 Mbps and OBS needs 8.
Skipped 340 frames to encoding lag. The encoder couldn’t keep up: your GPU, not your connection.
Kilobat
Ready to go live
Upload 12.4 Mbps. OBS needs 7.8 for 6,000 kbps with 30% to spare.
OBS counts three kinds of lost frames, and only one of them is the network. Kilobat reads all three once a second over OBS’s own WebSocket, and checks the line the way its call reports do.
Another app on your Mac filling the upload: Dropbox, Google Drive, iCloud, a backup.
Names the app and the minutes it cost you. Call mode for streams can hold it until you end the stream. Pro
Another device on your network uploading or streaming.
When your router shares its traffic counters (UPnP), Kilobat sees the line busy with traffic your Mac didn’t send. A paired Mac running Kilobat is named, with its app. Pro
The Wi-Fi or the router stalling: weak signal, a busy channel, AirDrop scanning.
Your router stalled too, which points to the local connection. Try Ethernet for streams, or move closer. Pro
A bitrate set above what your upload carries.
Says what your upload sustained and the bitrate that fits: “lower the bitrate to 4,400 kbps”. Pro
Your provider, or the path to the ingest server.
Says the drops were beyond your router, with a closer ingest server to try in OBS › Settings › Stream. Pro
The encoder couldn’t keep up. That’s the Mac, not the network.
Says so plainly, with a faster preset, the hardware encoder (Apple VT H264), or a lower resolution or frame rate. Pro
The GPU was busy, usually with the game itself.
“Your GPU was the bottleneck, not your connection”: cap the game’s frame rate or drop heavy sources. Pro
Kilobat works with OBS Studio 28 or later, through the WebSocket server built into it. It connects only to 127.0.0.1 and reads OBS’s counters; it never sees the video, the chat or your stream key.
About eight seconds of upload to Cloudflare and 20 pings for jitter and loss, against OBS’s bitrate plus 30% headroom. It says ready, tight, or not enough with a bitrate that fits, and which apps are uploading right now. On a metered network it never measures without asking.
FreeOBS’s dropped, skipped and missed frames, its congestion and bytes sent, next to pings to the internet and your router, the busiest other app, the Wi-Fi and the Mac’s load. With Call mode for streams, sync apps are held until you stop.
A card in Health › Streams with each window where frames dropped and why, and a notification only when the stream dropped enough to notice. Kilobat counts the drops for free; Pro names each cause and what to change.
FreeGo live check
Upload speed changes through the day, and a speed test with four connections flatters it. Before you go live, Kilobat runs one connection for about eight seconds, the way OBS sends, and compares it with the bitrate set in OBS plus 30% to spare. That’s the usual rule: OBS suggests a bitrate around 75% of your upload, so 6,000 kbps at 1080p60 wants about 8 Mbps up.
# Before going live
$ kilobat stream check
✓ Ready to go live
Your upload is 12.4 Mbps and OBS needs 8 (6,160 kbps plus 30% headroom).
ping 21 ms · jitter 3 ms · loss 0.0%
# On a busy evening
$ kilobat stream check
! Not enough upload
Not enough upload: 5.8 Mbps, and OBS needs 8. Lower the bitrate to 4,400 kbps.
Dropbox is uploading: pause it before you go live, or turn on Call mode for streams.
ping 24 ms · jitter 11 ms · loss 0.0%Free, from Health › Streams, the Shortcut Check before going live, or the terminal. On a metered network it uses your last speed test there instead, and says so.
Will this call hold up? A speed test for capacity, and a stutter test for the short spikes that speed tests average away.
Connect OBS
OBS only, for now: Streamlabs Desktop has its own remote control with a single dropped-frames figure that doesn’t split the network from the encoder, so it isn’t read. The streaming overlay works with any streaming app.
The report
Health › Streams shows each stream beside your calls and remote sessions: OBS’s dropped frames second by second, each bad window in rose, encoder and rendering lag kept apart, and one sentence for what happened. “Dropped 2.1% of frames 21:14–21:16: Dropbox was uploading. Your upload is 12 Mbps and OBS needs 8.” Earlier streams sit underneath, one line each.
# Is OBS connected, and is it live?
$ kilobat stream status
# Recent streams, each drop window and its cause
$ kilobat stream reports
# For scripts
$ kilobat stream reports --limit 5 --jsonCoding agents read the reports through the MCP tools get_stream_reports and check_stream_readiness. Read the docs.
What is eating your bandwidth? Live traffic for every app, right in your menu bar. Catch the backup choking your call.
kilobat stream and the MCP tools for agentsPro is $29 once for two Macs, with a 7-day free trial and 14-day refunds. Free for students.
OBS encoded the frame but couldn’t send it in time, so it threw it away to catch up. That’s the connection between your Mac and the ingest server, or a bitrate above what your upload carries. “Skipped frames due to encoding lag” and “frames missed due to rendering lag” are different counters, and neither is the network. Kilobat keeps all three apart.
Your bitrate plus about 30%. 6,000 kbps for 1080p60 wants about 8 Mbps of steady upload; 4,500 kbps for 720p60 wants about 6. OBS’s own advice is a bitrate around 75% of your upload. The go-live check measures what your upload carries now, over one connection, and compares.
A speed test averages ten seconds. A stream needs every second on time, and Wi-Fi stalls for a moment when the signal dips, a neighbour’s network is busy or AirDrop scans. Kilobat pings your router once a second during the stream, so it can tell the room from the internet. Ethernet fixes most of it.
The stream reports and the go-live bitrate need OBS Studio 28 or later, which has the WebSocket server built in. Streamlabs Desktop has its own remote control with one dropped-frames figure that doesn’t say whether the network or the encoder dropped them, so Kilobat doesn’t read it yet. The go-live check without a bitrate, and the streaming overlay, work with any app.
No. It connects to OBS on 127.0.0.1 and asks for its counters and the bitrate, nothing else. It never sees the video, the audio, the chat or the stream key, and everything stays on your Mac. The password is kept in your Keychain.
No. During the stream it asks OBS for its numbers once a second and sends one small ping a second to the internet and your router, a few kilobytes a minute. The go-live check’s upload test runs only before you go live, when you ask for it.
The reports, the drop count, the go-live check and the overlay are free. Kilobat Pro, $29 once with a 7-day free trial, suggests likely causes for drops and a bitrate that fits, and holds sync apps while you stream.
brew install seifip/kilobat/kilobat