ish study run --localruns the browser on your machine (Playwright), straight athttp://localhost:3000. No tunnel, nothing leaves your laptop. Interactive studies only.ish connect <port>opens a Cloudflare tunnel so the remote simulators (the browser runs in the cloud) can reach your localhost. Use it when the run is dispatched in the cloud, which includes every run through the hosted MCP server.
Choose the mechanism
study run --local
The browser is Playwright on your machine. Fastest loop, watchable (
--headed), and your local app never leaves the laptop. Interactive only.ish connect
The cloud fleet reaches your localhost over a Cloudflare tunnel. Use it for cloud-dispatched runs, especially anything driven by the hosted MCP server or an agent.
| Question | study run --local | ish connect |
|---|---|---|
| Where does the browser run | Your machine (Playwright) | The cloud |
| Tunnel involved | No | Yes (Cloudflare) |
| Modalities | Interactive only | Whatever the cloud run supports |
| Watch the browser live | Yes (--headed, --slow-mo, --devtools) | No |
| Works through the hosted MCP server | No (it dispatches in the cloud) | Yes |
| Your localhost exposed to the internet | No | Yes, for the tunnel’s lifetime |
Run the browser on your machine
Point an iteration at a local URL, then dispatch with--local. The simulation runs in a Playwright browser on your machine. See the study run reference for the full flag set.
Create an iteration pointing at your local URL
http://localhost:3000 is fine here. The browser is local, so no tunnel is needed.--local is interactive only. Media (video, audio, document, image) and chat studies reject it. Run those in the cloud, or use ish connect if their content lives on your localhost.~/.ish/local-sim.log with --debug. Native local runs (iOS, Android) use the same --local path with --platform and --app; see the study run reference.
Expose localhost to the cloud fleet
When the run is dispatched in the cloud, the cloud browser cannot see yourlocalhost. Open a tunnel first, then dispatch as usual.
ish connect <port> spawns Cloudflare’s cloudflared, gets a public *.trycloudflare.com URL, and registers it with the backend. The cloud fleet routes requests for your study through that URL to your machine. Installing the CLI is the prerequisite; see the CLI quickstart.
Open the tunnel
cloudflared if it is not already on your PATH.Point the iteration at the tunnel URL
Use the printed
*.trycloudflare.com URL as the iteration’s URL, not localhost. The cloud browser resolves the tunnel host, not your loopback.--detach and --proxy, is in the connect reference.
Keep the tunnel running in the background
--detach forks after the first successful heartbeat and returns control to your shell. The detached tunnel is tracked in ~/.ish/connect.lock.
ish disconnect targets a detached tunnel.
Tunnel several local services through one URL
Pass--proxy /<prefix>=<port> (repeatable) to fan one tunnel across a frontend and its APIs. The CLI runs a small local reverse proxy, tunnels that, and routes by longest-prefix match (default goes to the primary port). One origin in the cloud browser means no CORS and no cookie crossover.
Through the hosted MCP server
An agent on the hosted MCP server dispatches every run in the cloud, so reaching your localhost always needs a tunnel. The hosted server cannot open one itself: itslocalhost is the cloud server’s loopback, not your machine. The connect write tool is local-only and is gated off in hosted mode.
So the tunnel comes from the CLI on your machine, and the agent reads its state:
- On your machine, run
ish connect <port>(orish connect <port> --detach). - The agent calls
connect_statusto confirm a tunnel is active and read itstunnel_url. This tool is read-only and works in hosted mode. - The agent uses that
tunnel_urlas the iteration URL (or as a chatbot endpoint), then dispatchesstudy_run.
ISH_AUTH_MODE=local) instead of using the hosted one, the connect tool is available and can open the tunnel directly, mirroring the CLI verb.
Common pitfalls
The run reaches the wrong page or refuses the connection
The run reaches the wrong page or refuses the connection
You likely pointed a cloud-dispatched run at
localhost. The cloud browser resolves localhost to its own loopback, not your machine. Either dispatch with --local, or open ish connect and point the iteration at the printed *.trycloudflare.com URL.--local rejected the study
--local rejected the study
--local is interactive only. Media and chat studies reject it. Run those in the cloud, or expose their local content with ish connect.ish connect status says no tunnel, but I started one
ish connect status says no tunnel, but I started one
A foreground
ish connect does not write the lock that status reads. Either keep the foreground process visible, or start it with --detach so ish connect status and ish disconnect can find it.cloudflared is missing
cloudflared is missing
The first
ish connect downloads cloudflared for your platform if it is not on your PATH. If the download fails, install it yourself (brew install cloudflare/cloudflare/cloudflared on macOS) and re-run.Next
Run a study end to end
The full happy path on the CLI and the MCP server.
connect, disconnect reference
Every flag for the tunnel commands.