pinchtab

pinchtabMIT活跃维护

用 Go 写的高性能浏览器自动化桥接与多实例编排器,支持反检测注入和实时面板,适合大规模网页抓取与浏览器 Agent 调度。

High-performance browser automation bridge and multi-instance orchestrator with advanced stealth injection and real-time dashboard.

v0.15.2发布于 2026-08-26 12:06 UTC10,569star +9 / 7 天789fork同步于 2026-11-10 11:29 UTC

怎么上手

由 README 提炼,执行前请确认
curl -fsSL https://pinchtab.com/install.sh | bash
pinchtab nav https://pinchtab.com --snap
硬件要求按 README 说明

README 未说明显存或 GPU 要求;需本机安装 Chrome 或 Chromium,macOS 建议用 Chrome for Testing 等专用自动化浏览器而非日常 Chrome;Docker 方式建议 --shm-size=2g。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

给 AI Agent 用的 Chrome 控制桥,小体积 Go 二进制加 HTTP API,省 token 地操作浏览器

用 Go 写的高性能浏览器自动化桥接与多实例编排器,支持反检测注入和实时面板,适合大规模网页抓取与浏览器 Agent 调度。

核心能力

  • 以 HTTP API 暴露导航、快照、点击、取文本等浏览器操作
  • 用快照和结构化内容替代原始 HTML 与截图,减少 token 消耗
  • 支持无头与有头 Chrome 配置文件,可带认证、Cookie、扩展
  • 可跨容器或远程机器编排多个 Chrome 实例
  • 内置站点审计与两版本视觉对比,可作 CI 门禁

容易踩的坑

