Claude Code mod · open source · MIT · macOS

Wirepane: the debugging proxy Claude can read

Wirepane turns Claude Code into an HTTPS debugging proxy for the browser, the iOS Simulator, iPhones, the Android emulator and Android phones. It decrypts HTTP/2, gRPC, WebSockets and server-sent events, shows them in a pane next to your conversation, and gives Claude the same traffic through 16 tools.

At the Claude Code prompt /plugin install wirepane --marketplace legostin/wirepane
  • 16 tools for Claude
  • 3 skills
  • 1 proxy for every session
  • 0 npm dependencies
127.0.0.1:8899 · 342 requests
  1. 401 POST https://api.example.com/v1/login 1.2KB 180ms
  2. 200 POST https://api.example.com/pkg.Cart/Checkout 41B 95ms
  3. 101 GET wss://api.example.com/chat ↑14 ↓52 …
  4. CERT CONNECT gateway.icloud.com:443 0B 0ms
The pane opens next to your conversation: a failed login, a gRPC call a rule changed, a live WebSocket and a client that refused the proxy’s certificate. Claude reads the same list through its tools.

Ask instead of pasting

Instead of copying requests into the chat, you ask:

  • Why does checkout return 402 on the phone but not in the browser?
  • Wait while I tap Log in, then tell me what the app sent.
  • Make the feed take 3 seconds and fail one request in five.
  • Answer the price socket with a mock that sends a tick on every subscription.
  • Nothing shows up from the emulator. Fix it.

Claude finds the request, reads only the part it needs, compares the one that works with the one that fails, replays it with a change, writes a rule, and fixes your code. When something is in the way — a missing CA, a pinned certificate, a VPN or Charles holding the system proxy — the doctor names it and fixes it.

16 tools for Claude

Everything the pane shows, as tools Claude calls itself.

  • list_requests

    ({ filter?, since?, limit? })

    The proxy’s state and one line per request: id, method, status, URL (long ones cut), size, time, type, WebSocket and event counts, rules, error. since lists only what is new.

  • get_request

    ({ id, part?, json_path?, max_chars?, from?, limit? })

    One request, part by part: summary, headers, request, response, messages. Bodies share one budget and json_path picks one field. gRPC, protobuf, trailers, WebSocket messages and events are included.

  • search_requests

    ({ text, where?, filter? })

    Which requests hold some text in their URL, headers, bodies, messages or events, with the text in context.

  • wait_for_request

    ({ filter, timeout_s?, until? })

    Waits for the request you are about to trigger, and answers it the moment it ends.

  • diff_requests

    ({ a, b })

    What differs between two requests: method, URL, query, headers, status, JSON field by field.

  • replay_request

    ({ id, method?, url?, headers?, body?, json? })

    Sends a request again, as it was or changed, through the proxy, so it is recorded and rules apply.

  • resume_request

    ({ id, action?, changes?, respond? })

    Lets go of an exchange held at a breakpoint: as it was, changed, answered by hand, or cut.

  • send_ws_message

    ({ id, to, text | json | b64 })

    Injects a message into a live WebSocket, to the client or to the server.

  • close_websocket

    ({ id, code?, reason? })

    Closes a live WebSocket, to test reconnects.

  • add_ruleupdate_ruleremove_rulelist_rules

    The rules file, applied at once.

  • track_domains

    ({ add?, remove?, set?, enabled? })

    Decrypts and records only your app’s hosts, and shows what passed through.

  • export_har

    ({ filter?, file? })

    HAR 1.2 with bodies and WebSocket messages, for a teammate or Chrome DevTools.

  • diagnose

    ()

    The doctor: every check, each finding with its fix.

Every protocol a modern app speaks

Decrypted and decoded: in the pane for you, in the tools for Claude.

  • HTTP/2, both ways

    To clients that offer it and to servers that speak it. HTTP/1.1 for the rest, each side on its own. Plain-text h2c too, for gRPC to a local service.

  • gRPC and gRPC-Web

    Trailers forwarded. Bodies are decoded without a schema: field numbers, values, nested messages. A failed call shows its status: gRPC NOT_FOUND: no such user.

  • Protobuf

    application/x-protobuf bodies, decoded the same way.

  • WebSockets

    Message by message, both ways, with timing and close codes. Compression is taken out of the offer, so every message stays readable.

  • Server-sent events

    Event by event as they arrive, with the millisecond each one came. Made for LLM streaming APIs.

  • Compressed bodies

    gzip, brotli, deflate and zstd, decoded.

Every client in one press

