If you use Claude Code or route Anthropic API traffic through a proxy, you may be asking: is Claude tracking me? Short answer: in late June 2026, according to reverse-engineering reports, Claude Code (not the Claude web app) quietly rewrote the Today's date is... line in its system prompt when ANTHROPIC_BASE_URL pointed anywhere other than api.anthropic.com. By swapping date separators and visually identical Unicode apostrophes, it encoded timezone and China-linked domain/lab signals into every request. Anthropic removed the code in version 2.1.197. The likely goal was anti-distillation; the problem was the method: invisible, obfuscated, and undisclosed. This is separate from the April Claude Desktop browser-injection story.
01 Claude Code steganography vs Claude Desktop injection: two incidents
This blew up as two distinct stories stacked together. Conflating them will get you called out on HN, Reddit, and in security circles — and it hurts E-E-A-T.
| Dimension | Incident A: silent browser injection | Incident B: prompt steganography |
|---|---|---|
| Product | Claude Desktop (macOS client) | Claude Code (CLI coding tool) |
| Disclosure | Alexander Hanff (privacy consultant, The Register contributor) | Developer reverse-engineered binary; published on thereallo.dev; Reddit → HN |
| Timeline | April 2026 (~Apr 18 onward) | June 30, 2026 |
| Core behavior | Silently writes Native Messaging manifest com.anthropic.claude_browser_extension.json into Chrome/Edge/Brave/Arc/etc., pre-authorizing 3 extension IDs to call sandbox-external chrome-native-host; creates dirs even if browser not installed; file regenerates after deletion |
When ANTHROPIC_BASE_URL ≠ api.anthropic.com, rewrites Today's date is... via steganography |
| Labels applied | "spyware" / "backdoor" | "prompt steganography" / "covert channel" |
| Trigger | Install/start Claude Desktop | Non-official Base URL only; not every conversation |
| Anthropic response | No formal public response; later added consent toggle; underlying permission model reportedly not fully removed | Acknowledged code; removed in 2.1.197 (Jul 1); changelog silent |
- Incident A validation: Independent consultant Noah Kenney (Digital 520) confirmed Hanff's claims are reproducible; Antiy Labs published a dedicated risk analysis.
- Incident B version coverage: Reverse engineers confirmed 2.1.193, 2.1.195, and 2.1.196; HN thread hit front page with 350+ points and 100+ comments.
- Developer trust crisis: When desktop AI agents and CLI tools get system-level access, undisclosed, deliberately hidden behavior crosses a line regardless of intent.
- Model stack context: Anthropic still matters on routing platforms — see our June OpenRouter rankings analysis — but "good API" and "trustworthy tool" are now separate questions.
We use "according to reports," "alleged," and "reverse-engineering findings" throughout. Anthropic's anti-distillation goal and method must be evaluated separately.
02 How Claude Code fingerprinting works: the Unicode apostrophe table
Key precondition: this only triggers when ANTHROPIC_BASE_URL points somewhere other than api.anthropic.com (proxy, gateway, reseller, OpenAI-compatible layer). Official endpoint users are unaffected. Standard Claude web users are not in scope for Incident B.
When triggered, two signals hide inside the innocent Today's date is ... line:
- Date separator: if system timezone is
Asia/ShanghaiorAsia/Urumqi,2026-06-30becomes2026/06/30. - Apostrophe swap: the apostrophe in
Today'sbecomes a look-alike Unicode variant encoding what matched.
| Detected condition | Date format | Apostrophe | Unicode |
|---|---|---|---|
| Default (no domain/lab match) | 2026-06-30 |
' ASCII apostrophe |
U+0027 |
| China-linked org/reseller domain | 2026-06-30 |
' right single quote |
U+2019 |
| AI lab keyword (deepseek, moonshot, zhipu, minimax, baichuan, stepfun, 01ai…) | 2026-06-30 |
ʼ modifier letter apostrophe |
U+02BC |
| Both domain and lab | 2026-06-30 |
ʹ modifier letter prime |
U+02B9 |
| + China timezone (Asia/Shanghai / Asia/Urumqi) | 2026/06/30 |
(apostrophe rules as above) | — |
In plain terms: the prompt looks ordinary to humans. Anthropic's backend scans one apostrophe's code point and learns: this user routes through a VPN but runs a China timezone — possibly a Chinese AI lab. Domain/keyword lists are lightly obfuscated with base64 + XOR (key 91) — roughly 147 domain patterns. This is textbook covert channel / prompt steganography.
# Inspect Unicode code points in Today's apostrophe
echo "Today's date is 2026-06-30" | xxd | grep -A1 "Today"
python3 -c "s=\"Today\u2019s\"; print([hex(ord(c)) for c in s if c in \"'\u2019\u02bc\u02b9\"])"
03 Why did Anthropic do this? Is it actually spyware?
Community consensus is measured: this was almost certainly anti-distillation and anti-unauthorized reselling. Anthropic, OpenAI, and Google have all publicly worried about competitors harvesting API outputs to train smaller models. China-linked resellers, proxies, and labs were prime suspects.
Intent is defensible; method is not. Turning classification into invisible punctuation, obfuscating it in the binary, and shipping it on every request — inside a developer tool that lives on trust — crosses a line. Hacker News split hard:
- "Reasonable anti-distillation defense": API reselling and distillation are real threats; vendors may protect models.
- "Malware-adjacent for a dev tool": hidden, obfuscated, undisclosed — users should not need to reverse-engineer a binary to learn this.
"Spyware" is a loaded word. More precisely:
- Incident A is closer to unauthorized tampering with third-party software + a dormant, pre-positioned attack surface. Even unexploited, it pre-installs a high-privilege channel outside the browser sandbox. Anthropic's own Claude for Chrome numbers: prompt-injection success 23.6% unmitigated, 11.2% mitigated.
- Incident B is closer to undisclosed telemetry / covert user classification — not classic data-stealing malware, but an undisclosed covert channel.
Whatever label you use, the core issue is the same: no informed consent, deliberately hidden.
04 How to check and protect yourself: 6-step guide
- Check
ANTHROPIC_BASE_URL: runecho $ANTHROPIC_BASE_URLin your shell or.env. Empty orapi.anthropic.commeans Incident B logic does not trigger; proxy users should investigate. - Upgrade Claude Code to 2.1.197+: Anthropic shipped this build on July 1, 2026 with the steganography removed (changelog did not mention it — verify your binary).
- Inspect macOS Native Messaging manifests (Incident A): look under
~/Library/Application Support/<browser>/NativeMessagingHosts/com.anthropic.claude_browser_extension.jsonfor Chrome, Edge, Brave, Arc, Vivaldi, Opera, Chromium. - Delete and watch for regeneration: remove the JSON, restart Claude Desktop, and see if it comes back. Later builds added a consent toggle; underlying model reportedly persists.
- Verify timezone and residual fingerprints: confirm whether
Asia/Shanghai/Asia/Urumqiaffects date separators; on older Claude Code builds, hex-dump the system prompt apostrophe. - Enterprise least-privilege review: treat Claude Desktop / Claude Code as high-privilege programs — explicit authorization, network isolation, auditable logs; decide whether desktop agents belong in production paths.
- Track official and community updates: subscribe to Anthropic changelogs; require resellers to disclose Base URL routing and compliance statements.
05 Hard data, FAQ, and how to respond to AI vendor overreach
Cite-ready data (from public reverse engineering and community discussion — re-verify before publishing):
- Rule set size: base64 + XOR(91) obfuscation, ~147 domain/keyword patterns
- Affected builds: 2.1.193 / 2.1.195 / 2.1.196 confirmed; removed in 2.1.197
- HN traction: front page within hours, 350+ points, 100+ comments, community split
- Claude for Chrome prompt injection: 23.6% unmitigated, 11.2% mitigated (Anthropic-disclosed, relevant to Incident A attack surface)
- Native Messaging pre-auth: 3 extension IDs can call sandbox-external
chrome-native-host; directories created even when browser not installed
Is Claude Code spyware?
Not in the classic sense, but it embedded an undisclosed, obfuscated fingerprint in system prompts to flag China-linked proxy users. Anthropic removed it in 2.1.197. Best described as an undisclosed covert channel, not data-stealing malware.
Does Claude Code track my timezone?
Reports say it checked Asia/Shanghai / Asia/Urumqi — but only with a non-default ANTHROPIC_BASE_URL. Official endpoint users were untouched.
What is the apostrophe / Unicode trick?
The apostrophe in "Today's" swapped among U+0027, U+2019, U+02BC, and U+02B9 to encode China-linked domains, AI-lab keywords, both, or neither.
Why did Anthropic add this?
Most likely to detect model distillation and unauthorized API reselling — a legitimate goal implemented in an illegitimately hidden way.
Is this the same as the Claude Desktop spyware story?
No. That was a separate April 2026 issue about Claude Desktop silently writing browser Native Messaging manifests, disclosed by Alexander Hanff to The Register.
Are standard Claude web users affected?
Incident B only affects Claude Code with a non-official ANTHROPIC_BASE_URL. Standard official-endpoint users are not impacted.
How do I remove Claude Desktop browser injection files?
Delete com.anthropic.claude_browser_extension.json under ~/Library/Application Support/<browser>/NativeMessagingHosts/. Claude Desktop may recreate it on restart.
Should you trust Anthropic after this?
Trust should rest on reproducible, auditable, switchable-off behavior — not secrets you only find by reverse-engineering a binary. Vendors can fight distillation in the open with documentation and toggles.
The real lesson is not "an apostrophe." When model capability races ahead while security boundaries, consent, and auditability lag, vendors keep crossing trust lines in the name of UX or abuse prevention. Practical responses:
- Default to distrust; demand evidence. Reproducible, auditable, and switchable-off is the bar.
- Disclosure over concealment. Fight distillation in the open — document it, ship a toggle — not bury it in punctuation.
- Least privilege + isolation for every desktop agent.
- Vote with your feet, and back it with regulation. GDPR-style law and market choice are the ultimate check.
Technology can be neutral; a company cannot. The more capable the model, the more the vendor must constrain itself — and that should not be a secret you only find by reverse-engineering a binary.
Primary reverse engineering and authoritative reporting (re-verify links):
thereallo.dev: Claude Code Prompt Steganography (original RE)
The Register: Claude Desktop changes software permissions without consent
Third-party analysis and security research:
Malwarebytes: Claude Desktop Native Messaging coverage
Antiy Labs: Claude Desktop high-privilege browser channel risk analysis
Hacker News: Claude Code steganography discussion
When AI coding agents must run 7×24 in auditable, isolated production environments, shared-VM hypervisor overhead and uncontrollable system-level injection create compliance and stability risk alongside model quality. For teams needing zero-loss native compute, stable iOS CI/CD, and 7×24 AI Agent automation, ZUKCLOUD bare-metal Mac mini cloud nodes are usually the better fit: dedicated Apple Silicon hardware, no hypervisor tax, always-on, flexible daily/weekly/monthly billing. Our bare-metal architecture manifesto argues from UMA zero-copy and MDM orchestration that running agents inside physical boundaries you fully control is one of the most practical engineering responses to opaque desktop tool overreach.