File size: 11,381 Bytes
9a5fb1f 6a7089a 9a5fb1f 6a7089a 9a5fb1f 6a7089a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 | ---
title: PinchTab
sdk: docker
app_port: 7860
---
<p align="center">
<img src="assets/pinchtab-headless.png" alt="PinchTab" width="200"/>
</p>
<p align="center">
<strong>PinchTab</strong><br/>
<strong>Browser control for AI agents</strong><br/>
12MB Go binary β’ HTTP API β’ Token-efficient
</p>
<table align="center">
<tr>
<td align="center" valign="middle">
<a href="https://pinchtab.com/docs"><img src="assets/docs-no-background-256.png" alt="Full Documentation" width="92"/></a>
</td>
<td align="left" valign="middle">
<a href="https://github.com/pinchtab/pinchtab/releases/latest"><img src="https://img.shields.io/github/v/release/pinchtab/pinchtab?style=flat-square&color=FFD700" alt="Release"/></a><br/>
<a href="https://github.com/pinchtab/pinchtab/actions/workflows/go-verify.yml"><img src="https://img.shields.io/github/actions/workflow/status/pinchtab/pinchtab/go-verify.yml?branch=main&style=flat-square&label=Build" alt="Build"/></a><br/>
<img src="https://img.shields.io/badge/Go-1.25+-00ADD8?style=flat-square&logo=go&logoColor=white" alt="Go 1.25+"/><br/>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-blue?style=flat-square" alt="License"/></a>
</td>
</tr>
</table>
---
## What is PinchTab?
PinchTab is a **standalone HTTP server** that gives AI agents direct control over Chrome.
For day-to-day local use, the server is typically installed as a user-level daemon, allowing agent tools to reuse the same browser control plane running in the background.
```bash
curl -fsSL https://pinchtab.com/install.sh | bash
# or
pinchtab daemon install
```
This installs the control-plane server and starts a default headless Chrome instance, ready to accept requests from agents or manual API calls.
If you prefer not to run a daemon, or if you're on Windows, you can instead run:
`pinchtab server` β runs the control-plane server directly
`pinchtab bridge` β runs a single browser instance as a lightweight runtime
PinchTab also provides a CLI with an interactive entry point for local setup and common tasks:
`pinchtab`
## Security
PinchTab defaults to a **local-first security posture**:
- `server.bind = 127.0.0.1`
- sensitive endpoint families are disabled by default
- `attach` is disabled by default
- IDPI is enabled with a **local-only website allowlist**
> [!CAUTION]
> By default, IDPI restricts browsing to **locally hosted websites only**.
> This prevents agents from navigating the public internet until you explicitly allow it.
> The restriction exists to make the security implications of browser automation clear before enabling wider access.
See the full guide: [docs/guides/security.md](docs/guides/security.md)
## What can you use it for
### Headless navigation
With the daemon installed and an agent skill configured, an agent can execute tasks like:
```
"What are the main news about aliens on news.com?"
```
PinchTab exposes browser tools that allow agents to navigate pages, extract structured content, and interact with the DOM without wasting tokens on raw HTML or images.
### Headed navigation
In addition to headless automation, PinchTab supports headed Chrome profiles.
You can create profiles configured with authentication, cookies, extensions, or specific environments. Each profile can have a name and description.
For example, an agent request like:
```
"Log into my work profile and download the weekly report"
```
can automatically select the appropriate profile and perform the action.
### Local container isolation
If you prefer stronger isolation, PinchTab can run inside Docker.
This allows agents to control browsers in a sandboxed environment, reducing risk when running automation tasks locally.
### Distributed automation
PinchTab can manage multiple Chrome instances (headless or headed) across containers or remote machines.
Typical use cases include:
- QA automation
- testing environments
- distributed browsing tasks
- development tooling
You can connect to multiple PinchTab servers, or attach to Chrome instances running in remote debug mode.
## Process Model
PinchTab is server-first:
1. install the daemon or run `pinchtab server` for the full control plane
2. let the server manage profiles and instances
3. let each managed instance run behind a lightweight `pinchtab bridge` runtime
In practice:
- Server β the main product entry point and control plane
- Bridge β the runtime that manages a single browser instance
- Attach β an advanced mode for registering externally managed Chrome instances
### Primary Usage
The primary user journey is:
1. install Pinchtab
2. install and start the daemon with `pinchtab daemon install`
3. point your agent or tool at `http://localhost:9867`
4. let PinchTab act as your local browser service
That is the default βreplace the browser runtimeβ scenario.
Most users should not need to think about `pinchtab bridge` directly, and only need `pinchtab` when they want the local interactive menu.
### Key Features
- **CLI or Curl** β Control via command-line or HTTP API
- **Token-efficient** β 800 tokens/page with text extraction (5-13x cheaper than screenshots)
- **Headless or Headed** β Run without a window or with visible Chrome
- **Multi-instance** β Run multiple parallel Chrome processes with isolated profiles
- **Self-contained** β ~15MB binary, no external dependencies
- **Accessibility-first** β Stable element refs instead of fragile coordinates
- **ARM64-optimized** β First-class Raspberry Pi support with automatic Chromium detection
---
## Quick Start
### Installation
**macOS / Linux:**
```bash
curl -fsSL https://pinchtab.com/install.sh | bash
```
**Homebrew (macOS / Linux):**
```bash
brew install pinchtab/tap/pinchtab
```
**npm:**
```bash
npm install -g pinchtab
```
### Shell Completion
Generate and install shell completions after `pinchtab` is on your `PATH`:
```bash
# Generate and install zsh completions
pinchtab completion zsh > "${fpath[1]}/_pinchtab"
# Generate bash completions
pinchtab completion bash > /etc/bash_completion.d/pinchtab
# Generate fish completions
pinchtab completion fish > ~/.config/fish/completions/pinchtab.fish
```
**Docker:**
```bash
docker run -d \
--name pinchtab \
-p 127.0.0.1:9867:9867 \
-v pinchtab-data:/data \
--shm-size=2g \
pinchtab/pinchtab
```
The bundled container persists its managed config at `/data/.config/pinchtab/config.json`.
If you want to supply your own config file instead, mount it and point `PINCHTAB_CONFIG` at it:
```bash
docker run -d \
--name pinchtab \
-p 127.0.0.1:9867:9867 \
-e PINCHTAB_CONFIG=/config/config.json \
-v "$PWD/config.json:/config/config.json:ro" \
-v pinchtab-data:/data \
--shm-size=2g \
pinchtab/pinchtab
```
### Use It
**Terminal 1 β Start the server:**
```bash
pinchtab server
```
**Recommended for daily local use β install the daemon once:**
```bash
pinchtab daemon install
pinchtab daemon
```
That keeps PinchTab running in the background so your agent tools can reuse it without an open terminal.
**Terminal 2 β Control the browser:**
```bash
# Navigate
pinchtab nav https://pinchtab.com
# Get page structure
pinchtab snap -i -c
# Click an element
pinchtab click e5
# Extract text
pinchtab text
```
Or use the HTTP API directly:
```bash
# Create an instance (returns instance id)
INST=$(curl -s -X POST http://localhost:9867/instances/launch \
-H "Content-Type: application/json" \
-d '{"name":"work","mode":"headless"}' | jq -r '.id')
# Open a tab in that instance
TAB=$(curl -s -X POST http://localhost:9867/instances/$INST/tabs/open \
-H "Content-Type: application/json" \
-d '{"url":"https://pinchtab.com"}' | jq -r '.tabId')
# Get snapshot
curl "http://localhost:9867/tabs/$TAB/snapshot?filter=interactive"
# Click element
curl -X POST "http://localhost:9867/tabs/$TAB/action" \
-H "Content-Type: application/json" \
-d '{"kind":"click","ref":"e5"}'
```
---
## Core Concepts
**Server** β The main PinchTab process. It manages profiles, instances, routing, and the dashboard.
**Instance** β A running Chrome process. Each instance can have one profile.
**Profile** β Browser state (cookies, history, local storage). Log in once, stay logged in across restarts.
**Tab** β A single webpage. Each instance can have multiple tabs.
**Bridge** β The single-instance runtime behind a managed instance. Usually spawned by the server, not started manually.
Read more in the [Core Concepts](https://pinchtab.com/docs/core-concepts) guide.
---
## Why PinchTab?
| Aspect | PinchTab |
|--------|----------|
| **Tokens performance** | β
|
| **Headless and Headed** | β
|
| **Profile** | β
|
| **Advanced CDP control** | β
|
| **Persistent sessions** | β
|
| **Binary size** | β
|
| **Multi-instance** | β
|
| **External Chrome attach** | β
|
---
## Privacy
PinchTab is a fully open-source, local-only tool. No telemetry, no analytics, no outbound connections. The binary binds to `127.0.0.1` by default. Persistent profiles store browser sessions locally on your machine β similar to how a human reuses their browser. The single Go binary (~16 MB) is fully verifiable: build from source at [github.com/pinchtab/pinchtab](https://github.com/pinchtab/pinchtab).
---
## Documentation
Full docs at **[pinchtab.com/docs](https://pinchtab.com/docs)**
### MCP (SMCP) integration
An **SMCP plugin** in this repo lets AI agents control PinchTab via the [Model Context Protocol](https://github.com/sanctumos/smcp) (SMCP). One plugin exposes 15 tools (e.g. `pinchtab__navigate`, `pinchtab__snapshot`, `pinchtab__action`). No extra runtime deps (stdlib only). See **[plugins/README.md](plugins/README.md)** for setup (env vars and paths).
---
## Examples
### AI Agent Automation
```bash
# Your AI agent can:
pinchtab nav https://pinchtab.com
pinchtab snap -i # Get clickable elements
pinchtab click e5 # Click by ref
pinchtab fill e3 "user@pinchtab.com" # Fill input
pinchtab press e7 Enter # Submit form
```
### Data Extraction
```bash
# Extract text (token-efficient)
pinchtab nav https://pinchtab.com/article
pinchtab text # ~800 tokens instead of 10,000
```
### Multi-Instance Workflows
```bash
# Run multiple instances in parallel
curl -s -X POST http://localhost:9867/instances/start \
-H "Content-Type: application/json" \
-d '{"profileId":"alice","mode":"headless"}'
curl -s -X POST http://localhost:9867/instances/start \
-H "Content-Type: application/json" \
-d '{"profileId":"bob","mode":"headless"}'
# Each instance is isolated
curl http://localhost:9867/instances
```
See [chrome-files.md](chrome-files.md) for technical details on how PinchTab manages Chrome user data directories and ensures isolation between parallel instances.
---
## Development
Want to contribute? Start with [CONTRIBUTING.md](CONTRIBUTING.md).
The full setup and workflow guide lives at [docs/guides/contributing.md](docs/guides/contributing.md).
**Quick start:**
```bash
git clone https://github.com/pinchtab/pinchtab.git
cd pinchtab
./dev doctor # Verifies environment, offers hooks/deps setup
go build ./cmd/pinchtab # Build pinchtab binary
```
---
## License
MIT β Free and open source.
---
**Get started:** [pinchtab.com/docs](https://pinchtab.com/docs)
|