Run /proxy and the empty list offers the ways in it found on this Mac: a browser, a booted simulator, an emulator, a phone.

  • Setup → Browser

    A separate browser

    Chrome, Edge, Brave or Chromium starts with a profile of its own and trusts the proxy by SPKI hash. No certificate to install, and localhost is captured too.

  • Setup → iOS

    iOS Simulator

    Use (or Boot & use) boots one, adds the CA and turns on the Mac’s system proxy, since a simulator has no proxy setting of its own.

  • Setup → iOS → iPhone / iPad

    iPhone and iPad

    Listen on LAN, scan the QR code to install the profile, turn on full trust and set the Wi-Fi proxy to the address shown. The section confirms when traffic arrives.

  • Setup → Android → Emulator

    Android emulator

    Start through the proxy launches an AVD behind it and opens the CA page. On a Google APIs image, Trust in all apps makes the CA a system CA until the next reboot.

  • Setup → Android → Phone

    Android phone

    On USB, adb reverse points it at the proxy, so no Wi-Fi is needed. On Wi-Fi: Listen on LAN, the QR code and the proxy setting shown.

  • Setup → macOS · Setup → CLI

    Mac apps and the command line

    Safari and native apps get the system proxy and the CA, one press each, and both are put back when the proxy stops. For curl, Node, Python, Go, Java and Docker it copies HTTPS_PROXY, NODE_EXTRA_CA_CERTS, SSL_CERT_FILE and REQUESTS_CA_BUNDLE.

Rules and mocks

It changes traffic, not just shows it. Rules change requests before they are sent, responses before the client gets them, and WebSocket messages both ways. Ask Claude in plain words and it writes the rule.

What a rule can do

  • Hold a request or a response at a breakpoint until you or Claude let it go, changed or not.
  • Mock a response, add a delay, throttle, return an error or drop the connection.
  • Rewrite headers, URLs and JSON.
  • Send requests to your local server.
  • Stand in for a whole WebSocket server: answer the upgrade with 101, send messages as the socket opens and reply to the ones that match.

Where they live

  • In the project, in .claude/proxy-rules.json, so you can commit them. The file is reloaded the moment it changes.
  • The Rules view lists them in words, with hit counts. It turns them on and off, reorders them and removes them.
  • A request a rule changed is marked in the list, and its detail says what each rule did. Filter with is:modified or rule:<id>.
  • A script runs only once its SHA-256 is approved, so a rules file cloned with a repository cannot run code unasked.
.claude/proxy-rules.json
{
  "rules": [
    {
      "id": "slow-feed",
      "description": "The feed on a bad 3G line, failing now and then",
      "match": { "methods": ["GET"], "host": "api.example.com", "path": "/v1/feed*" },
      "request": [{ "type": "delay", "ms": 800, "msMax": 2500 }],
      "response": [{ "type": "throttle", "bytesPerSecond": 50000 }]
    },
    {
      "id": "mock-prices-socket",
      "description": "A price feed, with no server",
      "match": { "path": "/ws/prices" },
      "request": [{ "type": "respond", "status": 101 }],
      "messages": [
        { "type": "send", "on": "open", "to": "client", "json": { "type": "hello" } },
        { "type": "reply", "when": "\"subscribe\"", "json": { "type": "price", "price": 42.5 } }
      ]
    }
  ]
}

A doctor that fixes what is in the way

/proxy doctor, the Health view or Claude’s diagnose check the proxy, the system proxy, VPNs, other proxy apps, the CA on each client, pinned hosts, upstream failures and Android devices. Each finding names its fix, and many have a button.

What it repairs on its own

  • Pinned hosts pass through

    A host that refuses the certificate twice is tunnelled untouched, so the app keeps working. Decrypt it again once the client trusts the CA.

  • A leftover system proxy is put back

    A killed proxy can leave the Mac’s system proxy on and the Mac with no internet. A watchdog puts it back.

  • Self-signed dev servers, accepted

    A dev server with a self-signed certificate gets it accepted in one press, for that host only.

  • Office networks

    An upstream proxy carries every connection to the servers: HTTP, HTTPS, HTTP/2, tunnels and WebSockets. It can be an HTTP proxy that signs in with Basic or Windows NTLM credentials, SOCKS5, or a PAC file that picks per URL. The doctor offers the network’s own proxy for it.

Check Finds Fix
The proxy and its process Stopped, failed, a port taken (and by whom); pid, uptime, memory, disk, sessions Start again, Restart
The system proxy Left on by a dead proxy (no internet); held by Charles or Proxyman Put back; Setup
VPN and other proxy apps A utun default route; Charles, Proxyman, mitmproxy, HTTP Toolkit running What to try
The CA on this Mac Safari and Mac apps would refuse HTTPS Trust on this Mac
Refusals per client Every host refused: the CA is missing. One host among working ones: it pins its certificate Setup for that client, or Never decrypt it
Pinned hosts Passed through after two refusals (or an OkHttp-style close right after the handshake) Decrypt them again once trusted
Upstream failures DNS (ENOTFOUND), self-signed dev servers, closed ports, localhost confusion, unreachable networks Accept its certificate; what to check
The network’s own proxy The system proxy pointed at an office’s or a VPN’s proxy before Wirepane took its place Use it upstream
Tracked domains A list that matches nothing that came, and what passed instead Add the real hosts
Android devices Not pointed at the proxy; apps that will not trust a user CA; a rootable image Setup; Trust in all apps

