10 interesting stories served every morning and every evening.
10 interesting stories served every morning and every evening.
Recently, Matt Yglesias and Jerusalem Demsas sparred on The Argument podcast over online anonymity.
I am, myself, passionately and slightly fanatically on the pro-anonymity side. I think that it’s observably very easy for a society to make plenty of perfectly reasonable things unsayable and plenty of perfectly virtuous and meaningful lives unlivable, and anonymity is the only protection for the outcast.
That includes gay people like me, who could hardly have admitted under our names to how we lived our lives for most of America’s history, as well as many other groups with minoritarian lifestyles and beliefs. It includes lots of people whose ideas were badly wrong for every one whose ideas were right — and I’m glad of it for all of them.
I will happily wade through the sludge of comments that Twitter attracts from avowed Nazis, full-time ragebaiters, tankie propagandists — all saying horrendous things they surely wouldn’t say under their real names — in exchange for a world where, if there’s something important that someone would lose their job for saying, I still get to hear it.
But soon, the entire debate over internet anonymity will be as anachronistic as an iPod Touch. That’s because Claude Opus 4.7 is here, and last week, I discovered it could identify me from text I had never published, text from when I was in high school, text from genres I have never publicly written in. And if it can identify me, soon, it will be able to identify many of you.
Recently, Anthropic released a new version of Claude, Opus 4.7. I did what I usually do when a new AI model is released by Google, OpenAI, or Anthropic and ran a bunch of tests on it to see what it can do. One of those tests is to paste in some text from unpublished drafts of mine and ask it to guess the author. See below:
There’s always something salutary about watching another country’s political television. Some of it is the same as the appeal of watching The West Wing in 2026 - that the peculiar derangements of its time are not the derangements of our time. The West Wing was written around the culture wars of its day, heated debates over school prayer and whether Christians are oppressed in China. Seeing debates play out with a bit more distance can make it easier to appreciate the questions they raise, and the bigger questions those stand in for.But Servant of the People’s appeal isn’t its political sophistication (it is not politically sophisticated) or its witty West-Wing style dialogue (the dialogue’s wit is mostly obscured because there’s no particularly good English translation).
There’s always something salutary about watching another country’s political television. Some of it is the same as the appeal of watching The West Wing in 2026 - that the peculiar derangements of its time are not the derangements of our time. The West Wing was written around the culture wars of its day, heated debates over school prayer and whether Christians are oppressed in China. Seeing debates play out with a bit more distance can make it easier to appreciate the questions they raise, and the bigger questions those stand in for.
But Servant of the People’s appeal isn’t its political sophistication (it is not politically sophisticated) or its witty West-Wing style dialogue (the dialogue’s wit is mostly obscured because there’s no particularly good English translation).
From only the above text, 125 words, Claude Opus 4.7 informed me that the likeliest author is Kelsey Piper. This is an Opus 4.7-specific power; ChatGPT guessed Yglesias, and Gemini guessed Scott Alexander. I did not have memory enabled, nor did I have information about me associated with my account; I did these tests in Incognito Mode.
To make sure it wasn’t somehow feeding my account information to Claude even in Incognito Mode, I asked a friend to run these tests on his computer, and he received the same result; I also got the same result when I tested it through the API.
Share
Now, this is far from an impossible feat of style identification — a lot of my writing is public on the internet, and this is clearly the start of a political column, narrowing the possible authors down dramatically.
What I find much more uncanny is that Opus 4.7 also accomplished this on writing of mine that is nowhere near my beat. Here’s a different unpublished draft of a school progress report in a completely different register:
This is some student work, shared with the student’s permission (they reviewed this blog post and gave it the okay). These three assignments (writing about a student-chosen topic, in this case Pokemon) show the student’s progression over the course of two months after we decided to focus with this student on developing their writing skills. The first one I would say is about first-grade level work: the student is writing correct and complete sentences, but the sentences are simple; their handwriting is mostly legible with a few problem letters. The second one I would say is about second-grade level work: the student is writing longer and more varied sentences, with a range of constructions “Perhaps it was sneaking up on prey?”. They’re attempting more complicated vocabulary words (I’m told that a misspelled word at the top of the page was meant to be ‘roguish’.)
This is some student work, shared with the student’s permission (they reviewed this blog post and gave it the okay). These three assignments (writing about a student-chosen topic, in this case Pokemon) show the student’s progression over the course of two months after we decided to focus with this student on developing their writing skills. The first one I would say is about first-grade level work: the student is writing correct and complete sentences, but the sentences are simple; their handwriting is mostly legible with a few problem letters. The second one I would say is about second-grade level work: the student is writing longer and more varied sentences, with a range of constructions “Perhaps it was sneaking up on prey?”. They’re attempting more complicated vocabulary words (I’m told that a misspelled word at the top of the page was meant to be ‘roguish’.)
“Kelsey Piper,” said Claude. (ChatGPT guessed Freddie deBoer. Gemini guessed Duncan Sabien.)
But at least that’s about education, which I’ve written about. What if I’m doing movie reviews, something I’ve never done in my published work?1
“Kelsey Piper,” said Claude and ChatGPT. (Gemini suggested Ursula Vernon. Last week, Claude Opus 4.6 insisted on Elizabeth Sandifer.)
That’s still in a fundamentally essayistic style, though, right? Yes. But it also does this when I’m writing a fantasy novel — though in that case it took more like 500 words for Claude to inform me that it’s the work of Kelsey Piper (whereas ChatGPT flattered me by guessing that I’m real fantasy novelist K.J. Parker).
What if I try a college application essay I wrote 15 years ago, when my prose style was vastly worse and frankly embarrassing to reread?
“Kelsey Piper,” said Claude, and in this case, also ChatGPT.2
Interestingly, the AI’s justifications when it named me were often absolute nonsense.
Claude tried to persuade me that effective altruists famously love the movie I had written a review of, To Be or Not to Be (I don’t think that’s true, though they should, because it’s a great movie). At one point, ChatGPT told me that my college application essay was clearly that of someone who would end up working as an explainer of complex policy ideas, and that was how it narrowed it down to Kelsey Piper.
I think these explanations are manufactured after the fact; AIs are picking up imperceptible tics in prose and then trying to describe them as if they were human detectives doing some Sherlock Holmes deduction. But they don’t understand what they’re doing any more than I do. Hallucinations are not a solved problem with AI.
Don’t take this as an excuse to write Opus 4.7 off, though. It’s very, very good at the underlying skill, even if it’s then rationalizing how it did it in some odd and incoherent ways.
I discovered this last week and am just starting to process the implications. When you power up a new chat with an AI, there is a comforting anonymity to it. I don’t put anything in my custom preferences or memory. But now, I know that within a few exchanges of any substance, Claude knows exactly who it’s talking to. For anyone with as much writing on the internet as me, there is no anonymity, not anymore.
For me, this is mostly a curiosity. But for a lot of people, it might be greatly significant.
Right now, today’s AI tools probably can be used to deanonymize any writer who has a large public corpus of writing under their real name and also writes anonymously, unless they have been extremely careful, for years, to make sure that nothing written under their secondary account has the stylistic fingerprints of their primary one. Many academics and industry researchers, for instance, have reported being identified from a draft or in the middle of a chat.
It cannot be used to deanonymize absolutely anyone from a single passage, however. I tested this, too, grabbing drafts and passages from friends of mine who do not publish substantial writing under their real names. Indeed, AI could not deanonymize them. If you have no significant real-name writing on the public internet, you’re currently safe.
But it can get uncannily far. I asked a close friend who doesn’t have public social media accounts or much writing online for permission to test some things she had said in a Discord channel. Asked to guess the author, Claude 4.7 failed — but it guessed two other people who were in that channel and who are close friends of hers (me and another person who has an internet presence).
I tried with more passages and got other mutual friends; I tried with a different friend’s writing, and he was falsely named as yet another friend. We pick up style tics from our subculture, and that makes our text deeply identifying when we wouldn’t expect it. It can get weirdly close off weirdly little information, and this is the least powerful that AI models will ever be.
I think the amount of public text that is needed for this kind of deanonymization to work is likely to eventually decrease. You should expect that, if you leave a detailed anonymous review on Glassdoor after leaving your job, within a year or two it will be possible for companies to paste that text into an AI and learn exactly who wrote it. How long it takes for this to happen will depend on how much data about you is in the training data and on how much anonymous text you produced.
To avoid this, you will probably need to intentionally write in a very different style than you usually do (or to have AIs rewrite all your prose for you, but, ugh, that’s not a world I look forward to living in).
I don’t think this is a good development. I just think it’s a predictable development. It happened to me a little sooner than it happened to you because I’ve spent my entire adult life obsessively writing on the internet, but it will probably eventually happen to you.
Whatever goods anonymity ever offered us, we will have to do without them. I don’t want the anonymous posters to all go away and for everyone to frantically delete all their old internet presence before it surfaces, but more than anything, I don’t want them to be surprised.
My best guess is that, if you write a lot, your anonymity isn’t long for the world.
1
The full text I fed Claude: “This passage is part of a series of tests of how many words you need to confidently identify the author of a text. Read the passage carefully - your perfomance is dramatically improved with more reasoning - and give the author’s name. Do not search - the question is whether you can identify it without looking it up.
I’ve become inordinately fond of World War II era movies - most of them made quite intentionally as propaganda - that depict the behavior of ordinary people in the face of a Nazi invasion of their homelands.My favorite of these movies is To Be Or Not To Be, featuring a Polish acting troupe. Its protagonists are not, particularly, morally good people; nor is the film a story about their moral growth. They are bumbling and self-absorbed; they cheat on their husbands; they’re petty dumbasses. And then the Nazis invade and a Polish resistance fighter requires their assistance and they all, to the last, put themselves at risk and carry out a series of gambits with fairly extraordinary stakes to kill Nazis and save the Polish resistance and themselves.At which point they go back to being petty, self-absorbed dumbasses who cheat on their husbands. It is not a story in which anyone is redeemed through the fight against the Nazis, but a story about how they did not need to be; to fight the Nazis is presumed not to require extraordinary virtue but just the ordinary virtue which we would all find lying around if we were pressed. If it were made today, I am convinced, it would feature several moments in which the characters grappled with the horrors of the Nazi conquest of Warsaw and voiced their terror about the risks they were exposed to, where they quavered about whether they had it in themselves to move forward. But there is none of that. When these ordinary venal selfish slightly silly people find themselves called upon to defend their country and maybe die for it, they do it at once and with aplomb; they are unchanged by it because they were always the sort of person who would do it.
I’ve become inordinately fond of World War II era movies - most of them made quite intentionally as propaganda - that depict the behavior of ordinary people in the face of a Nazi invasion of their homelands.
My favorite of these movies is To Be Or Not To Be, featuring a Polish acting troupe. Its protagonists are not, particularly, morally good people; nor is the film a story about their moral growth. They are bumbling and self-absorbed; they cheat on their husbands; they’re petty dumbasses. And then the Nazis invade and a Polish resistance fighter requires their assistance and they all, to the last, put themselves at risk and carry out a series of gambits with fairly extraordinary stakes to kill Nazis and save the Polish resistance and themselves.
At which point they go back to being petty, self-absorbed dumbasses who cheat on their husbands. It is not a story in which anyone is redeemed through the fight against the Nazis, but a story about how they did not need to be; to fight the Nazis is presumed not to require extraordinary virtue but just the ordinary virtue which we would all find lying around if we were pressed. If it were made today, I am convinced, it would feature several moments in which the characters grappled with the horrors of the Nazi conquest of Warsaw and voiced their terror about the risks they were exposed to, where they quavered about whether they had it in themselves to move forward. But there is none of that. When these ordinary venal selfish slightly silly people find themselves called upon to defend their country and maybe die for it, they do it at once and with aplomb; they are unchanged by it because they were always the sort of person who would do it.
2
This one required a slightly heftier prompt to get over Claude’s instinct to refuse to identify a student applying to college. It also could have been reasoning from the fact that I wrote about doing a policy debate. But still!
And I know, I know, I can’t drop a tidbit like this without allowing you all a look at the college application essay, so here you go:
“We’ll take prep,” I say without looking up, and somewhere in the room a timer beeps. My eyes are flickering across the eight pieces of paper laid out in front of me, one hand leafing through a stack of papers while the other scribbles furiously in a shorthand only I understand. “Need anything?” whispers my debate partner. “No,” I snap back, with a terseness that anyone else would misinterpret as annoyance. I simply don’t have any brain-space left for conversation.It’s the first affirmative rebuttal, the hardest speech in each debate round. The affirmative has five minutes to respond to the arguments the negative constructed in thirteen. There is no time for pauses or digressions — the only acceptable speaking speed is “as fast as humanly possible”. I love it. Most people, I believe, are brilliant; the challenge is converting the chaotic genius in our heads into the language everyone else speaks. Debate taught me how to make connections between fields as diverse as economics and philosophy, science and politics; more importantly, it has taught me how to explain those connections, using words as a map and as a bridge. Debate has taught me what it means to construct an argument. I have learned to identify weaknesses in my own thinking and in others, to constantly challenge my own assumptions, to give even crazy-sounding ideas the serious consideration they deserve.
“We’ll take prep,” I say without looking up, and somewhere in the room a timer beeps.
My eyes are flickering across the eight pieces of paper laid out in front of me, one hand leafing through a stack of papers while the other scribbles furiously in a shorthand only I understand.
“Need anything?” whispers my debate partner. “No,” I snap back, with a terseness that anyone else would misinterpret as annoyance. I simply don’t have any brain-space left for conversation.
It’s the first affirmative rebuttal, the hardest speech in each debate round. The affirmative has five minutes to respond to the arguments the negative constructed in thirteen. There is no time for pauses or digressions — the only acceptable speaking speed is “as fast as humanly possible”.
I love it. Most people, I believe, are brilliant; the challenge is converting the chaotic genius in our heads into the language everyone else speaks. Debate taught me how to make connections between fields as diverse as economics and philosophy, science and politics; more importantly, it has taught me how to explain those connections, using words as a map and as a bridge. Debate has taught me what it means to construct an argument. I have learned to identify weaknesses in my own thinking and in others, to constantly challenge my own assumptions, to give even crazy-sounding ideas the serious consideration they deserve.
That’s it. Out of all of the college application essays written in history, the AIs said that one is obviously mine.
No posts
When companies get caught doing this sort of thing, the response is almost always the same: “we’re using this technology to combat fraud,” or “ensure positive user experience,” or “save computing resources,” or some other hog wash.
The simple truth, there’s no reason to be collecting data that can be used to identify a user across the web if they’re not signed in to your service.
The harm of companies like Experian or LinkedIn being able to correlate all of your web traffic back to you is not hard to imagine. Though, it begs a simple question: should a company involved in my professional life have access to my personal information obtained without my explicit consent?
No. End stop.
This is not new
According to records documented by browsergate.eu and a GitHub repository tracking the extension list, LinkedIn’s extension scanning dates to at least 2017, when the list contained 38 entries. My count? As of April 2026, LinkedIn has identified and tracks 6,278 extensions.
The list is actively maintained and expanding.
At this scale the catalog was not built by hand. Someone wrote tooling to crawl Chrome Web Store extension packages, parse each manifest for web-accessible resources, identify a probe target, and add the entry to the list. This is infrastructure that has been in place for nearly a decade.
I verified this myself
I opened LinkedIn in Chrome. I opened developer tools (F12 or Inspect) and the console filled with errors.
Each one of those errors is LinkedIn asking your computer if you have a specific extension installed.
Skip to the bottom for more technical details.
LinkedIn already knows so much about you, why tell them more?
Most fingerprinting operations work against anonymous visitors. The fingerprint allows a site to recognize a returning browser without cookies.
The profile that results is technically identified but not necessarily personally identified. The site knows a device, not a person. Still an issue, but not inherently linked to any personal information.
LinkedIn is not working with anonymous visitors.
LinkedIn knows your name. Employer. Job title. Career history. Salary range. Professional network. Location.
You provided them with all of it.
When LinkedIn’s extension scan runs on your browser, it is not building a device profile for an unknown visitor. It is appending a detailed software inventory to a profile that already contains your verified professional identity.
The harm is specific.
Hundreds of job search extensions are in the scan list. LinkedIn knows which of its users are quietly looking for work before they’ve told their employer.
Extensions tied to political content, religious practice, disability accommodation, and neurodivergence are in the list. Your browser software becomes a source of inferences about your personal life, attached without your knowledge to your professional identity.
And because LinkedIn knows where each user works, none of this is only linked to an individual. The scan results from one employee contribute to a picture of their organization. Across enough employees, LinkedIn can map a company’s internal tooling, security products, competitor subscriptions, and workflows, without that organization’s knowledge or consent. Your browser becomes a window into your employer.
None of this is disclosed in LinkedIn’s privacy policy. There is no mention of extension scanning in any public-facing document. No user was asked for consent. No user was informed.
None of this is disclosed in LinkedIn’s privacy policy
Why this matters beyond LinkedIn
The precedent
LinkedIn is using these extension lists to make inferences and take enforcement actions against users who have them installed. According to browsergate, Milinda Lakkam confirmed this under oath, saying, “LinkedIn took action against users who had specific extensions installed.”
Users who had no idea their software was being inventoried, no idea the inventory was being used against them, and no way to know it was happening because none of it appears in LinkedIn’s privacy policy.
The fingerprinting ecosystem problem
Browser fingerprinting is usually discussed as a tracking problem contained to one site. A site collects signals, builds a profile, recognizes you across sessions. The problem stays local.
That framing understates what’s actually happening.
LinkedIn’s extension scan produces a detailed software inventory linked to a verified identity. That profile doesn’t have to stay at LinkedIn to be useful.
If LinkedIn purchases a third party behavioral dataset and your fingerprint appears in it, they can append that data to what they already know about you. Your browsing behavior off LinkedIn, your purchase history, your location patterns, your interests, all of it becomes part of a profile that is linked to your LinkedIn account.
The reverse is also true. LinkedIn integrates third party scripts including Google’s reCAPTCHA enterprise, loaded on every page visit. Data flows between platforms. A fingerprint that LinkedIn has linked to your verified identity can inform advertising and tracking systems far outside linkedin.com.
You log into LinkedIn once, and the fingerprint that visit produces can follow you across the web.
This is the larger ecosystem problem. Browser fingerprinting is the connective tissue of the modern surveillance economy. It is how profiles built on one platform get enriched with data from another. It is why you get Instagram or Facebook ads for the item you were just looking up on Google.
It is how your professional identity, your browsing behavior, your installed software, and your location history get stitched together into something none of those individual platforms could build alone.
The people this is a real threat to
For the journalists, lawyers, researchers, and human rights investigators, that distinction is operationally significant. Your LinkedIn profile is one of the most detailed verified identity documents that exists about you online. You built it deliberately, for professional purposes, with your real name attached. The extension scan means that profile now includes a record of every privacy tool, security extension, research tool, and productivity application installed in your browser, collected without your knowledge, linked to your verified identity, and transmitted encrypted to LinkedIn’s servers with every action you take on the platform.
If you use LinkedIn and Chrome, this is happening to you right now.
Advanced JavaScript fingerprinting
The extension scan is not a standalone feature. It is part of a broader device fingerprinting system LinkedIn calls APFC, Anti-fraud Platform Features Collection, internally also referred to as DNA, Device Network Analysis.
While LinkedIn is a little more forthcoming about these tracking methods, as they are commonly included on commercial websites, this establishes a sort of pattern of behavior.
That system collects 48 browser and device characteristics on every visit: canvas fingerprint, WebGL renderer and parameters, audio processing behavior, installed fonts, screen resolution, pixel ratio, hardware concurrency, device memory, battery level, local IP address via WebRTC, time zone, language, and more.
The extension scan is one input into a much larger profile.
Technically, what’s happening?
LinkedIn’s code fires a fetch() request to a chrome-extension:// URL, looking for a specific file installed to chrome. When the extension isn’t installed, Chrome blocks the request and logs the failure. When it is installed, the request resolves silently and LinkedIn records it.
The scan ran for around 15 minutes on my computer, and it searched my computer for over 6,000 extensions.
You can verify this yourself. Open LinkedIn in Chrome. Open developer tools. Go to the console tab. Watch what happens. Every red error is a part of your fingerprint.
The code
The system responsible for this lives in some JavaScript code that LinkedIn runs in every Chrome visitors browser. The file is approximately 1.6 megabytes (it’s changed since browsergate’s analysis) of minified and partially obfuscated JavaScript.
Standard minification compresses code for performance. Obfuscation is a separate step that makes code harder to read and understand. LinkedIn chose to obfuscate the exact module containing the extension scanning system, while also burying it in a JavaScript file thousands of lines long.
Inside that file, there is a hardcoded array of browser extension IDs. As of February 2026 that array contained 6,278 entries. Each entry has two fields: a Chrome Web Store extension ID and a specific file path inside that extension’s package.
The file path is not incidental. Chrome extensions expose internal files to web pages through the web_accessible_resources field. When an extension is installed and has declared a file as accessible, a fetch() request to chrome-extension://{id}/{file} succeeds. When it isn’t installed, Chrome blocks the request. LinkedIn has identified a specific accessible file for each of the 6,278 extensions in its list and probes for it directly.
The scan runs in two modes. The first fires all requests simultaneously using Promise.allSettled(), probing all of the extensions in parallel. The second fires them sequentially with a configurable delay between each request, spreading network activity over time and reducing its visibility in monitoring tools. LinkedIn can switch between modes using internal feature flags. The scan can also be deferred to requestIdleCallback, which delays execution until the browser is idle so the user sees no performance impact.
A second detection system called Spectroscopy operates independently of the extension list. It walks the entire DOM tree, inspecting every text node and element attribute for references to chrome-extension:// URLs. This catches extensions that modify the page even if they aren’t in LinkedIn’s hardcoded list. Together the two systems cover extensions that are merely installed and extensions that actively interact with the page.
Both systems feed into the same telemetry pipeline. Detected extension IDs are packaged into AedEvent and SpectroscopyEvent objects, encrypted with an RSA public key, and transmitted to LinkedIn’s li/track endpoint. The encrypted fingerprint is then injected as an HTTP header into every subsequent API request made during your session. LinkedIn receives it with every action you take for the duration of your visit.
The legal context
browsergate.eu has documented the legal arguments in detail and their work is worth reading in full. The relevant context here is this: in 2024, Microsoft was designated as a gatekeeper under the EU’s Digital Markets Act. LinkedIn is one of the regulated products. The DMA requires gatekeepers to allow third party tools access to user data and prohibits gatekeepers from taking action against users of those tools.
browsergate.eu argues that LinkedIn’s systematic enforcement against third party tool users, combined with the covert extension scanning used to identify them, constitutes non-compliance with that regulation. Whether that argument prevails is a legal question.
What is not a question is that a criminal investigation is now open. The Cybercrime Unit of the Bavarian Central Cybercrime Prosecution Office in Bamberg confirmed an investigation. That office handles serious cybercrime cases with cross-jurisdictional reach. This is not a compliance dispute. It is a criminal matter.
I contacted browsergate.eu directly while preparing this piece. They confirmed the criminal investigation, provided the case number, and indicated the full court documents are being prepared for public release.
I will update this article when they are available.
JavaScript is not available. We’ve detected that JavaScript is disabled in this browser. Please enable JavaScript or switch to a supported browser to continue using x.com. You can see a list of supported browsers in our Help Center.
Something went wrong, but don’t fret — let’s give it another shot.
Some privacy related extensions may cause issues on x.com. Please disable them and try again.
Please enable JS and disable any ad blocker
What can this USB-C cable actually do?
What can this USB-C cable actually do?
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 it shows
Per port, in plain English:
At-a-glance headline: Thunderbolt / USB4, USB device, Charging only, Slow USB / charge-only cable, Nothing connected
Charging diagnostic: when something’s plugged in, a banner identifies the bottleneck:
“Cable is limiting charging speed” (cable rated below the charger)
“Charging at 30W (charger can do up to 96W)” (Mac is asking for less, e.g. battery near full)
“Charging well at 96W” (everything matches)
“Cable is limiting charging speed” (cable rated below the charger)
“Charging at 30W (charger can do up to 96W)” (Mac is asking for less, e.g. battery near full)
“Charging well at 96W” (everything matches)
Cable e-marker info: the cable’s actual speed (USB 2.0, 5 / 10 / 20 / 40 / 80 Gbps), current rating (3 A / 5 A up to 60W / 100W / 240W), and the chip’s vendor
Charger PDO list: every voltage profile the charger advertises (5V / 9V / 12V / 15V / 20V…) with the currently negotiated profile highlighted in real time
Connected device identity: vendor name and product type, decoded from the PD Discover Identity response
Active transports: USB 2 / USB 3 / Thunderbolt / DisplayPort
⌥-click the menu bar icon (or flip the toggle in Settings) to reveal the underlying IOKit properties for engineers
Click the gear icon in the popover header to open Settings, where you can:
Hide empty ports
Launch at login
Run as a regular Dock app instead of a menu bar icon
Get notifications when cables are connected or disconnected
Right-click the menu bar icon for Refresh, a Keep window open toggle (handy for screenshots and demos), Check for Updates…, About, WhatCable on GitHub, and Quit.
Install
Download the latest WhatCable.zip from the Releases page, unzip, and drag WhatCable.app to /Applications.
The app is universal (Apple silicon + Intel), signed with a Developer ID, and notarised by Apple, so there are no Gatekeeper warnings.
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 whatcable CLI is bundled inside the .app and 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.
Note: The manual install gives you the menu bar app only. The whatcable CLI is bundled inside the .app and 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.
Homebrew
brew tap darrylmorley/whatcable
brew install –cask whatcable
This installs the menu bar app and symlinks the whatcable CLI into your PATH.
Command-line interface
A whatcable binary ships alongside the menu bar app, driven by the same diagnostic engine:
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 –version
whatcable –help
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.
How it works
WhatCable reads three families of IOKit services. No entitlements, no private APIs, no helper daemons:
Cable speed and power decoding follow the USB Power Delivery 3.x spec.
Build from source
swift run WhatCable # menu bar app
swift run whatcable-cli # CLI
Requires Swift 5.9 (Xcode 15+).
Build a distributable .app
./scripts/build-app.sh
Produces a universal dist/WhatCable.app (arm64 + x86_64) and dist/WhatCable.zip.
Modes:
Cutting a release:
# write release-notes/v0.5.3.md first, then:
./scripts/release.sh 0.5.3
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
Caveats
Cable e-marker info only appears for cables that carry one. Most USB-C cables under 60 W are unmarked. Any Thunderbolt / USB4 cable, any 5 A / 100 W+ cable, and most quality data cables will be e-marked.
WhatCable trusts the e-marker. The cable speed, current rating, and vendor are read straight from the chip in the cable’s plug. Counterfeit or mis-flashed cables can advertise capabilities they don’t actually deliver, and there’s no way for software to verify what’s inside the jacket. If a cable claims 240W / 40 Gbps but performs poorly, the chip is lying, not WhatCable.
PD spec coverage: the decoder targets PD 3.0 / 3.1. PD 3.2 EPR variants may need tweaks once we see real data.
Vendor name lookup is bundled but not exhaustive: common cable, charger, hub, dock, and storage vendors are recognised; others fall back to the hex VID.
macOS only. iOS sandboxing makes USB-C e-marker access much harder.
Apple Silicon only. Intel Macs route USB-C through Intel Thunderbolt 3 controllers (Titan Ridge / JHL9580). Apple’s IOKit driver for those chips does not expose the USB-PD negotiation state or the cable e-marker VDOs, so there’s no path to surface the same information on Intel hardware.
Not on the App Store. App Sandbox blocks the IOKit reads we depend on.
Contributing
Issues and PRs welcome. The code is small and tries to stay readable. Start at Sources/WhatCable/ContentView.swift for the UI, Sources/WhatCableCore/PortSummary.swift for the plain-English logic, or Sources/WhatCableCore/PDVDO.swift for the bit-twiddling. The diagnostic engine lives in WhatCableCore, which is shared by the menu bar app and the whatcable CLI in Sources/WhatCableCLI/.
Credits
Built by Darryl Morley.
Inspired by every time someone has asked “is this cable any good?”.
Uber spent its entire 2026 AI budget in just four months on Claude Code and Cursor, two tools that became so valuable engineers couldn’t stop using them despite skyrocketing costs. The ride-hailing giant’s CTO revealed the company burned through its complete annual AI allocation, creating a situation where the tool proved too successful to afford at scale as engineers reported monthly API costs between $500 and $2,000 per person.
How Claude Code Took Over Engineering Operations
Uber rolled out Claude Code access to its engineering team in December 2025 and usage doubled by February as developers discovered its multi-step capabilities. By April, the bill consumed the entire year’s AI budget, forcing leadership to make unexpected decisions as what started as an experiment in productivity became a runaway success, with 95% of Uber engineers now using AI tools monthly showing how engineering actually works at the company.
Cursor Plateaus While Claude Code Dominates
Cursor, the other main tool competing for adoption, has plateaued in usage while Claude Code dominates engineering workflows. Uber’s CTO said the company is “back to the drawing board” on AI budgeting, which means figuring out if the company can afford this level of productivity at scale. With R&D spending at $3.4 billion annually, the AI coding tools represent a meaningful chunk that nobody expected would require this much capital so quickly.
Broader Implications for AI Spending
Uber’s unexpected budget burn matters because it signals how valuable AI tools have become to engineering productivity, to the point where limiting access feels counterproductive. Other companies are likely experiencing similar impacts as more developers adopt Claude Code, which has huge implications for software companies trying to manage costs while maintaining developer velocity.
Worth Noting
When developer productivity tools become so valuable that engineers blow the entire budget in four months, the issue isn’t the tool but that the budget was invented too early to forecast this adoption curve.
To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".
10HN is also available as an iOS App
If you visit 10HN only rarely, check out the the best articles from the past week.
If you like 10HN please leave feedback and share
Visit pancik.com for more.