Most observability tools (Sentry, Datadog, LangSmith) capture everything by default. The operator’s database ends up storing your raw prompts, file paths, and accidental credentials. Voight inverts that: You choose what leaves your machine. Per-event, the dashboard tells you what was captured.Documentation Index
Fetch the complete documentation index at: https://docs.voight.xyz/llms.txt
Use this file to discover all available pages before exploring further.
The 3 levels
Minimal
Metadata only — tool names, timing, outcomes, token counts, USD cost.
No prompts, responses, file paths, cwd, git context.Best for: regulated workflows, maximum privacy, agents handling
sensitive customer data.
Standard ★
Everything Full captures, but every string is run through local
PII scrubbing before transmission. Credentials, emails, JWTs,
credit cards, PEM blocks, phone numbers redacted on your machine.Best for: most developers. The default recommendation.
Full
Everything as-is. No filtering. Backwards-compat default for users
on SDK ≤0.3.10 who haven’t re-run setup.Best for: solo dev / personal sandbox / max debug detail.
What’s captured at each level
| Category | Minimal | Standard | Full |
|---|---|---|---|
| Tool names | ✓ | ✓ | ✓ |
| Tokens (counts) | ✓ | ✓ | ✓ |
| USD spend | ✓ | ✓ | ✓ |
| Model name | ✓ | ✓ | ✓ |
| Outcome / duration | ✓ | ✓ | ✓ |
| Throughput / charts | ✓ | ✓ | ✓ |
| Bash commands | ✗ | ✓ scrub | ✓ raw |
| File paths | ✗ | ✓ scrub | ✓ raw |
| User prompts | ✗ | ✓ scrub | ✓ raw |
| Agent responses | ✗ | ✓ scrub | ✓ raw |
| Thinking blocks | ✗ | ✓ scrub | ✓ raw |
| Error messages | ✗ | ✓ scrub | ✓ raw |
| Git branch / remote / sha | ✗ | ✓ | ✓ |
| Cwd path | ✗ | ✓ | ✓ |
| API keys / secrets | n/a | ✗ scrubbed | ⚠️ raw |
How it works under the hood
The SDK runs the privacy filter before the HTTP request leaves your machine:resolvePrivacyLevel()readsVOIGHT_PRIVACYenv var (set bysettings.json) and returns one ofminimal | standard | full. Defaults tofullif unset (backwards-compat).applyPrivacy(payload, level)transforms the event based on the level:full— passthrough + stampmetadata.privacyLevel: 'full'minimal— rebuild payload from an allowlist of safe fields (tool name, tokens, outcome, duration), drop everything elsestandard— deep-walk every string and runscrubPii()over each
- Every event ships with
metadata.privacyLevelso the dashboard can render a per-event chip — your audit trail that scrubbing happened.
voight-sdk/src/privacy.ts.
Picking your level
~/.claude/settings.json (env.VOIGHT_PRIVACY).
Per-event chips in the dashboard
Open any event in the dashboard and you’ll see a privacy chip next to the event-kind tag:MIN(green) — metadata-only captureSTD(blue) — full content + PII scrubbing appliedFULL(amber) — raw capture
Honest disclosure
A few things the privacy model doesn’t do, by design:- It doesn’t prevent the operator from seeing data once it’s transmitted. Standard mode scrubs PII on your machine, but the operator still receives whatever’s left. If that’s not acceptable for your use case, pick Minimal.
- It doesn’t encrypt event content end-to-end. The transport is TLS to our backend; storage is plaintext in Postgres. End-to-end encryption with user-managed keys is on the v0.2 enterprise roadmap (
Umbraintegration). - It doesn’t enforce server-side quotas yet — pricing tier limits are advisory today, enforced server-side starting v1.0 when Stripe billing lands.
Backwards compatibility
Users on SDK ≤0.3.10 default to Full (= original behaviour). No silent privacy upgrade — switching levels requires re-running the setup wizard explicitly. We did this deliberately to avoid the trust-eroding “we just scrubbed your API key without telling you” scenario. Existing settings.json files keep working unchanged. TheVOIGHT_PRIVACY field is additive.
Next
PII patterns
The full list of 12 patterns + Luhn-validated card detection, with examples.
Data handling
Where data lives, who can access it, retention policies, deletion flow.