Surfil

Install

Two commands, entirely in your terminal - no app to open. Install the binary, then link this device. After you link, Surfil connects itself to the coding agents you already use.

Early access. Interception runs on macOS (Apple Silicon + Intel) and Linux (x64 + arm64). The Windows (x64) binary is CLI only for now: sign in and verify receipts, but no relay, no shell wiring, no background service and no self-update. Binaries are unsigned for now, so the installer clears the macOS quarantine for you.
Before you pipe that into a shell: Surfil reads every request your agents make before it leaves the machine, so the code that does it is public and Apache-2.0 at github.com/UpgradIQ/surfil-intercept. You can read the proxy, build it, and run its tests without an account. Billing and dashboards stay closed, and neither sees traffic.
You need a plan to link a device. Surfil has no free tier, so surfil login needs an active plan to link against. The shortest way in is 14 days of Pro for $1: start the trial. It becomes $25/mo on day 15 unless you cancel, and we mail you 3 days before.

1 · Install

On macOS or Linux, run:

curl -fsSL https://surfil.com/install.sh | sh

On Windows, in PowerShell, run (CLI only: this installs the binary, not interception):

irm https://surfil.com/install.ps1 | iex

If the installer prints a PATH line, run that line too (once) so your shell can find surfil:

export PATH="$HOME/.local/bin:$PATH"

Run this and approve the code in the browser tab it points you to:

surfil login

The private key is generated on-device and never leaves it - only the public key is registered, and your role in the browser is a single yes/no approval. The moment it links, Surfil auto-detects and connects your installed agents through reversible contracts, so it starts working with them right away.

Agents it connects

On link, Surfil connects every tool it can - each by its real mechanism, never an over-claim. Run surfil doctor to see which you have and how each one connects:

surfil doctor
  • Claude Code - full: base URL (its settings.json env block) + MCP servers.
  • Env-routed CLIs - Codex, opencode, Aider, ShellGPT, mods, llm, Open Interpreter and more honour the standard provider env vars, so the shell profile block routes them.
  • MCP hosts - Cursor, Windsurf, Claude Desktop, Cline: Surfil's MCP server plugs into their config. Their model completions run through their own backend, so their base URL is not redirected here.
  • Detected - Copilot, VS Code, Zed, Gemini CLI, Continue: recognised, with a manual option where the editor allows it (below).

Every change is reversible - each file is snapshotted byte-exact and surfil uninstall restores it. Detection is local and read-only; nothing about which tools you have leaves your machine.

The Claude desktop application is not intercepted as it launches, and it is worth knowing which of your traffic that is. The app hands its own child process an ANTHROPIC_BASE_URL pointing straight at the provider, and an inherited environment variable beats any config file. Its bundled engine routes correctly once that variable is removed, which is how we know the cause rather than guessing it. So anything you do inside the desktop app is not measured, not screened and not in any figure Surfil shows you. Claude Code in a terminal, launched after surfil connect, is intercepted normally.

Connect a GUI editor manually

Editors like Cursor and Zed keep their model calls on their own backend, so Surfil cannot redirect them from a config file. Where the editor exposes a custom base-URL setting, point it at the on-device proxy yourself - no CA, no interception of anything else:

surfil connect

It prints the exact clicks per editor and the local endpoint to paste (http://127.0.0.1:8788/v1). For Cursor this covers its chat/plan panel; features that use Cursor's own backend are unchanged.

Build from source

For a platform without a prebuild yet, build it yourself. With Rust installed, run:

cargo build --release -p surfil-cli

Then put the binary on your PATH:

install -m 0755 runtime/target/release/surfil ~/.local/bin/surfil

And link the device the same way:

surfil login

Uninstall

Restores every agent config from its byte-exact snapshot and removes the runtime:

surfil uninstall

Next

  • Quickstart - from install to your first verified receipt.
  • Zero-trace - exactly what leaves the device (and what never does).