Honest USB 2.0 cable detection, steadier reads, and Latvian
What's fixed
-
USB 2.0 cables no longer wrongly report USB 3 speeds (issue #187). A cheap USB-C to Micro-USB cable, or any USB 2.0 only cable plugged into a SuperSpeed device, was being shown as "USB 3.2 Gen 2 (10 Gbps)". Apple's port controller leaves a USB 3 capability flag set on the port even when the negotiated link is only USB 2.0; WhatCable was trusting that flag over the actual active transport. The active transport list is now the only authority, so the cable is correctly called as "USB 2.0 only (480 Mbps)". Thanks to @toofishes for the clean repro.
-
MagSafe ports no longer show stale power contracts after unplug (issue #185). A PD power contract could linger in the popover for several seconds after disconnecting a charger. The popover now clears the contract immediately. Thanks to @NaiveTomcat for the report.
-
Raw IOKit output is stable across captures (issue #186). Nested dictionary fields in
--json --rawoutput (likePin ConfigurationorIOPowerManagement) were appearing in different orders between runs, making it hard to diff two snapshots. Keys are now sorted alphabetically inside the nested values, so two captures of an unchanged port are byte-identical. Thanks to @toofishes for spotting this. -
PD spec revision is now read correctly. The PD revision label shown for connected devices (PD 2.0, PD 3.0, PD 3.1) was occasionally wrong due to a mapping bug.
Stability
- A wave of crash hardening across the watchers. Apple's IOKit binary deserialiser could abort the process when reading properties from a service that was being torn down. WhatCable now reads each property individually across every watcher (USB-C ports, USB-PD identities, Power sources, Smart battery, Thunderbolt switches, TRM, DisplayPort, Type-C PHY), which sidesteps the path that was crashing.
Pro
-
Negotiation Diagnostics now shows the Mac port's max speed. The Mac port column in the Negotiation panel was blank because the figure was never resolved. WhatCable now reads it from the host port's
Supported Link Speedmask (aggregated across the controller's lane ports), so most Apple Silicon Macs read either 40 Gbps (TB3 / TB4 / USB4 v1 generation) or 80 Gbps (TB5 / USB4 v2 generation), matching what the port's firmware actually advertises. Non-TB USB-C ports still show "—" because there is no controller to ask. -
Power Monitor no longer mirrors one port's data onto another. When only USB-C 2 was actively charging, USB-C 1's card could show USB-C 2's contract values (100 W / 20 V / 5 A) because the stale telemetry sample carried the wrong port key. All three of the resolver's data paths now share a single liveness gate, so a port that is not in use renders the "No power data" state regardless of what samples or contracts happen to be in the snapshot.
-
Negotiation diagnostics show wattage in the "fine" case. The Charger and Cable columns in the Negotiation panel were blank when negotiation succeeded; they now show the negotiated and rated wattages alongside the Negotiated column.
-
Clearer RDO labels in Cable Diagnostics. The two current values in the Power Contract section were labelled "Operating current" and "Max current", which read as if the second was the source or cable maximum. Both are actually values the Mac requests in its USB-PD Request Data Object: a typical draw and a peak. They are now labelled "Requested operating current" and "Requested max operating current" to make the framing unambiguous.
-
"Max power" row is hidden when IOKit doesn't report it. Some ports leave the IOKit
PortControllerMaxPowerfield at 0 even with a valid contract active, so the Cable Diagnostics screen was showing "Max power: 0 W" right next to a valid PDO of "5 V @ 3 A, 15 W". The row is now suppressed when the value is 0. -
Power Monitor card clears immediately on disconnect. The card was holding the last negotiated contract values (e.g. 100 W / 20 V / 5 A) for several seconds after the charger came out. It now uses the same liveness check the popover uses, so it clears as soon as the port is no longer in use.
-
Power Monitor disclaimer is more honest. The text under the contract card claimed the Mac doesn't report live per-port draw, but the System Power Input chart below the card was already showing live values. The disclaimer now says "Negotiated PD contract maximum. Live draw is shown in the System Power Input chart below."
-
A handful of internal fixes in the Pro watchers that could cause stale or missing data in the Power Monitor and Cable Diagnostics panels after unplug events.
Compatibility
- Thunderbolt fabric works on the latest Macs. Apple renamed the IOKit Thunderbolt switch class on M5 and macOS 26 (dropped the doubled
IOIOprefix). WhatCable's switch watcher was matching only the older name, so on these newer Macs no switches were detected: the Mac port column in Negotiation Diagnostics, the daisy-chain bullets in the popover, andwhatcable --tb-debugall came up empty. The watcher now registers against both name families and renders correctly on every Mac generation we've tested (M3 through M5).
Languages
- Latvian (lv) added by @shpokas. Full translation across the app and CLI, including correct three-form (zero / one / other) plurals for Latvian grammar in stringsdict.
- Traditional Chinese (zh-Hant) refined by @jimmyorz. New plural rules for the USB device count strings, more natural phrasing for speed labels (now "maximum" rather than "complete"), and the Pro funnel strings translated (they were English placeholders).
Install
- Inside the app: right-click the menu bar icon and choose "Check for Updates…". WhatCable also checks for updates on its own and posts a system notification when a new version is out.
- Homebrew:
brew upgrade --cask whatcable. - Manual: download
WhatCable.zipfrom this release page and drag the new.appinto/Applications.