Quickstart
Install Pretense and route your first AI tool through it, in 4 commands.
4 commands
npm i -g @pretense/cli@stable pretense --version pretense login --key YOUR_KEY pretense run claude
Command 2 is the cheapest possible check that the install worked. Command 3 takes a key from dashboard, settings, API keys. That is the entire setup: no config file to write, no proxy to start.
Then two ways to see what Pretense would protect, before anything runs:
pretense scan . # what would leave this directory pretense review . # the same, with the surrounding code
Hosted or air-gapped: one argument apart
There is no second setup for running on your own hardware. It is the same four commands, and the only thing that changes is the argument to command 4.
npm i -g @pretense/cli@stable pretense --version pretense login --key YOUR_KEY pretense run qwen2.5-coder
claude names a tool, so Pretense starts the proxy and launches that tool against it. qwen2.5-coder names a model, so Pretense starts the same proxy and talks to the model through it directly — a chat prompt, no extra client to install. Either way the prompt is mutated on the way out and restored on the way back, and the exchange lands in the audit log. Air-gap covers the local half in full.
pretense run claude spawns claude, so that binary has to be on your PATH already; without it the command reports "claude" is not on your PATH and exits. Count that as a fifth step for the hosted path. The local path really is four — the model chat is built into the CLI, so there is nothing else to install.
Change the last word and Pretense works out the provider. These are the names it already knows.
Hosted
| Command | Tool | Base URL set for you | Reads your files? |
|---|---|---|---|
| pretense run claude | Claude Code | ANTHROPIC_BASE_URL | yes — agent |
| pretense run cursor | Cursor | OPENAI_BASE_URL | yes — agent |
| pretense run codex | Codex CLI | OPENAI_BASE_URL | yes — agent |
| pretense run gemini | Gemini CLI | GEMINI_BASE_URL | yes — agent |
| pretense run aider | Aider | OPENAI_BASE_URL | yes — agent |
| pretense run continue | Continue | OPENAI_BASE_URL | yes — agent |
| pretense run goose | Goose | OPENAI_BASE_URL | yes — agent |
| pretense run llm | llm CLI | OPENAI_BASE_URL | prompt in, text out |
On your machine
| Command | Model or runner | Reads your files? |
|---|---|---|
| pretense run llama3.2 | Llama | chat only |
| pretense run mistral | Mistral | chat only |
| pretense run gemma3 | Gemma | chat only |
| pretense run qwen2.5-coder | Qwen | chat only |
| pretense run deepseek-r1 | DeepSeek | chat only |
| pretense run ollama | Ollama | chat only |
| pretense run lmstudio | LM Studio | chat only |
| pretense run vllm | vLLM | chat only |
Pull the model locally first.
Every row in the second table reaches the same built-in chat: it takes a prompt and returns text. Ask it to open a file and it will answer from the prompt alone, because it has no filesystem to reach for. That is worth knowing before you ask one to summarise a repository.
Reading files is a property of the client, and it is available with local weights too. Point an agent at a local model and you get both:
unset ANTHROPIC_API_KEY OPENAI_API_KEY=local pretense run aider -- \ --model openai/qwen2.5-coder:latest --read src/api.ts
--model takes a flag. Passed bare, aider reads the value as a filename and creates an empty file of that name. And clear ANTHROPIC_API_KEY first: aider prefers its default Anthropic model whenever that key is present.
Which client, which model
The two questions vary independently. What the client can do is one axis; where the model runs is the other.
| Client | Hosted model | Model on your machine |
|---|---|---|
| Agent — reads your files | pretense run claude · aider · codex · gemini | pretense run aider --model openai/qwen2.5-coder |
| Chat — prompt in, text out | pretense run llm | pretense run qwen2.5-coder · ollama |
Name the provider: --provider openai. Takes anthropic, openai or google. An unknown name falls back to anthropic.
What just happened
Command 3 authenticated you and installed your Enterprise licence. No file to carry, no import step. A disconnected machine imports one instead: Air-gap.
Authenticated successfully. Key: prt****...98b5 Enterprise licence installed. ~/.pretense/licence.jwt
scan and review listed what Pretense protects here, before anything leaves. Both exit 1 on a finding, so either can gate a commit.
Every file the scanner can read as text, whatever its extension. Binaries and files over 5 MB are skipped, and the count of what was skipped is printed rather than hidden. If nothing could be read at all, scan exits 3 — so silence never reads as clean. Details in the CLI reference.
Command 4 started the proxy, pointed the tool at it, and stopped it when you quit.
✓ Started Pretense proxy on port 9340. → Routing claude through the proxy (ANTHROPIC_BASE_URL=http://localhost:9340).
run starts one and stops the one it started. The default port is 9339; it was busy on the machine that produced this output, so Pretense moved up to 9340 and pointed the tool there. You never have to know which — run sets the base URL for you. Setting it yourself is Configuration.
Next
- How it works: why mutation, and how the round trip stays byte-exact
- Air-gap: keep the model on your own hardware
- Automation & CI: catch secrets before they are committed
No Node on the machine? Install it this way instead.
curl -fsSL https://www.pretense.ai/install.sh | sh
To move to a newer version, run the install command again.