Why Arena Signal, and not Connection Health?
Manasight's MTG Arena connection indicator just shipped. The rename at the end taught me more than the feature specification at the start.
You're climbing ranked, one win from the next tier. Opponent has priority. You realize you haven't clicked anything in a while. Has it been ten seconds? Thirty? Is the opponent staring at a tough block decision, or did they walk away? Are they roping on purpose, or did their Wi-Fi flake? Arena won't tell you. Not until it gives up on the game and kicks one of you out, which on macOS can take close to a minute.
That silence is the problem Arena Signal was built to solve. I wrote a spec for it two months ago. What shipped isn't quite what I planned. This post is about the difference.
Not "Connection Health." Arena Signal.
The internal codename for months was "Connection Health Indicator." Accurate, clinical, diagnostic. It also quietly implied something I couldn't honestly deliver: that the tool knows why your connection has a problem.
It doesn't. It can't. I read the log file Arena writes, which means I don't see your router, your ISP, your Wi-Fi strength, the captive portal at the coffee shop, or the TCP socket Arena itself is holding. I see one thing: whether Arena's server is still sending game events, and how long since the last one.
That's a signal, not a diagnosis. Calling it "health" would have implied data Manasight can't read. "Arena Signal" tells the truth: this is the signal Arena writes to its log, and Manasight puts it on your overlay.
Three principles the rename committed me to
Surface, don't infer. Everything the signal indicator shows maps to an event or gap in the log. No estimator, no ML model, no "we think your connection is bad." If Arena's log reports a disconnect, you see "Lost". If Arena has been quiet for more than twenty seconds during gameplay, you see "Weak". That's it. No guesses about what's happening on your network or Arena's servers. Just what the log is or isn't saying.

Simple display, layered detail. Four signal bars. Everyone knows what signal bars mean. But my favorite upgrade is the optional latency counter: the raw number of seconds since Arena's last server message. Those are the two pieces of information worth putting on screen.

Real-time, not retrospective. Arena's own "Connection Lost" dialog fires after Arena has given up. The new "Signal Lost" warning fires up to fourteen seconds before that dialog on macOS. Those fourteen seconds are what the feature is for: enough time to check your computer, reconnect from another device, or mentally prepare for the worst.
And that's Manasight's whole point: see what your games are telling you. Arena has been reporting your connection state in its log all along. Manasight is just a window into that log.
Can't surface what you haven't observed
"Surface, don't infer" sounds simple until you try to do it honestly.
Post #4 documented the log's shape during normal gameplay: how game events are structured, what protobuf schemas Arena uses, what the ordering guarantees look like.
None of it said anything about what the log does when a connection fails. Does Arena write something when the socket dies? Does it write the same thing on Windows and macOS? What does a Wi-Fi hiccup look like versus an ISP cutting you off?
I didn't know. And I couldn't guess. Building a feature around log signatures I'd never observed would have meant inferring behavior I'd never seen.
So before writing a line of feature code, I had to go collect examples.
Publishing manasight-corpus before writing feature code
A corpus is a labeled collection of data. I needed one for Arena disconnects: examples on both platforms (Ethernet pulled, Wi-Fi disabled, ports blocked, packets dropped one-way), with notes about what I did to trigger each. Without it, I couldn't honestly build the feature.
On April 10, I published manasight-corpus: twenty-eight sanitized Arena logs, MIT/Apache-2.0, with CI to strip account IDs, display names, and tokens from every contribution.
Same playbook as Post #3. Before writing product code there, I bought a Mac Mini to test on three macOS versions. Here, before writing feature code, I published the test logs I'd need. Both pay up front for engineering integrity you can't fake later. And the corpus is public for the same reason the parser is: tenet #4, "leave the community better than you found it".
What the corpus revealed
The most surprising finding: macOS Arena can reconnect mid-match on ranked; Windows never did in my testing. The state machine has to handle Playing → Disconnected → Playing on one platform and treat match abandonment as terminal on the other. Other findings: Windows surfaces clean disconnect errors in ten seconds where macOS goes silent for fifty; macOS TCP timeouts are 2–3x longer. "Mac as first-class" isn't a marketing claim. It's the engineering work above.
Three things Arena tells us in the log
With the corpus in hand, the detection logic became obvious. Three signals do the work, each catching what the others miss.
- Arena logs that the state changed. Match-state transitions like
Playing → Disconnected. Definitive, but late: Arena only writes them after a clear network disconnection. - The OS says the connection closed. TCP and WebSocket close events, plus structured
ConnectionErrormarkers. These fire fast, often within seconds of the failure. Useful on Windows; less reliable on macOS, which tends to let connections die quietly. - Arena stops logging anything. Silence past a threshold for the current game phase. The only signal that catches macOS silent failures, and the one that fires before Arena's "Connection Lost" dialog.
What shipping changed about the spec
The corpus told me what disconnects looked like. It didn't tell me what normal gameplay looked like. That's where the bugs were.
Cursor hovers were resetting the timer
At first, the indicator never turned yellow when it should have. The bug: my silence detector was treating any log event as a heartbeat, including Arena's client-side UI events. Every cursor wiggle over Arena's UI was counting as a "still here" signal.
I wrote 214 lines to suppress false positives. Then I measured. Then I deleted 214 lines.
The next bug: false positives during the opening hand. You're staring at seven cards, deciding to keep or ship, and the server is sending nothing while you think.
Different thresholds for different MTG game phases were what I settled on eventually (twenty seconds for gameplay, forty-five for mulligan). But before that, I'd already shipped a more ambitious heuristic.
Arena logs its own internal inactivity timer. I read that timer and suppressed the warning any time Arena still thought the game was live. Clean, elegant, correct by construction.
It worked. It shipped. I felt clever.
The next day I checked the new behavior against the log corpus. The inactivity gate wasn't actually preventing false positives. The phase-aware threshold (the simpler fix I'd done first) was already catching almost all of them. The gate was just delaying the warnings that still slipped through by a few seconds. Same warnings, same problem, just later.
I deleted the file. Net diff: minus 214 lines. The feature worked better with less code.
Tenet #1 is "integrity over progress". Living up to it on a shipped feature looked like a negative-LOC pull request.
"You can check that?!"
Arena Signal lives in Manasight's overlay. I glance at it any time a pause runs long. It answers a question the game won't.
The AMA at the v1.0 launch showed I wasn't the only one. I mentioned the connection indicator (still called "Connection Health" at the time) almost in passing, and the top community reaction was "you can check that?!" That reaction is part of why the rename happened: players didn't want a diagnosis, they wanted the information Arena was technically broadcasting but nobody was showing them.
Arena had it. The log had it. Nobody was surfacing it. "Arena Signal" is what the feature does. "Connection Health" is what it would have pretended to do.
Make small promises, then keep them.
I'm Tim – I'm building Manasight. Arena Signal is now in Manasight's overlay on every match: Strong, Weak, or Lost. Try it at manasight.gg.
The manasight-corpus repo is at github.com/manasight/manasight-corpus, MIT/Apache-2.0, open to contributions.
Manasight is not affiliated with, endorsed by, or sponsored by Wizards of the Coast or Hasbro.