privacy

What we collect — and what we never collect.

This page states LazyToken's factual data practices. They are not just policy promises: the reporting payload is governed by a strict allowlist enforced in code — an automated test on the agent blocks any change that would add a field, and the server rejects any unknown field instead of silently stripping it.

A formal legal Privacy Policy is being finalized with counsel. Until it is published, this page documents the data practices, which are enforced in code and verifiable in the open-source engine.

what we collect

The entire dataset: numbers and a tool name

When an agent is enrolled, each metric record may contain only the fields below. Anything else is rejected by the server with 400 INVALID_PAYLOAD.

FieldExampleNotes
ts — timestamp1752660000Event time, UTC
tool — tool namegitFirst word only, max 32 chars, no spaces — arguments cannot ride along
categorygitCoarse bucket
ai_agentclaude-codeWhich coding agent was in use
tokens_raw / tokens_filtered2000 / 400Numeric token counters, before and after filtering
duration_ms8Filter timing
project_hash (optional)a1b2…Salted SHA-256; the salt is device-local and never transmitted; off unless policy enables it
Security events (Context Firewall) record only {type, tool, timestamp} — the rule type (e.g. aws-key) is a category, never a value. The matched secret is never sent, never logged, never written to disk. Envelope keys are limited to a device id and the agent version. Full wire schema: the Security Whitepaper.
what we never collect

Excluded by design, enforced in code

Every row is blocked by the payload allowlist on both sides of the wire: a compile-time-exhaustive test on the agent, and a strict schema on the server.

Never transmittedHow it's prevented
Source code — files, snippets, diffsNo field in the schema can carry it
Command argumentsOnly the first word is sent; max 32 chars, no spaces — an argument physically can't fit
File paths / filenames / directoriesNot in the schema; the optional project_hash is a salted hash whose salt never leaves the machine
Command / terminal outputNever captured for transmission — filtering happens locally
Environment variablesNone, ever
Secrets / credentials / tokensThe Context Firewall redacts locally; only the rule type is reported, never the value
Prompts or model responsesLazyToken is not in the prompt path for reporting
Keystrokes, screen contents, clipboardNever captured
Git remotes, commit messages, branch namesNot in the schema
Geolocation / device fingerprintingOnly a SHA-256-hashed hostname identifies a device
personal data & access

Personal data posture

No PII by default

  • Identity is optional; when present it comes from your own IdP via SSO — the customer controls it
  • Anonymized mode is built in: the dashboard can show teams and "Dev #N" instead of names — the customer's choice, recorded in the audit log
  • Hostnames are hashed (SHA-256) at the source; the raw hostname is not sent

Enterprise: the vendor has no access

  • Self-hosted server — the vendor has no tenant, no copy, and no access to customer data
  • No telemetry to the vendor; in air-gapped mode the server makes zero outbound calls
  • Optional, customer-enabled egress only: your IdP (SSO), your SMTP / Slack — off by default
  • TLS 1.3 in transit; at rest the database is under your control

Free / Pro cloud: aggregated, anonymized use only

For the hosted Free and Pro dashboards, LazyToken may use aggregated, anonymized usage data — tool names and numeric counters only, per the schema above — to improve the product and build cross-organization benchmarks and recommendations. By construction of the schema, that data cannot contain code, arguments, paths, output, or environment variables. Details in the Terms of Service (draft).

Questions about data handling?

The Security & Privacy page has the full trust model and ready security-questionnaire answers; the whitepaper has the exact wire schema. A DPA template is available on request.