Skip to main content

Engineering

What data leaves your machine when using Power Claude

What data leaves your machine when using Power Claude
See it stay local — Power Claude reads your accounts on your machine; your prompts never leave.

The short answer is in the heading: nothing meaningful. The full answer is what this article exists to spell out, because "trust us, it is local" is the cheapest claim in software and the most often wrong.

Power Claude is a local VS Code extension and a pc CLI. Account rotation, session monitoring, cost analytics, watchdog, Auto-Resume, Auto-Nudge, the Insight Graph — every feature operates on data that lives on your machine and stays there. The exception is the license-validation handshake with neural-llm.com, which carries a deliberately small payload, exists for the legitimate purpose of confirming you have a valid license, and is the only outbound network dependency in the entire product.

This article is the complete accounting. What gets sent, what the payload contains, what does not get sent, where everything is stored on disk, and what the user-data-doesn't-leave claim actually depends on.

The traffic path for Claude API calls

The first thing most people want to know is whether their Claude prompts go through any Neural-LLM server. They do not.

The traffic path for every Claude Code API call is:

Claude Code  →  localhost:PROXY_PORT  →  api.anthropic.com

The proxy is a local Node process that starts with the extension (or as a systemd user service on hosts that have systemd — see the v0.x changelog entry about power-claude-proxy.service). It listens on a port on 127.0.0.1. Claude Code is configured via ANTHROPIC_BASE_URL to send its API traffic there. The proxy reads the anthropic-ratelimit-* headers on the way back (so it can rotate accounts pre-emptively) and forwards every byte of the request and response between Claude Code and Anthropic without copying it anywhere else.

There is no Neural-LLM cloud relay. There is no Power Claude analytics endpoint that receives your prompts. The src/proxy/server.ts fetch target is ${upstream}${req.url} where upstream resolves to https://api.anthropic.com — not a Neural-LLM host. (For the engineering details on what the proxy does with the headers it reads, see Pre-emptive rotation.)

The one outbound network dependency

There is exactly one outbound network destination in Power Claude that is not Anthropic's API: https://neural-llm.com (or your POWER_CLAUDE_AUTH_URL if you have overridden it for dev). Four endpoints on that host are reachable from the extension:

| Endpoint | When it fires | What it does | |---|---|---| | POST /auth/activate | When you enter a license key | Verifies the key, returns a signed activation envelope | | POST /auth/heartbeat | Every ~5 minutes when activated | Keeps the JWT fresh, reports back current entitlement | | POST /auth/deactivate | When you remove the license locally | Releases the machine binding so you can re-activate elsewhere | | POST /license/proxy-bundle.php | After activation, once per version | Fetches the watermarked Pro proxy bundle (Pro tier only) |

The deactivate endpoint only fires on an explicit local removal. The proxy-bundle endpoint only fires for Pro licenses, and only when the cached bundle for the running version is missing or invalid. The activate and heartbeat endpoints are the two that matter for steady-state behavior.

What the activate payload contains

The full POST body for /auth/activate (from src/proxy/licenseGate.ts:1957):

{
  "licenseKey":  "your-license-key",
  "fingerprint": "32-hex-char machine fingerprint",
  "version":     "x.y.z",
  "codeHash":    "sha256 of the extension bundle",
  "platform":    "linux" | "darwin" | "win32",
  "nonce":       "random per-request nonce"
}

That is the complete payload. No prompts, no source code, no file paths, no Anthropic credentials, no Anthropic OAuth tokens, no email address, no account names, no usage statistics, no rate-limit headers, no session content.

The fingerprint is a SHA-256 hash of four inputs from the host machine: hostname, platform, arch, username (src/proxy/fingerprint.ts). When the extension runs inside VS Code, the fingerprint is replaced with vscode.env.machineId — the same stable identifier VS Code uses for every extension's telemetry, generated by VS Code itself, not by Power Claude. The fingerprint is used to bind a license to a machine so a stolen key cannot be activated on an arbitrary number of new boxes; it is not reversible to PII without already knowing the four inputs.

The codeHash is a SHA-256 of the extension bundle on disk. Anthropic's license server uses it as a tamper signal — it tells the server whether the running extension is an unmodified release build. It contains no user data.

The nonce is per-request randomness so a captured response cannot be replayed against a future activation.

What the heartbeat payload contains

Every five minutes, while activated, the extension sends a heartbeat (from src/proxy/licenseGate.ts:2179):

