-
Notifications
You must be signed in to change notification settings - Fork 21
Privacy and Security
Exactly what claude-ops touches on your machine — and everything it doesn't.
Transparency No telemetry License: MIT Audit ready Local only
Important
This page is exhaustive as of v1.7.0 (30 skills / 14 agents). If something the plugin does isn't listed here, it doesn't do it. The source is MIT-licensed and publicly auditable at Lifecycle-Innovations-Limited/claude-ops.
v1.0+ additions this page covers: monitor-agent (Haiku 4.5) polls your configured Datadog / New Relic / OpenTelemetry endpoints read-only for /ops:monitor · /ops:integrate registers new SaaS APIs to your local partners.json only · /ops:settings updates credentials locally in your plugin data dir. No new outbound destinations beyond what you explicitly configured. v1.7.0 adds: /ops:gtm go-to-market planner, marketing-optimizer agent, MCP auto-reconnect (PreToolUse hook), wacli --follow fix.
| Property | Status |
|---|---|
| Phones home / sends telemetry | Never |
| Uploads credentials anywhere | Never |
| Reads files outside registry + plugin data dir |
Never (except during one-time /ops:setup auto-scan) |
| Sends messages without user action | Never |
| Accesses camera, mic, clipboard | Never |
Scans ~/.ssh/
|
Never |
| Destroys data without per-action confirmation | Never — Rule 5 |
| Source code auditable | Yes — MIT, public repo |
| Uninstall cleans up everything | Yes — /ops:uninstall
|
When you run /ops:setup, the wizard probes these sources to find credentials you already have — so you don't have to paste anything already on disk. This runs only during setup; never in the background, never during normal skill execution.
flowchart LR
Start["/ops:setup"] --> Scan[Universal auto-scan]
Scan --> E1[Env variables<br/>printenv]
Scan --> E2[Shell profiles<br/>~/.zshrc, ~/.bashrc,<br/>~/.zprofile, ~/.envrc]
Scan --> E3[Doppler<br/>doppler secrets get]
Scan --> E4[1Password<br/>op]
Scan --> E5[Dashlane<br/>dcli]
Scan --> E6[Bitwarden<br/>bw]
Scan --> E7[macOS Keychain<br/>security find-generic-password]
Scan --> E8[~/.claude.json<br/>mcpServers, read-only]
Scan --> E9[Chrome history<br/>URLs only, never content]
Scan --> E10[Persistent browser profile<br/>opt-in, only for Slack fallback]
E1 & E2 & E3 & E4 & E5 & E6 & E7 & E8 & E9 & E10 --> Result[Scan result]
Result --> Show[Show to user]
Show --> Decide[User decides: use / paste / skip]
classDef scan fill:#6366f1,color:#fff,stroke:#4338ca
classDef source fill:#22c55e,color:#fff,stroke:#15803d
classDef user fill:#f59e0b,color:#fff,stroke:#b45309
class Scan,Result scan
class E1,E2,E3,E4,E5,E6,E7,E8,E9,E10 source
class Start,Show,Decide user
| # | Source | Command | Scope | Purpose |
|---|---|---|---|---|
| 1 | Env variables | printenv <VAR> |
Current shell | Already-exported secrets |
| 2 | Shell profiles |
grep on ~/.zshrc, ~/.bashrc, ~/.zprofile, ~/.envrc, ~/.config/fish/config.fish
|
Regex for VAR= or export VAR=
|
Persistent exports + direnv |
| 3 | Doppler |
doppler secrets get <VAR> --plain across all projects/configs |
Only if command -v doppler succeeds |
Central secrets vault |
| 4 | 1Password | op item get ... |
Only if op installed |
Password manager |
| 5 | Dashlane | dcli password <service> |
Only if dcli installed |
Password manager |
| 6 | Bitwarden | bw get item <service> |
Only if bw installed |
Password manager |
| 7 | macOS Keychain | security find-generic-password -s <service> -w |
macOS only, per service name | System vault |
| 8 | Claude Code settings | Read ~/.claude.json mcpServers
|
Read-only, never written | Reuse existing MCP tokens |
| 9 | Chrome history | sqlite3 "~/Library/Application Support/Google/Chrome/Default/History" "SELECT url FROM urls WHERE url LIKE '%admin%'" |
URL list only — never page content | Identify service domains (e.g., yourstore.myshopify.com) |
| 10 | Browser profile | Playwright with persistent profile at ~/.claude-ops/slack-profile
|
Opt-in only — user must choose Playwright fallback for Slack | Extract xoxc-... token for Slack local-token path |
Note
Chrome history reads URLs only. The plugin never reads page contents, cookies, passwords, or autofill data. The URL list helps identify which services you use (e.g., "you visited store.myshopify.com/admin so you probably have a Shopify store"). The Slack Playwright fallback is the only browser-data path, and it runs only if you explicitly select it.
Per Rule 3, the wizard never silently uses a discovered credential. You always see:
Found credential for SHOPIFY_ADMIN_TOKEN:
[A] shell env + ~/.zshrc + Dashlane — shpat_508b...682e (matched 3 sources)
[B] Doppler (project: mystore, config: prd) — shpat_9f2c...a17b (different!)
[C] Paste a different one
[D] Skip
Important
This list is as important as the access list. These are deliberate non-behaviors, verified in code review.
| Category | Status |
|---|---|
| Cloud uploads | Nothing is uploaded. Every scan is a local file read. |
| Telemetry | No analytics. No usage metrics. No crash reports. No pings. |
| Clipboard | Never read. Never written. |
| Camera / microphone | Never accessed. /ops:voice uses API-key services with audio data you provide explicitly. |
| Disk-wide scans | Every scan is a targeted path: shell profiles, specific CLI outputs, registry projects, plugin data dir. No find / -name .... |
| SSH keys |
~/.ssh/ is never read. Ever. |
| System keychains (other services) | Only probed with an explicit service-name whitelist (slack-xoxc, doppler-token, etc.) — never a blanket dump. |
| Browser data | Except the URL-only Chrome history query and the opt-in Slack Playwright path — nothing. No cookies, no passwords, no autofill, no bookmarks, no downloads. |
| Other users on the machine | Nothing in /Users/<other>/ is touched. |
| Message content exfiltration | wacli/gog message content stays on your machine. Claude API calls happen for skill execution, same as any Claude Code session — no separate uploads by this plugin. |
Note
The daemon runs seven services. Each one has a precise set of inputs and outputs documented here. See Daemon Guide for the scheduling mechanics.
-
Reads:
scripts/registry.json, last gather output -
Calls:
aws,gh,wacli(local SQLite),gog(local cache), Shopify/Klaviyo/Meta Ads/GA4/Search Console APIs only if configured by the user./ops:monitoradditionally reaches Datadog / New Relic / OpenTelemetry endpoints only on-demand (never from the daemon). -
Writes:
~/.claude/plugins/data/ops-ops-marketplace/daemon-cache.json - Outbound network: only to the user's own configured APIs. Nothing to claude-ops infrastructure (there is none).
- Reads: wacli local SQLite DB
-
Calls: WhatsApp's servers via the WhatsApp Web protocol (same servers as your existing
wacliinstall; claude-ops adds no new endpoints) -
Writes:
~/.wacli/.health, wacli's local SQLite
- Reads: wacli local SQLite, gog local cache
- Calls: Claude Haiku 4.5 (Anthropic API) to summarize — same API any Claude Code session uses
-
Writes:
~/.claude/plugins/data/ops-ops-marketplace/memories/*.md(mode 600) - Note: Message content is processed transiently by the Haiku prompt. The plugin does not send any additional telemetry to Anthropic beyond the API call itself.
- Reads: wacli SQLite, gog cache, Slack MCP (if configured), Telegram MCP (if configured)
- Writes: inbox digest log in plugin data dir
- Network: only to user-configured MCP endpoints
- Reads: registry
- Calls: Shopify Admin API only — no other platforms
-
Writes:
store-healthreport in plugin data dir
-
Reads: user-specified competitor domains in
preferences.json - Calls: public websites (scraping) + Telegram bot for notifications (if configured)
- Writes: weekly brief in plugin data dir
- Reads: wacli + Telegram local state
- Writes: local event log the daemon picks up
- Never sends messages outbound on its own. Skills in an interactive Claude Code session are the only thing that can send.
| Practice | How |
|---|---|
| File permissions |
umask 077 when writing preferences.json and memories/*.md (mode 600, user-only) |
| Credentials in Claude Code config | Stored via userConfig in ~/.claude.json (Claude Code's encrypted store), never in plaintext files the plugin controls |
| Gitignore everywhere |
registry.json, preferences.json, .planning/, .claude/worktrees/, .env*, *.log — all ignored |
| Secret-commit prevention |
tests/test-no-secrets.sh grep-checks for common leak patterns pre-commit |
| Rule 0 enforcement | Every skill is scrubbed of real names/emails/store URLs — public-repo hygiene pass documented in Changelog |
| Rule 3 confirmation | Every discovered credential shown to user before use |
| Rule 5 destructive block | No rm -rf, no git push --force, no aws delete-* without per-action confirmation |
| No destructive AWS ops |
delete-*, stop-*, terminate-* blocked at the skill level |
| Append-only shell profiles |
.zshrc / .bashrc are never rewritten — only appended to |
| Reference-token support |
doppler:KEY_NAME resolution means secrets never leave the vault |
| PreToolUse fails closed | Health degradation causes warnings, not silent stale-auth retries |
When a skill needs a secret at runtime, it walks this chain — stopping at the first source that returns a value:
flowchart LR
Skill[Skill needs<br/>API_KEY] --> S1{Doppler<br/>reference?}
S1 -->|Yes| D[doppler secrets get]
S1 -->|No| S2{Password<br/>manager?}
S2 -->|Yes| PM[op/dcli/bw/keychain]
S2 -->|No| S3{Keychain<br/>direct?}
S3 -->|Yes| K[security find-generic-password]
S3 -->|No| S4{Env var?}
S4 -->|Yes| E[printenv]
S4 -->|No| UC[userConfig<br/>~/.claude.json]
D --> Use[Use value]
PM --> Use
K --> Use
E --> Use
UC --> Use
classDef vault fill:#22c55e,color:#fff,stroke:#15803d
classDef fallback fill:#f59e0b,color:#fff,stroke:#b45309
class D,PM,K vault
class E,UC fallback
Tip
The vault-first ordering means if you use Doppler or a password manager, your secrets live there and the plugin just references them. With doppler:KEY_NAME tokens, the literal secret value never touches the plugin's config files.
- Auto-scan first, ask second. If your key is in Doppler, you never paste it.
-
Reference tokens.
doppler:KEY_NAMEkeeps secrets in the vault even inpreferences.json. - Fail-closed health checks. PreToolUse hooks warn instead of silently retrying with stale auth — you always know when the plugin is operating in degraded state.
Important
You have full control. The plugin is MIT-licensed source code running on your machine. You own the data it creates.
| Right | How |
|---|---|
| Full uninstall |
/ops:uninstall removes credentials, cached files, memories, registry, plist, shell env |
| Inspect every memory | Plain markdown at ~/.claude/plugins/data/ops-ops-marketplace/memories/ — read/edit/delete |
| Inspect every cache | Plain JSON at ~/.claude/plugins/data/ops-ops-marketplace/daemon-cache.json
|
| Inspect every log | Plain text at ~/.claude/plugins/data/ops-ops-marketplace/logs/
|
| Edit the source | Fork the repo, modify, re-install from local checkout (claude --plugin-dir) |
| Audit the source | Lifecycle-Innovations-Limited/claude-ops — MIT |
| Report issues | GitHub Issues |
/ops:uninstall
Removes:
-
~/Library/LaunchAgents/com.claude-ops.daemon.plist(macOS) -
~/.claude/plugins/data/ops-ops-marketplace/(preferences, memories, cache, logs) -
~/.claude-ops/(Playwright profile if used) -
~/.wacli/.health(if you want — the uninstall asks) - The
CLAUDE_PLUGIN_ROOTexport line in.zshrc/.bashrc - The plugin entry in Claude Code's marketplace
Keeps (by default — you decide per-item):
- Your wacli install + session (that's a separate tool)
- Your gog install + session (that's a separate tool)
- Your Doppler / 1Password / Bitwarden installs
- Your
~/.claude.jsonClaude Code settings (the plugin never owned them)
What the plugin protects against (and what it doesn't)
-
Accidental credential commits —
test-no-secrets.sh+ gitignored prefs + registry - Silent stale-auth errors — PreToolUse fails closed with visible warnings
- Unauthorized destructive ops — Rule 5 per-action confirmation
-
Public S3 bucket drift —
infra-monitorflags them as high-priority fires -
Privilege escalation from example code — all examples use
example.com/$ENV_VAR/your-org
- Compromised Anthropic API — if Anthropic is breached, Claude API calls are at risk. Use Anthropic's enterprise controls.
- Compromised machine — if your machine is rooted, nothing the plugin does protects the files. Use full-disk encryption.
-
Supply-chain attack on npm deps — the plugin pins dependencies in
package.json. Review beforenpm install. - Malicious MCP server — if you install a third-party MCP server that misbehaves, that's a Claude Code concern, not claude-ops.
- Plugin Rules — the five rules that enforce these properties
- Daemon Guide — exact cadence and behavior of each service
- Memories System — what local files the extractor creates
- Integrations — which integrations call which external APIs
- Source code — audit-ready, MIT