{% extends "base.html" %} {% block title %}Trust & data residency — Tourniquet{% endblock %} {% block content %}
Tourniquet is a local-first proxy. Every byte of your usage data lives on this Mac. There is no cloud, no telemetry, no remote “Tourniquet account”.
metadata.user_id~/.tourniquet/alerts.jsonl)No telemetry. Nothing goes to a Tourniquet-operated server — there isn't one.
del'd immediately after use, never written anywhere| Threat | Mitigation |
|---|---|
| Prompt leakage via Tourniquet | Tourniquet never reads or stores message bodies — it streams them opaquely |
| Anthropic key theft via DB dump | Key is AES-256 encrypted; attacker needs both the DB and the FERNET_KEY env var |
| tq_ token forgery | Tokens are bcrypt'd (cost 12); timing-safe comparison in auth |
| Outbound exfiltration via insights | The insights module is statically asserted to import no network library — tests/test_insights.py::test_no_network_imports |
| Someone else on your network reading the dashboard | Tourniquet binds to 127.0.0.1 only. Not reachable from your LAN unless you tunnel it. |
From the directory you cloned Tourniquet into, run any of these to audit independently:
grep -r "telemetry\|posthog\|segment\|sentry" src/Select-String -Path src\* -Pattern "telemetry|posthog|segment|sentry" -Recursemain.py behind an opt-in SENTRY_DSN env var (empty by default).
lsof -i -P | grep pythonGet-NetTCPConnection -State Listen | Where-Object OwningProcess -in (Get-Process python).Id127.0.0.1 (dashboard), api.anthropic.com (proxied requests), and any alert channels you configured.
docs/data-residency.md for the full architecture explanationsqlite3 tourniquet_dev.db ".schema" — confirm it has columns for cost_usd_cents and friends, but no column for prompt or response content