
Website: whatcable.uk (overview, screenshots, and CLI docs) A small macOS menu bar app that tells you, in plain English, what each USB-C cable plugged into your Mac can actually do, and why your Mac might be charging slowly. USB-C hides a lot under one connector. Anything from a USB 2.0 charge-only cable to a 240W / 40 Gbps Thunderbolt 4 cable, all looking identical in your drawer. macOS already exposes the relevant info via IOKit; WhatCable surfaces it as a friendly menu bar popover.
What can this USB-C cable actually do?
Website: whatcable.uk (overview, screenshots, and CLI docs)
A small macOS menu bar app that tells you, in plain English, what each USB-C cable plugged into your Mac can actually do, and why your Mac might be charging slowly.
USB-C hides a lot under one connector. Anything from a USB 2.0 charge-only cable to a 240W / 40 Gbps Thunderbolt 4 cable, all looking identical in your drawer. macOS already exposes the relevant info via IOKit; WhatCable surfaces it as a friendly menu bar popover.

Per port, in plain English:
Click the gear icon in the popover header to open Settings, where you can:
Right-click the menu bar icon for Refresh, a Keep window open toggle (handy for screenshots and demos), Settings…, Contribute Diagnostic Data…, Check for Updates…, About, WhatCable on GitHub, and Quit.
WhatCable is free and open source. If you find it useful, you can support the project by picking up WhatCable Pro, which unlocks extra features:
whatcable --dashboardOne-time purchase, works on up to 2 Macs. See whatcable.uk/pro for details.
Visit whatcable.uk for an overview and screenshots, or install directly below.
Download the latest WhatCable.zip from the Releases page, unzip, and drag WhatCable.app to /Applications.
The app is signed with a Developer ID and notarised by Apple, so there are no Gatekeeper warnings.
It's not on the Mac App Store on purpose: App Sandbox blocks the low-level IOKit reads WhatCable depends on, so it ships signed and notarised outside the store instead.
Requires macOS 14 (Sonoma) or later, Apple Silicon only. On Intel Macs, the USB-C ports are driven by Intel Titan Ridge / JHL9580 Thunderbolt 3 controllers, and the USB-PD state and cable e-marker data WhatCable depends on are not exposed through any public IOKit accessor.
Note: The manual install gives you the menu bar app only. The
whatcableCLI is bundled inside the.appand is not on your PATH by default. If you want to use it from the shell, see the Command-line interface section below for the one-line symlink. Or install via Homebrew, which sets up the CLI automatically.
brew install --cask darrylmorley/whatcable/whatcable
This installs the menu bar app and symlinks the whatcable CLI into your PATH.
If you don't want the menu bar app, install just the command-line tool:
brew install darrylmorley/whatcable/whatcable-cli
Same signed and notarised binary, packaged on its own. Useful in terminal-only or scripting environments. Pick one of the two Homebrew installs (both ship the same whatcable binary).
Homebrew 6 may warn about untrusted third-party taps on first install. If an existing install starts complaining about an untrusted tap, run brew trust darrylmorley/whatcable or see https://docs.brew.sh/Tap-Trust for details.
A whatcable binary ships alongside the menu bar app, driven by the same diagnostic engine:
$ whatcable
USB-C Port 1
✓ Charging well at 96W
Cable: 5A, 100W, USB4 40 Gbps
Charger: 5V / 9V / 15V / 20V PDOs
USB-C Port 2
! Cable is limiting charging speed
Cable: 3A, 60W, USB 2.0
Device: External SSD, USB 10 Gbps
Flags:
whatcable # human-readable summary of every port
whatcable --json # structured JSON, pipe into jq
whatcable --watch # stream updates as cables come and go (Ctrl+C to exit)
whatcable --raw # include underlying IOKit properties
whatcable --report # open a pre-filled GitHub issue for the connected cable
whatcable --test-kit # run diagnostic probes and submit anonymised data
whatcable --desktop # launch the GUI app in Dock mode
whatcable --popover # launch the GUI app in menu bar mode
whatcable --version
whatcable --help
Pro from the command line:
whatcable --monitor # Pro: live power telemetry (Ctrl+C to exit)
whatcable --monitor-json # Pro: live power telemetry as newline-delimited JSON
whatcable --dashboard # Pro: full-screen TUI dashboard (Tab cycles screens, q quits)
whatcable --activate XXXX-XXXX-XXXX-XXXX # validate and store a Pro licence
whatcable --licence # show current licence status
whatcable --deactivate # remove the stored licence
whatcable --pro # show Pro features, open purchase page
The CLI prints a one-line Pro hint at the end of plain text output for unlicensed users. Run whatcable --silence-pro-hints to hide it (or --show-pro-hints to bring it back). Suppressed automatically when output is piped, redirected, or used with --json.
If you installed the .app manually rather than via Homebrew, the CLI lives at WhatCable.app/Contents/Helpers/whatcable. Symlink it into your PATH if you want it on the shell:
ln -s /Applications/WhatCable.app/Contents/Helpers/whatcable /usr/local/bin/whatcable
The Homebrew install does this for you automatically.
WhatCable reads four families of IOKit services. No entitlements, no private APIs, no helper daemons:
| Service | What it gives us |
|---|---|
AppleHPMInterfaceType10/11/12 (M3-era), AppleTCControllerType10/11 (M1 / M2) | Per-port state: connection, transports, plug orientation, e-marker presence. Type11 is what M2 MacBook Air uses for its MagSafe 3 port. |
IOPortFeaturePowerSource | Full PDO list from the connected source, with the live "winning" PDO |
IOPortTransportComponentCCUSBPDSOP, ...SOPp, ...SOPpp | PD Discover Identity VDOs from the port partner (SOP), the cable's near-end e-marker (SOP'), and the far-end e-marker (SOP'') if present |
| XHCI controller subtree | Each connected USB device is paired to its physical port via the XHCI port node's UsbIOPort registry path, falling back to a bus-index derived from the controller's locationID upper byte and the port's hpm SPMI ancestor on machines that don't expose UsbIOPort. |
Cable speed and power decoding follow the USB Power Delivery spec (aligned to USB-PD R3.2 V1.2, March 2026). Vendor names come from a bundled SQLite database (whatcable.db) that merges USB-IF's published vendor list, the community usb.ids list, and a curated set of cable fingerprints reported by users.
swift build # compile everything
swift run WhatCable # run the menu bar app (dev mode, no widget or bundle structure)
swift run whatcable-cli # run the CLI
swift test # run the test suite
Requires Swift 5.9+ (Xcode 15+). Note: swift run WhatCable launches a working dev build but without the widget extension or proper .app bundle. For a distributable build, use the build scripts below.
./scripts/smoke-test.sh
Builds, signs, notarises (if configured), and smoke-tests the app. Produces dist/WhatCable.app and dist/WhatCable.zip. Safe to run on any branch, any time. Does not touch the Homebrew tap.
Modes:
| Configuration | Result |
|---|---|
No .env | Ad-hoc signed. Works locally; Gatekeeper warns on other Macs. |
.env with DEVELOPER_ID | Developer ID signed + hardened runtime. |
.env with DEVELOPER_ID + NOTARY_PROFILE | Full notarisation + stapled ticket. Gatekeeper-clean for everyone. |
Cutting a release:
# write release-notes/v<version>.md first, then:
./scripts/release.sh <version>
The wrapper does the whole pipeline: bumps the version, runs build-app.sh
(which builds, signs, notarises, smoke-tests, and bumps the local cask),
tags and pushes the commit, creates the GitHub release with the notes
file, verifies the uploaded asset's sha matches the local zip, copies the
notes into the tap, and pushes the tap. Use --dry-run first to validate
state. Requires gh (auth'd) and the env vars from .env.example.
One-time setup for full notarisation:
# 1. Find your signing identity
security find-identity -v -p codesigning
# 2. Store notarytool credentials in the keychain
xcrun notarytool store-credentials "WhatCable-notary" \
--apple-id "you@example.com" \
--team-id "ABCDE12345" \
--password "<app-specific-password>" # generate at appleid.apple.com
# 3. Create your .env from the template
cp .env.example .env
# ...and fill in DEVELOPER_ID
@abrauchli built a Rust port for Linux called usbeehive. Install it with cargo install usbeehive. It reads from the kernel's typec sysfs interface rather than IOKit, so it's an independent implementation rather than a fork. It started life as a whatcable crate on crates.io before being renamed to avoid confusion with this repo. He's also working on usbee, a GNOME UI for it (early stage, but the basics work).
WhatCable reads USB-C port state directly from IOKit on your Mac. All of that happens locally. Nothing is sent anywhere automatically.
Cable reports: If you use the "Report this cable" button on an e-marked cable, WhatCable builds a pre-filled GitHub issue containing the cable's vendor ID, product ID, and capability flags (VDOs). Your browser opens with that data in the issue form. Nothing is submitted until you click the button in GitHub yourself. Once submitted, the issue is public.
Update checks: WhatCable periodically checks the GitHub Releases API to see if a newer version is available. No personal data or hardware info is included in that request.
Diagnostic data: Settings has an opt-in Contribute Diagnostic Data button. When you press it, WhatCable collects anonymised USB-C port and power IOKit details from your Mac and submits them to help improve hardware coverage. It only runs when you click it; nothing is collected or sent unless you choose to.
Issues and PRs welcome. The code is small and tries to stay readable.
Where to start:
| Module | Role |
|---|---|
Sources/WhatCable/ | Main menu bar app UI (SwiftUI popover, settings, notifications) |
Sources/WhatCableCore/ | Shared diagnostic logic, PD bit decoding, text formatting |
Sources/WhatCableDarwinBackend/ | IOKit watchers (port state, PD identity, power sources, USB devices, Thunderbolt fabric) |
Sources/WhatCableAppKit/ | Plugin registry and extension points (hooks for Pro features, CLI commands, menu items) |
Sources/WhatCablePlugins/ | Pro features (power metering, licence, cable and display diagnostics, liquid detection) |
Sources/WhatCableWidget/ | WidgetKit extension (small/medium/large desktop widgets) |
Sources/WhatCableCLI/ | CLI binary, shares Core/Backend/Plugins with the app |
Read TRANSLATIONS.md first: it covers the terminology policy (technical labels stay in English) and which languages have an active maintainer who reviews changes.
WhatCable uses .lproj/.strings files for localisation. Each module (WhatCable and WhatCableCore) has its own set under Sources/<module>/Resources/<lang>.lproj/Localizable.strings.
To add a new language:
en.lproj/Localizable.strings from both modules into a new <lang>.lproj/ directory%@, %lld, %1$@, etc.) match the English originals exactlyplutil -lint on your files to check for syntax errorsen.lproj/Localizable.stringsdict in the WhatCable module and translate the one/few/many/other formsCFBundleLocalizations in scripts/smoke-test.shThe Settings language picker builds itself from the bundled .lproj resources, so a new language appears there automatically once the files are in place.
The single most helpful thing you can do is hit Contribute Diagnostic Data in Settings. It runs a short set of C probes that gather anonymised port and power data from your Mac, then submits the results. The whole process takes a few seconds, nothing is sent without your explicit click, and no personal information is included.
More device data means better hardware coverage, fewer edge-case bugs, and more accurate diagnostics for everyone. If you have unusual hardware (docks, hubs, TB5 gear, high-wattage chargers), your report is especially valuable.
Cable reports are also very welcome. If you have an e-marked cable, use the "Report this cable" button in the app (or whatcable --report from the CLI) to submit its fingerprint. These reports build the bundled cable database so WhatCable can show brand and model info for known cables. Every report you submit helps other users identify their cables at a glance.
Built by Darryl Morley.
Contributors:
Sponsors:
Thanks to everyone who has filed cable reports, bug reports, and IOKit dumps. These contributions directly improve the cable database and help WhatCable handle more hardware correctly.
Inspired by every time someone has asked "is this cable any good?".
“USB-C cables can be a mess. One cable charges at 5W, another does 100W and Thunderbolt 4, and they look identical in the drawer. WhatCable sits in your menu bar and reads the cable data your Mac already has access to. Pl…”
“[Feature] Is a windows version possible — What's the problem? Windows compatibility What would you like to see? I saw "Cross-platform Swift build now runs on Windows (non-blocking while a Swift 6.0.3 toolchain issue is r…”
“WhatCable 1.0 – USB-C cable inspector for macOS, now with a TUI”
“> https://github.com/darrylmorley/whatcable This was on show hn only yesterday. Probably can't tell you anything about the other end of the cable though. > Is this hard to do or just something normal people never care ab…”
“Wontfix for Intel Macbooks: https://github.com/darrylmorley/whatcable/issues/12 Seems the Intel southbridge isn't known to expose the needed info.”
“Props to @sleepingNomad here, who has done 16 releases in the last 7 hours, incorporating feedback from HN on the fly! * Don't like menubar apps? you you can run it as a normal app * Don't like GUIs? Now you can run it o…”
“WhatCable makes sense of USB-C cable confusion - Houston Chronicle — Houston Chronicle”
“WhatCable tells you what that USB-C cable is good for - Boing Boing — Boing Boing”
Mobile
Hi there! I'm Farza, the guy that made Clicky. The existing codebase remains open source. Tinker with it, make it yours, start a company out of it, do whatever you want I don't mind. But, for all the new stuff I'm hacking on, gonna keep it private. To get the latest Clicky, you can go here. Go crazy with this repo!! It's an MIT license.
Mobile
Pixel-perfect skeleton loading screens, extracted from your real UI. No manual measurement, no hand-tuned placeholders. Works with React, Preact, Vue, Svelte 5, Angular, and React Native. import { Skeleton } from 'boneyard-js/react'
Mobile
Production-grade React Native ink primitives extracted from the MathNotes canvas. @mathnotes/mobile-ink is an iOS-first native drawing engine for React Native apps. It gives you Apple Pencil input, Skia/Metal rendering, stroke serialization, selection, zoom, momentum scrolling, and a continuous notebook surface backed by a fixed native engine pool. Mobile Ink is young, but the goal is serious: make high-quality mobile ink available to every React Native team that needs it. If you try the package, report a bug, improve docs, test it on a real device, suggest an API shape, or think through a native rendering problem with us, thank you. Notes-app canvases are full of sharp edges, and thoughtful feedback from people building real apps is one of
Mobile
A handwriting-first notebook for Android, built for pen and stylus Both channels ship the same signed APK. F-Droid rebuilds from source and verifies it against the GitHub release, so you can switch between them without reinstalling. Requires JDK 17 (the project pins Java 17):