Prefex runs entirely on your machine. Your prompts go directly from Prefex to the upstream API (Anthropic or OpenAI) — nobody else sees them.
Every request writes one row to a local SQLite database at
~/.prefex/data/prefex.db. The row contains:
| Field | Logged | Example |
|---|---|---|
| Timestamp | Yes | 2026-03-27T14:23:01Z |
| Channel | Yes | claude_code |
| Mode | Yes | live |
| Model used | Yes | claude-haiku-4-5-20251001 |
| Input tokens | Yes | 1024 |
| Output tokens | Yes | 312 |
| Cost (USD) | Yes | 0.0003 |
| Router decision | Yes | weak |
| Cache hit | Yes | true |
| Latency (ms) | Yes | 72 |
| Prompt text | Opt-in | Off by default. Stored locally if store_system_prompt_text: true. |
| Response text | Never | — |
| System prompt text | Opt-in | Off by default. Local only, for cache analysis. |
| API keys | Never | — |
Prefex has no telemetry, no analytics endpoint, no phone-home. The SQLite database is local. The dashboard reads from that database. Nothing is sent to us or any third party.
The only outbound connections Prefex makes are the ones your application
already made — to api.anthropic.com or api.openai.com.
Run this while Prefex is active:
# Capture all TCP traffic from the Prefex container sudo tcpdump -i any -n "host $(docker inspect -f '{{`{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}`}}' prefex-proxy-1)" 2>/dev/null # You should see connections to api.anthropic.com only. # No other outbound destinations.
The Docker image contains only the compiled binary — no source, no shell.
# Confirm the image contains only the binary docker run --rm promptforce/prefex:latest ls /app # Output: prefex
Prefex ships as pre-compiled binaries and Docker images published to Docker Hub. The Go proxy is proprietary. The RouteLLM router sidecar is Apache 2.0 open source.