{
  "licenseKey":         "your-license-key",
  "machineFingerprint": "same fingerprint as activate",
  "token":              "the JWT from the last successful activation",
  "version":            "x.y.z",
  "codeHash":           "sha256 of the extension bundle",
  "bundleHashes":       "{ extension: sha256, proxy: sha256, cli: sha256 }",
  "debuggerAttached":   true | false,
  "obfMarker":          true | false,
  "nonce":              "random per-request nonce"
}

bundleHashes, debuggerAttached, and obfMarker are anti-tamper signals that let the server score abuse attempts (debugger attached during normal use is a strong signal that someone is trying to reverse-engineer the license check). None of them carry user data — debuggerAttached is a boolean, bundleHashes are file checksums of the install layout.

The heartbeat response is signed Ed25519 by the license server. The signature is verified locally before the response is trusted, so an MITM cannot forge a "license revoked" reply. The client verifies the nonce echoed back against the one it sent, and the server timestamp against the local clock with a two-minute freshness window, so a captured-and-replayed legitimate response also fails.

What none of these endpoints receive

Both httpsPost and httpsPostWithStatus in licenseGate.ts use a single hostname (AUTH_BASE_URL = https://neural-llm.com by default). The bodies are exactly what is shown above — there is no second path that POSTs richer data.

The values that never leave your machine, by category:

  • Claude prompts and responses. The proxy forwards them between Claude Code and api.anthropic.com. Neither endpoint above ever receives them.
  • Anthropic OAuth tokens. They live in ~/.power-claude/profiles/*.json (encrypted on Linux when keyring is available, plain JSON otherwise — same posture as Claude Code itself). They are read locally to populate the active credential at ~/.claude/.credentials.json. They are never transmitted to neural-llm.com.
  • Email addresses or account names. The license server knows the licensee identity from the licenseKey — it does not need and does not receive your Anthropic account label, your pc add profile name, or any of the other strings you might attach to a profile.
  • File paths, file contents, source code, working-tree state, or git refs. The Insight Graph reads all of these from your local repo and your local ~/.power-claude/ and ~/.claude/projects/ directories. Nothing about your codebase is in the activate or heartbeat payload.
  • Rate-limit headers, token counts, cost estimates, or session metadata. The proxy reads the anthropic-ratelimit-* headers on every response. They are written to ~/.power-claude/logs/handler.jsonl and rendered in the dashboard. They never leave the machine.
  • Watchdog event logs. ~/.power-claude/logs/watchdog.log is local-only. The watchdog detects stalled sessions and surfaces a resume prompt; it does not phone home.

Where local state lives

Everything Power Claude writes outside the extension bundle lives under ~/.power-claude/:

~/.power-claude/
├── profiles/          OAuth profiles for each Claude account (rotation pool)
├── state/             Rotation state, lockouts, pending-recovery markers, license.json
├── logs/              events.jsonl, watchdog.log, rotation-audit.log, handler.jsonl
├── lib/               Bundled shell helpers (deployed at install time)
├── hooks/             Lifecycle + rate-limit hook scripts
├── cache/             devtools-data.json, session-index.json
└── config/            config.json, auto-rewake-config.json, nudges.json

The only files Power Claude writes outside ~/.power-claude/ (per the README's "What Power Claude writes to disk" section):

| Path | Why | |---|---| | ~/.claude/.credentials.json | Claude Code reads its active credential from here. Power Claude overwrites it on rotation so Claude Code picks up the new account between requests. | | ~/.claude/settings.json | Hook registrations, with your consent. Only Power Claude's own entries are added or removed; other tools' entries and your manual entries are preserved. |

The "Uninstall Everything" command strips every Power Claude entry from ~/.claude/settings.json and removes ~/.power-claude/. Your Claude Code credentials and any non-Power-Claude settings are untouched.

The website's analytics plugin is not Power Claude

A potential point of confusion: neural-llm.com (the marketing website) runs a Joomla plugin called plg_system_neuralanalytics that injects Matomo and GA4 page-view tracking into the web pages of the marketing site itself. That plugin is what tracks visits to /pricing and /download so we can see which articles drive sign-ups.

It runs on the web server. It is part of the marketing site. It is not in the extension, the CLI, or the proxy. It cannot see anything on your machine. When you visit https://neural-llm.com in a browser, that browser session is subject to the same first-party page analytics any website runs. When you use Power Claude in your editor, no part of your traffic flows through the marketing site.

The two products live in the same monorepo and share branding. They do not share a data path.

Does Power Claude work offline?

Mostly, yes — for up to the offline-grace window. The license validation requires a network call to neural-llm.com. If the call cannot complete (you are offline, behind a corporate proxy, or neural-llm.com is down) the extension falls back to the locally cached validation result and a grace window kicks in.

@CONFIRM-FACT: the offline grace window is up to three days (OFFLINE_GRACE_MS in licenseGate.ts); the README's older 24-hour figure was a partial description of the earlier behavior. The current value is configurable via the heartbeat envelope so the server can shorten the window for a revoked license.

Everything else works offline. The proxy, rotation, watchdog, Auto-Resume, Auto-Nudge, the dashboard, the Insight Graph, the cost engine — they all read from local files and communicate over localhost. The only persistently network-dependent feature is the periodic heartbeat that refreshes the license cache.

If you work primarily on aircraft, air-gapped networks, or restrictive corporate networks: Power Claude will run cleanly for the duration of the offline grace window between successful heartbeats. Plan for the heartbeat to find neural-llm.com once every ~5 minutes when you are online, and you are covered.

What this claim depends on

The user-data-doesn't-leave claim depends on a small number of things being true at the same time:

  1. The proxy forwards to api.anthropic.com, not to a Neural-LLM host. Verifiable in src/proxy/server.ts — the upstream URL is the Anthropic API base, not anything under our control. Verifiable at runtime with tcpdump or ss -tnp against the proxy process.
  2. The license endpoints carry exactly the payloads shown above. Verifiable in src/proxy/licenseGate.ts at lines 1957 (activate), 2179 (heartbeat). Both pass through a single httpsPost helper; there is no alternate code path that adds fields.
  3. The Ed25519 verification of server responses is local-only. Verifiable in verifyServerSignature in licenseGate.ts — it uses the embedded public key, not a network call.
  4. neuralanalytics is a Joomla plugin on the marketing site, not in the extension bundle. Verifiable by grep: grep -r 'neuralanalytics' src/ extension.d.ts returns no matches.
  5. The Pro proxy bundle fetch (/license/proxy-bundle.php) does not include user data. Verifiable in src/proxy/proxyLoader.ts:180 — the POST body is { token, fingerprint, nonce, version }.

If any of those changed silently in a future release, this article would need to be updated. We have not changed them and have no plans to. The structural reason is that we cannot see your prompts even if we wanted to — the proxy is a localhost process and we do not run the box it lives on. (For where the dashboard's "throttle waits avoided" and "rotation count" numbers come from, see the telemetry dashboard tour.)

Download Power Claude and verify any of the above yourself before activating. The relevant source files are open for inspection at install time.


Quick Reference

Q: Do my Claude prompts go through any Neural-LLM server? A: No. The local proxy forwards every byte to api.anthropic.com directly. The traffic path is Claude Code → localhost:PROXY_PORT → api.anthropic.com. There is no cloud middleman.

Q: What is in the license-check payload? A: Six fields: license key, machine fingerprint (SHA-256 of hostname + platform + arch + username, or vscode.env.machineId when inside VS Code), extension version, code-hash of the extension bundle, platform string, and a per-request nonce. No prompts, no source code, no Anthropic credentials.

Q: How often does the license check run? A: A heartbeat fires roughly every five minutes while activated. The activate call happens once when you enter a key. The Pro proxy bundle is fetched once per version. The deactivate call only fires on an explicit local license removal.

Q: Does Power Claude work offline? A: Yes, for the duration of the offline grace window (up to three days between successful heartbeats). All other features — rotation, watchdog, Auto-Resume, Auto-Nudge, dashboard, Insight Graph — run on local data without any network dependency.

Q: What about the neuralanalytics plugin I saw in the repo? A: That is a Joomla plugin running on the marketing website (neural-llm.com). It injects Matomo and GA4 into the marketing pages themselves. It is not in the extension or the CLI; your editor traffic does not touch it.

Q: Can Neural-LLM see my rate-limit headers, my session cost, or which files I edited? A: No. Rate-limit headers are read by the local proxy and written to ~/.power-claude/logs/handler.jsonl on your disk. Session attribution, cost estimates, and file lists are computed locally from ~/.power-claude/ and ~/.claude/projects/. None of them are in the license payloads.

Q: How do I uninstall everything? A: Run "Power Claude: Uninstall Everything" from the command palette, or rm -rf ~/.power-claude && code --uninstall-extension neural-llm.power-claude. The command strips Power Claude's entries from ~/.claude/settings.json and removes ~/.power-claude/. Your Anthropic credentials and Claude Code settings are untouched.

Q: Where can I verify these claims in the source? A: src/proxy/server.ts (upstream is api.anthropic.com), src/proxy/licenseGate.ts:1957 and :2179 (full activate and heartbeat payloads), src/proxy/fingerprint.ts (machine fingerprint inputs), src/proxy/proxyLoader.ts:180 (Pro bundle fetch payload). All shipped in the open extension bundle.