One proxy for every session

A single proxy serves every Claude Code session on the Mac. The first session that needs it starts it, detached; the others attach to it.

  • A second session attaches and sees what the first recorded: the requests, the tracked domains, the hosts passed through.
  • Each project’s rules apply while its session is attached.
  • /clear and --resume keep everything in place.
  • The Health view shows the process, its memory and the sessions using it.
  • A session that ends only lets go; the last one out stops it. With every session gone, the proxy waits 90 seconds, puts the system proxy and Android devices back, and exits.

Three skills

The plugin ships three skills that Claude loads when the task calls for them.

  • wirepane-debugging

    The order that works: from filter to summary to part, then search, diff, replay and verify. Also how to read gRPC, WebSocket and SSE traffic cheaply.

  • wirepane-troubleshooting

    Symptom, check, fix, for everything the doctor knows, including the fix in your own app: Android network_security_config, OkHttp and iOS pinning in debug builds, Flutter HttpOverrides, and proxy settings for Node, Go, Python, Java, Docker and Unity.

  • wirepane-rules

    Recipes for mocks, latency, chaos, JSON rewrites, GraphQL operations and WebSocket mocks. Every one is tested to validate.

It runs on your Mac

Wirepane sends nothing of its own anywhere. It connects only to the servers your clients asked for.

  • No account, no telemetry, no update checks, no downloads.
  • No npm dependencies: the proxy is a small Node.js process.
  • Its CA is made on your machine.
  • Recordings stay in ~/.claude/proxy-mod. A run’s folder is deleted two days after its last use.
  • A request reaches Claude only when Claude calls a tool.
  • It does not capture Claude Code’s own traffic or the commands Claude runs.

Install

You need macOS, Claude Code 2.1.292 or newer, and openssl (built into macOS). The proxy runs on Node.js 18 or newer and finds it by itself: on PATH, or where Homebrew, Volta, nvm, fnm, mise, asdf, nodenv or MacPorts put it. With no Node at all, the pane offers to install it.

  1. At the Claude Code prompt:

    /plugin install wirepane --marketplace legostin/wirepane

    Or from a shell:

    claude plugin marketplace add legostin/wirepane
    claude plugin install wirepane@wirepane
  2. Then run /proxy. The proxy starts on 127.0.0.1:8899, the pane opens, and the empty list offers the ways in it found on this Mac.

Commands

/proxy
open the pane and start (or attach to) the proxy
/proxy setup
set up a browser, iOS, Android, macOS or CLI client
/proxy doctor
the doctor’s findings, and the Health view
/proxy rules
the rules
/proxy track
record only the domains you name
/proxy export
write a HAR file
/proxy stop
stop it, and point the system proxy and Android devices back

Limits

What it does not do, said plainly.

  • HTTP/3 (QUIC) is UDP and never meets an HTTP proxy. Chrome drops to HTTP/2 behind one; an app that forces QUIC is not seen.
  • Protobuf is decoded without a schema: field numbers, not names.
  • WebSocket compression is taken out of the client’s offer. A server that insists on it may refuse; a compressed message passes on undecoded.
  • Kerberos: an upstream proxy that takes only Kerberos tickets needs a helper that signs in for you, such as Px. Basic and NTLM sign in by themselves.
  • The Android system CA needs an emulator image that allows root (Google APIs, not Google Play) and lasts until a reboot. Android 17 asks for Certificate Transparency on system CAs, which Wirepane’s certificates do not carry. Chrome on Android trusts a user CA anyway.
  • Pinned apps: someone else’s app that pins its certificates stays encrypted; it is passed through.
  • Rule scripts run in Node’s vm module: approve only code you would run yourself.
  • macOS only, on an early-access Claude Code API (mods).

Questions

Is it a replacement for Proxyman, Charles, mitmproxy or HTTP Toolkit?

For “what did my app send, what came back, and why does it fail”, yes, without leaving Claude Code: HTTP/2, gRPC, WebSockets and SSE, with rules, mocks, replays and diffs. Proxyman and HTTP Toolkit have MCP servers too; Wirepane is built around the agent: the doctor, the waiting, search and diff tools, the context budget, and the skills that fix the app’s own code. What it does not have is in the limits above.

Do I have to install the certificate on my Mac?

Not for the separate browser, which trusts the proxy by SPKI hash. Safari, native Mac apps and the iOS Simulator need the CA: one press each.

I see nothing from my Flutter (or Go, or Unity) app.

Some runtimes ignore the system proxy. The troubleshooting skill has the few lines that fix it in a debug build.