默认 IDPI 只允许访问本地托管网站,需显式放行才能浏览公网;HTTP API 每个请求都要带 server token,可用 pinchtab config token --stdout 获取;默认只绑定 127.0.0.1,对外暴露需自行处理 token、TLS 与网络边界;Windows 支持为尽力而为,建议直接跑 pinchtab server 或 pinchtab bridge 而非 daemon。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.15.2
  1. v0.15.2最新正式版2026-08-26 · 2026-08-26 12:06 UTC

    Changelog

    • bf7627b2ffda9d597fde27eebc7e66122990e4b7 Merge pull request #627 from pinchtab/dependabot/npm_and_yarn/npm/js-yaml-4.3.1
    • d81a2a8b0ef9cd060b4cfdd5b315488f18306a18 Merge pull request #632 from pinchtab/fix/npm-global-install-home-divergence
    • d3ea1fecbfc12cc9d2f78562e23b00778da73057 Merge pull request #635 from valkyriweb/fix/daemon-owned-autostart
    • 44833c9c0910d8c1db9f12ce0d0a87c0db72c3c3 Merge pull request #636 from pinchtab/fix/tab-budget-orphans
    • 36763f8694556919c25ec53acfb75b99b47775ac Merge pull request #637 from pinchtab/fix/keyboard-type-focused-633
    • ea1f8dd7138a448a19f0a088ace114968a8e02f7 Merge pull request #638 from pinchtab/fix/wait-url-634
    • e0a5a4e7e7d7e198d3bb1acb62ef91b393500683 Merge pull request #639 from pinchtab/chore/npm-eslint-10
    • 95e98cfec3c214143e1ecd012799e46351a81be7 Merge pull request #640 from pinchtab/chore/improvements
    • 96d1508b44721674e3bff2f3bbd21401ec270a63 Merge pull request #641 from pinchtab/feat/grok-plugin
    • 4bf14ca52b4a3d4aa3425d17bf8fedaeeeb1005d chore(deps-dev): bump js-yaml from 4.3.0 to 4.3.1 in /npm
    • fc11d4b34d20c3da84a3b436ac6c7e5fd296dc9a docs(skills): align the pinchtab skill with the split keyboard, wait, and instances commands
    • 2519c4e659cb7ca4582298d93b8155cdc0118d2b feat(ci): run the extended suites on every merge to main and smoke nightly
    • d8bf0e2280d40e96a5688648c0f7178d0ee34a39 feat(e2e): run each scenario file in its own subshell so no scenario inherits another's state
    • 2ab9a73f59e1b804b3e1054c34d16c572b337537 feat(e2e): write per-test timings json and add a --slowest report
    • 9d89944a8894ba3f58e81fe65d1450bdda8fa33b feat(handlers): declare each route's tab guard set in the catalog and verify it through the mux
    • 4855926329d0483bc3ee961a9613b939db8415c1 feat(plugins): add Grok Build plugin
    • 1ad5967334d4cfa6469b07f8642f12c0c4a6f357 feat(traceability): log the unredacted failure cause server-side, keyed by requestId
    • 0fe9e8dc47000979b39d6f2d75bd5b2c1729c45c fix(ci): constrain dispatched workflow refs
    • ce4d4749555c54e043f37eb8dcc368302cee0096 fix(ci): disable plugin workflow package cache
    • de1270e218243bbb0c0cdf4ae377be6b97fcc917 fix(ci): enrol the audit CLI implementation and guard every audit source against the map
    • b32843706ebfce006f92e9c973a5b273a488a4b0 fix(ci): escalate extended suites from product paths, not only test churn
    • 5c2fdd05608c7dba6a460ba545566639082c6547 fix(ci): fail the preamble budget step when -run matches no test
    • 55f0aa965e4c68abf8434473176e894e15a88cf8 fix(ci): remove reusable plugin ref input
    • 1f33bad8081a34111c34c45e98746ecaf7da724f fix(cli): declare the json flag on instance list, not only on the deprecated alias
    • 22eb3209bbff4b4b31ab6c240306d8bf40168a05 fix(cli): give instance its own list subcommand and print arg errors once
    • 2fab0fce83aee9eafd93269d8f54287d53cf0c0e fix(cli): keep config token prose off stdout and fail loudly without a clipboard
    • b92458762f500596454325eb899be896c3a6d396 fix(e2e): decide a scenario's verdict from its EXIT trap so an explicit exit cannot skip it
    • bcfd22af01607403e43418f2bef04f0916a75035 fix(e2e): match dockerignore patterns root-relative so nested context files reach the digest
    • 16045b77f8b43bb76ea3ca79f9c689c3abb48ead fix(e2e): pin config token to the contract that fails loudly without a clipboard
    • 6b53194e6ed173ff281e778bbaddccb4f14f89b0 fix(handlers): refuse the mutating tab endpoints while a tab is paused for human handoff
    • da15d2d82d89bc159fad25950e36e718b6c45e81 fix(plugins): correct profile routing and smoke coverage
    • dc2802be429a410bba55c008489b4bdebd970837 fix(snapshot): charge maxTokens what the formatter emits instead of a hand-modelled estimate
    • 5c7c5de4262871bf78f74260a6caabf31833cb14 fix(snapshot): honour the documented interactive alias instead of ignoring it
    • f91948c3191146e60bff4faa0b7f16db514006a4 fix(snapshot): reject invalid cost controls and report the query params the server ignores
    • 2a5fb25839aa8487d5098a84d296e5a3240b0e71 fix(test): stamp each pream
  2. v0.15.12026-08-03 · 2026-08-03 15:09 UTC
    查看更新说明

    Changelog

    • 90581b083a4ea8ed09e16d3c1ff0ae949cddf0ad Merge pull request #609 from dlronray/codex/pinchtab-backlog-20260713
    • d2cecbfedaa95f11525687c32737b7afe1782856 Merge pull request #611 from pinchtab/dependabot/npm_and_yarn/npm/brace-expansion-1.1.16
    • ca73fadd4730305bb00864ad478d5001d7c1eb3f Merge pull request #612 from pinchtab/dependabot/npm_and_yarn/npm/js-yaml-4.3.0
    • 4efcae376f4cc27879c51e7dc4e45a34f3484fec Merge pull request #613 from pinchtab/fix/orchestrator-attach-test-flake
    • d7b16d31ca47f443f0094eb5dd06b6061a0af5cd Merge pull request #617 from pinchtab/fix/issue-616-nav-headless-copy
    • e9c0957bb05cbd4df97f06fca727aecb43fa82c8 Merge pull request #623 from dertbv/nav-timeout-option
    • 7d299732fcf01e862b66b690e722d4ff0fd902e5 Merge pull request #624 from pinchtab/feat/improvements
    • 980177c0e9721aec497af1178972fee8d070ab64 Merge pull request #625 from pinchtab/fix/new-tab-navigation-readiness
    • a61e86802da0ef5ded2b27b9c8c46d5999999f67 Merge pull request #626 from pinchtab/fix/cli-errors-and-windows-screenshots
    • 90c66e8744733687537a580afa9ae11f8150e7c0 chore(deps-dev): bump brace-expansion from 1.1.12 to 1.1.16 in /npm
    • 90f4bfc16759a65049ce174b267d4fa3afdad341 chore(deps-dev): bump js-yaml from 4.2.0 to 4.3.0 in /npm
    • 9788bebb461d7432a66483e90177db08e8ef0565 decision: 'scroll down' moves 800px on the CLI and 120px via MCP, and the MCP tool documents no magnitude, so an agent silently gets a sixth of the distance (PIN-233)
    • 3fcf58802d22c6b09c08088eb8e0d8415b7a22a7 feat: CLI persists each snapshot's vocabulary token per tab and echoes it on the next action (PIN-084)
    • 75fdb27f1eebad06481ab217202f7a0f3b203801 feat: GET /visible and the capture snapshot's visible field answer… (PIN-188)
    • 3ced64b9bafacb6fbf4ef6d4bb48ea0a7ad33c01 feat: MCP tools carry the snapshot vocabulary token so a superseded ref is refused not mis-resolved (PIN-084)
    • 14f4eb15618eb78ff8d97dbc6e873a9ce9639c4e feat: add MCP back, forward and reload tools (PIN-065)
    • baa22c09ed0eac08af640a2a1f726dcfed6c9838 feat: census-test the isolated-handle ambient-globals rule (PIN-070)
    • 679d1f1fab7125292a60acf3559836afadb41927 feat: expose scheduler.maxBatchSize as an operator config key (PIN-192)
    • 8d22f58c969b0b934073407b04320649abfc556d feat: make a snapshot ref denote a DOM node rather than a row index, so refs survive a change of filter, selector or depth (PIN-090)
    • 48b42003bef1674ff1c07dff02d60a2058e78a07 feat: make background-tab capture activation configurable via instanceDefaults.captureAllowActivation
    • c5bd812e2c237907c5c635cf7320bbb6b59e1a82 feat: reclaim quarantined profiles on demand with pinchtab profiles prune (PIN-194)
    • d9b711ea5f5845ed62dac7bef955ee9a5c8a4f72 feat: report the launched browser binary version on /stealth/status (PIN-074)
    • 0e614352debbc0bb3c350c4d158e4e32f10c0baa feat: surface quarantined profiles and their total size where operators already look PIN-041
    • 01795a8529bd7b22fcb4ccb964b55d0ac46a1a9a fix(bridge): open new tabs in background to stop foreground focus-steal
    • a338f0e8e1eb08167c656d2f104bc5404be107f0 fix: --server redirects the destination but the credential stays ambient, so pointing the CLI at any host sends the local config's server.token to it in cleartext (PIN-247)
    • c65bccc70cfcc4a5d58296f09afd30644b3b1ef3 fix: --server redirects the destination but the credential stays ambient, so pointing the CLI at any host sends the local config's server.token to it in cleartext (PIN-247)
    • a66c6c0b5e64c212802d0d1e5ee319d39c9805e3 fix: -v with a persisted server.logLevel silently does not raise the level, and nothing on screen says why (PIN-104)
    • 95d4b0137d52e242e8cb1170e13a3cb85d323e17 fix: /box returns frame-relative coordinates for cross-frame refs PIN-032
    • 0e3f7b5ebfd736f785ea2bcbece07bd542a33af5 fix: /network serialises the whole request list twice under entries and items PIN-030
    • d0290661db7f74000575a35247384db81263f56b fix: /text default Readability mode can drop 97% of a page and reports truncated:false PIN-
  3. v0.15.02026-07-18 · 2026-07-18 18:17 UTC
    查看更新说明

    Changelog

    • 996c83bdeeea3a2eb5e37a6a0446b861b9f555f5 Merge pull request #608 from pinchtab/feat/interactive-annotate
    • 42b81ce41ce7e6486108c8d3eaf446f4cf146acc Merge pull request #610 from pinchtab/feat/site-scrape
    • 958ecad00c734c3f30fb23923503ddc800b2444a build: consume released seaportal v0.2.0
    • ff177089d776bec8f15d9fdfb9ca5fc9b105d662 feat: add GET /a11y/audit with rule-based accessibility score
    • 460e85063e9d24a55ac20169f72f9dce38c1e64e feat: add GET /timing endpoint with navigation timing and core web vitals
    • 29dc0edbeaa437556d1ce0c743b52eb01bd69baa feat: add POST /audit/page single-page browser enrichment engine
    • 59234533afaa5800806f81d0732559e40bb757be feat: add deterministic audit fixture site with live and staging variants
    • f0704b27ffb23da7798373ff6f9afd54626d7ef9 feat: add deterministic template-group sampling to audit runs
    • 047ed665f14d4157584acbd9eaae9a38be456ac6 feat: add persistent clickable annotate overlay for copying element references
    • 58d96c498476191fe86da998571a539924de4cc0 feat: add pinchtab audit command and multi-page POST /audit runner
    • edfe722b6fed03c5b13f5902fbcf0b281be2a611 feat: add pinchtab compare command with visual and data diffs
    • 7b855ce104b7b2abed1fb76e789fec6506c766a4 feat: add public pinchtabaudit library client with enrich example
    • 17570aa5808321bd28ce129dc7263f0caa419bfe feat: add pure-go visual diff engine with annotated diff images
    • 009fe3ce7bcdb4899da2f6c65480d238ecf27180 feat: add rule-based security findings to audit runs
    • 75ac1ad20369381ad94b913198a7d54025e2c63c feat: add site scrape with preview and expand modes
    • d9a7f6053487f34ce29a603f1a1b65056826ad4e feat: capture console logs on cloak via a console domain fallback session
    • ab761bd33795ff5a43ebce20652e11e17c4bd872 feat: define audit data model and report schema in internal/audit
    • 4757bc23a27009df6a82d5f47a7182519d956502 feat: detect broken assets via GET /network?broken=true
    • f7a60256e9deab957be9481faef36f7eaf131884 feat: export audit report as pdf via existing printtopdf
    • 1aa390e8ccec4e5f3263f60ae3bd5b99e12519bd feat: expose scrape as the pinchtab_scrape mcp tool
    • e1c0f543d8534017f52bd5f97df3a86645f16706 feat: ingest seaportal results and route enrichment via browserRecommended
    • 83b05320231e741870734e4d2482ccb9fddbb237 feat: isolate injected cookies and auto-discover cloakbrowser default
    • 8ac8850dd8ddbe4050433d7bb4784c938ca310b4 feat: render audit and comparison reports as markdown and html
    • b926b6c378c001fb988ca6427a8b86c43ef1260b feat: support cookie injection and profile auth in audit runs
    • df0e4642f828e1d84445f2d3c47f52bdf20534d5 fix: add --tab support to upload and download commands
    • 24d8c6fc906b9b4f7070f17f7a9b38e8df754b09 fix: clarify cloakbrowser doctor status
    • 4adcc2280271a58c6ca37d82d6f727bbd1f9ee53 fix: clear stale annotate overlay on empty refresh, 400 on bad selector, wire shared --tab flag
    • ea784ee7ca2bd76f67a43cac83cf2ae1dd4f0bf3 fix: enable the runtime domain synchronously so early console entries are not dropped
    • 0894a587f04715752e4a9f372054bfbf1d221e71 fix: explain route 404s from older instances instead of bare error
    • e97825120a6c8e4375759e55b3dc93ebb60cd598 fix: harden authenticated site runs
    • 53f1b5a02c531506233d23ee3ec9a7cceab93c3e fix: identify authenticated pinchtab servers in port-busy errors
    • 2f4f73244edf2053e1463c6ee53808a2f08aba66 fix: route isolated cookie runs through orchestrator
    • 7d199d3ded0b692a3c074603e7f1ff8afe31be5a fix: support browser-free seaportal audits
    • 9d763f263484684df7ab71e8f30c24df87f1e816 fix: validate audit format flags before starting the run
    • 5ddfc2f4542ff48aff49af70a255d4a19aabca81 fix: widen the trusted click timeout to survive cpu contention
    • 59b3aeeba1272ea9ac20e7b7fe29a5003ed77dfd refactor: streamline pinchtab skill guidance
    • 82a3e60f735c4ce5bbc11c9899b01467a2270049 test: add audit reproducibility golden and error-path e2e coverage
    • 7765a50658919ee0e44866592ba1b3e191f321a2 test: add scrape e2e scenario and scrape-site fixture
    • 52db1d11c
  4. v0.14.12026-07-08 · 2026-07-08 10:43 UTC
    查看更新说明

    Changelog

    • b32e83916c407152d7d108235a05e77231d660e8 Merge branch 'main' into dependabot/go_modules/golang.org/x/net-0.55.0
    • db21255ca81619383b3505f7432ad17cb7295121 Merge pull request #605 from pinchtab/fix/issue-602-npm-postinstall
    • 28f1b56c9b08700d93c384dc9bbabe717d437050 Merge pull request #606 from pinchtab/dependabot/go_modules/golang.org/x/net-0.55.0
    • 8dad0fcb53f4bcc9a815629d2fdd6ddeee845847 chore(deps): bump golang.org/x/net from 0.53.0 to 0.55.0
    • 4a964742d7821e3f12b64f8aaf47aa49e304c6b7 fix(npm): resolve package version from dist/src installs
    • 40ef95e582cc7f01fce0a3704601d2b65e974045 test: add clean-container npm install smoke to ./dev smoke
  5. v0.14.02026-06-28 · 2026-06-28 15:09 UTC
    查看更新说明

    🚀 Overview

    v0.14.0 introduces a provider-runtime abstraction that lets pinchtab drive multiple browser backends through one interface, with a new cloak browser provider and target-aware orchestration. Stealth, live screencast control, recording, and onboarding all get meaningful upgrades.

    Highlights

    • 🌐 Multi-provider browsers — new cloak browser support and a provider runtime abstraction; navigation, capture, and upload now route per-browser, with ensureChrome generalized to ensureBrowser.
    • 🥷 Stealthier automation — silent-drop recovery with stealth-score tooling, humanized click dialogs, two-phase static-first navigation, and hardened stealth provider routing.
    • 🎮 Interactive screencast — held-modifier keyboard chords, clicks scaled into the CSS viewport, a kept-alive/auto-reconnecting stream, and modifier keys dispatched as real key events.
    • 🎥 Recording fixes — valid mp4/webm capture and GIFs honored at full resolution.
    • 🛡️ Security — opt-in file:// scheme gated behind security.allowFileScheme, masked sensitive config values, legacy CDP attach allowlist enforcement, and an openclaw security bump.
    • 🩺 Reliability & onboarding — improved browser discovery and doctor diagnostics, fail-fast under memory pressure (no more 60s hangs), smoother session autostart, shadow-root selector/upload fixes, and a new docker soak/stability lane.

    Changelog

    • 2b40958b0a22e1839b7a755255bd9652b988dd19 Merge branch 'main' into codex/upload-shadow-root-selector
    • 059980d3fbc3724e0c1794859ef0ea506ec8cf63 Merge branch 'main' into dependabot/npm_and_yarn/npm/js-yaml-4.2.0
    • 2af0e5e3a93ff81f6d72d9f30a51953dccde7402 Merge branch 'main' into feat/file-scheme-opt-in
    • 232db91f7de7b655a9505164f5f0f6cf1979d918 Merge pull request #589 from pinchtab/feat/cloakbrowser-support
    • a7fcfd767661178656f83267a7a731dac9feed2e Merge pull request #590 from pinchtab/dependabot/npm_and_yarn/npm/js-yaml-4.2.0
    • a3bdb93259d9f707f00157ca4752dfd9b287e32a Merge pull request #592 from chaochaoweb3/codex/upload-shadow-root-selector
    • 1e073756e0fc315aea888347e3498ed8602bc885 Merge pull request #593 from pinchtab/fix/openclaw-security-bump
    • 9519b8205290f8911c2b58bd1fcdc9b46eaf46f8 Merge pull request #594 from pinchtab/feat/file-scheme-opt-in
    • 3276e8c3bb82960bb8a7b1e940f5f4d556c9fbd8 Merge pull request #596 from pinchtab/fix/record-encode-mp4-webm-585
    • 06c30f27f82e370442b0e8fbf9332fe9e88704fe Merge pull request #598 from pinchtab/feat/screencast-interactivity
    • e2af8d888acb4d7d8d07f9a5c6716c2ed942bb7b Merge pull request #599 from pinchtab/fix/e2e-cloak-ghostchrome-stock-image
    • 547461dcf394c78a38a9154f4b26dbc19a6500f3 Merge pull request #600 from pinchtab/fix/e2e-cloak-stock-tag
    • af1b557ba0c3a4e045a17c3f735f39a01c016898 Merge pull request #601 from pinchtab/fix/browser-discovery-doctor-and-docs
    • e6e7decfc1789169a35bc604e3428834679c8d5e chore(deps-dev): bump js-yaml from 4.1.1 to 4.2.0 in /npm
    • a622c9c2e08d4b31c7151a3f1ae0fab619e09cde feat: add cloak browser support and browser abstraction
    • 0d57b275147016762ae970ce1fe1bbc2ef218b1f feat: add opt-in file:// navigation scheme gated by security.allowFileScheme
    • 0116638085c9f72421bee5769b38cd776dae07de feat: add target-aware browser orchestration
    • ef899469b98dbdae517831dee62c59e7c7c5d4f9 feat: cloakbrowser support basics
    • 291ea7cee244127a1c06c95cd151a7384ba553c8 feat: cloakbrowser support with provider runtime abstraction
    • 52d07595b194243e6b86a640df2de5000d21a87d feat: forward held modifiers through the screencast pointer path
    • d1f97b53a812bee5697f760e17a335dde5eda40f feat: harden humanized click dialogs and stealth provider routing
    • c2d5b507bb48fddd7894267bf646433e7fa7da81 feat: keep the screencast stream alive and more responsive
    • 0e3ca05274b5c2176a46e17ad9aec05396d5a05d feat: route /capture and pinchtab_capture per-browser
    • 2b22982433fbf23212171de8305625ff235a3831 feat: silent-drop recovery + stealth-score measurement tooling
    • d2f72d0dbd3b0f

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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.

    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.

    PinchTab is designed first for local, single-user control on a machine you manage. Remote and distributed layouts are supported, but they are advanced operator-managed deployments. If you bind beyond loopback, publish ports, or attach remote bridges, you are responsible for tokens, network boundaries, TLS or reverse proxying, and which endpoint families you expose.

    If you run PinchTab on a different machine, do it only when you understand the security model. Keep it on a private or otherwise closed network, avoid exposing it directly to the public internet, and keep high-risk endpoint families disabled unless you explicitly need them. If you do enable them, lock them down so only the systems that need them can reach them.

    [!WARNING] The dashboard, HTTP API, MCP server, and remote CLI integrations are privileged operator control surfaces. They are not designed for untrusted users, multi-tenant exposure, or direct public-internet access. If you are unsure how to secure a non-local deployment, review docs/guides/security.md and use the private security contact path in SECURITY.md before exposing the service.

    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

    Running bare pinchtab runs the security setup on first use, then prints server status, the security posture, and suggested next steps:

    pinchtab

    Security

    PinchTab defaults to a local-first security posture:

    • server.bind = 127.0.0.1
    • dashboard session cookies are Secure only when the dashboard is actually served over HTTPS
    • sensitive endpoint families are disabled by default
    • attach is disabled by default
    • IDPI is enabled with a local-only website allowlist

    If you intentionally access the dashboard over plain HTTP on a non-loopback address, PinchTab now warns in the UI that the session is running without transport encryption. Prefer HTTPS or localhost when possible. If you force server.cookieSecure = true, dashboard login requires HTTPS and will fail explicitly on plain HTTP instead of looping silently.

    [!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.

    Expanding browsing to non-local or non-trusted websites is a security-reducing choice. Hostile pages can still increase browser attack surface and interact badly with enabled automation features even when PinchTab's content defenses are on.

    See the full guide: docs/guides/security.md

    Remote, container, and distributed setups are possible, but PinchTab is not positioned as a turnkey internet-facing browser service. Treat any non-local deployment as an advanced setup that you must secure explicitly.

    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.

    Site audits and visual comparison

    PinchTab can audit whole sites at the browser level — screenshots, console errors, broken assets, accessibility score, Core Web Vitals, and security findings — and compare two site versions visually before a release:

    pinchtab audit https://example.com --output-dir ./audit          # report.json + screenshots/
    pinchtab audit https://example.com/sitemap.xml --sitemap --sample-size 2 --output-dir ./audit
    pinchtab compare https://example.com https://staging.example.com --fail-on-diff   # CI gate
    

    See docs/audit.md for the full command reference, report anatomy, and CI examples.

    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 bare pinchtab for first-run setup or a status overview.

    Agent plugins (binary still installed separately):

    # Grok Build, after listing in the official xAI marketplace
    grok plugin install pinchtab --trust
    
    # OpenClaw
    openclaw plugins install @pinchtab/pinchtab
    

    Grok users can install from the PinchTab repository marketplace or directly from GitHub. See the Grok plugin install and usage guide.

    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 — single ~30MB binary; drives a locally installed Chrome or Chromium
    • Accessibility-first — Element refs that denote a DOM node, not a row: the same e5 survives a change of filter, selector or depth (filtered views are sparse), and expires only on navigation to a new document
    • ARM64-optimized — First-class Raspberry Pi support with automatic Chromium detection
    • CloakBrowser support — Optional drop-in provider for sites that fingerprint stock Chromium. PinchTab launches a user-supplied CloakBrowser binary; no CloakBrowser is bundled in released artifacts. See docs/guides/cloakbrowser.md.

    Quick Start

    Installation

    macOS / Linux:

    curl -fsSL https://pinchtab.com/install.sh | bash
    

    Homebrew (macOS / Linux):

    brew install pinchtab/tap/pinchtab
    

    npm:

    npm install -g pinchtab
    

    Agent skill

    The npm package ships the pinchtab agent skill and copies it into every agent home it detects (~/.claude/skills, ~/.cursor/skills, ~/.windsurf/skills, ~/.codex/skills, OpenClaw) on install and upgrade, printing what it wrote. The shipped copy carries the release version and a content hash in its frontmatter, so a stale or hand-edited copy is detectable without a source checkout:

    pinchtab skill status           # each detected copy vs the bundled skill; exit 1 if any is stale
    pinchtab skill update           # install or refresh; an edited copy is kept and reported
    pinchtab skill update --force   # replace an edited copy
    

    Inside a checkout, scripts/install-skills.sh symlinks the repo skills instead so edits are live; the sync never writes through a symlink.

    Platform Support

    PinchTab's primary tested operator workflow is local macOS and Linux.

    Windows binaries are published, but Windows support is currently limited and best-effort because the project does not have the same level of automated and manual coverage there. On Windows, prefer running pinchtab server or pinchtab bridge directly instead of relying on the daemon workflow.

    On macOS, prefer a dedicated automation browser (Google Chrome for Testing or Chromium) over your daily Google Chrome. Driving your primary Chrome headless can prevent it from opening a normal window while PinchTab is running. PinchTab now prefers a dedicated browser automatically, and pinchtab doctor browsers warns if automation would fall back to your primary Chrome — install Chrome for Testing or set browser.binary to a separate build. See docs/reference/config.md.

    Shell Completion

    Generate and install shell completions after pinchtab is on your PATH:

    # 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:

    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:

    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

    First useful command — auto-starts the local server if needed:

    pinchtab nav https://pinchtab.com --snap
    

    Or start the server explicitly when you want foreground logs:

    pinchtab server
    

    Recommended for daily local use — install the daemon once:

    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:

    # Navigate; starts the server automatically if needed
    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 (every request needs the server token):

    export PINCHTAB_TOKEN=$(pinchtab config token --stdout)
    
    # Create a profile first (returns profile id)
    PROF=$(curl -s -X POST http://localhost:9867/profiles \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"name":"work"}' | jq -r '.id')
    
    # Start an instance for that profile (returns instance id)
    INST=$(curl -s -X POST http://localhost:9867/instances/start \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -H "Content-Type: application/json" \
      -d "{\"profileId\":\"$PROF\",\"mode\":\"headless\"}" | jq -r '.id')
    
    # Open a tab in that instance
    TAB=$(curl -s -X POST http://localhost:9867/instances/$INST/tabs/open \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"url":"https://pinchtab.com"}' | jq -r '.tabId')
    
    # Get snapshot
    curl -H "Authorization: Bearer $PINCHTAB_TOKEN" "http://localhost:9867/tabs/$TAB/snapshot?filter=interactive"
    
    # Click element
    curl -X POST "http://localhost:9867/tabs/$TAB/action" \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -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 guide.


    Why PinchTab?

    AspectPinchTab
    Tokens performance✅
    Headless and Headed✅
    Profile✅
    Advanced CDP control✅
    Persistent sessions✅
    Binary size✅
    Multi-instance✅
    External Chrome attach✅

    Benchmark: PinchTab vs agent-browser

    Measured end-to-end agent-loop token cost (Anthropic API), percentages read as "PinchTab is N% cheaper than agent-browser on this metric":

    ScopeCost cheaperFewer requestsFewer tokens
    Basic Haiku (10 steps)9.5%23.0%17.9%
    Extended Haiku (24 steps)19.6%31.1%26.2%
    Extended Sonnet (24 steps)20.3%29.4%25.3%

    The cost gap widens with workload length (click→snapshot round trips compound) and is roughly model-invariant at extended scope.

    See the benchmark summary for an overview, or the benchmark deep dive for full methodology, per-run tables, and raw logs.


    Privacy

    PinchTab is a fully open-source, local-first tool. No telemetry, no analytics, and no required outbound service dependency. 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. Remote and distributed deployments are available for advanced use cases, but they are explicit operator-managed setups rather than the default posture. The single Go binary (~30 MB) is fully verifiable: build from source at github.com/pinchtab/pinchtab.


    Documentation

    Full docs at pinchtab.com/docs

    Examples

    AI Agent Automation

    # Your AI agent can:
    pinchtab nav https://pinchtab.com
    pinchtab snap -i  # Get clickable elements
    pinchtab click e5 # Click by ref
    pinchtab fill e3 "[email protected]"  # Fill input
    pinchtab press e7 Enter              # Submit form
    

    Data Extraction

    # Extract text (token-efficient)
    pinchtab nav https://pinchtab.com/article
    pinchtab text  # ~800 tokens instead of 10,000
    

    Multi-Instance Workflows

    # Run multiple instances in parallel (profiles "alice" and "bob" must already exist — see POST /profiles above)
    curl -s -X POST http://localhost:9867/instances/start \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"profileId":"alice","mode":"headless"}'
    
    curl -s -X POST http://localhost:9867/instances/start \
      -H "Authorization: Bearer $PINCHTAB_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"profileId":"bob","mode":"headless"}'
    
    # Each instance is isolated
    curl -H "Authorization: Bearer $PINCHTAB_TOKEN" http://localhost:9867/instances
    

    See 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. The full setup and workflow guide lives at docs/guides/contributing.md.

    Quick start:

    git clone https://github.com/pinchtab/pinchtab.git
    cd pinchtab
    ./dev doctor                # Verifies environment, offers hooks/deps setup
    ./dev --help                # Shows the developer toolkit commands
    go build ./cmd/pinchtab     # Build pinchtab binary
    

    For diagnostics of your installed PinchTab + browser config (config file loads, browser found and version adequate, a headless launch exposes CDP, request shapes handled; CloakBrowser adds fingerprint-flag and font checks), use:

    pinchtab doctor             # human-readable report
    pinchtab doctor --json      # machine-readable
    pinchtab doctor --check <name>    # run a single check by name
    pinchtab doctor browser <name>    # scope to one browser.targets entry
    

    License

    MIT — Free and open source.


    Get started: pinchtab.com/docs