/pinchtab-dev
Develop and contribute to the PinchTab project. Use when working on PinchTab source code, adding features, fixing bugs, running tests, or preparing PRs. Triggers on "work on pinchtab", "pinchtab development", "contribute to pinchtab", "fix pinchtab bug", "add pinchtab feature".
Claude Code
$ npx -y skills add pinchtab/pinchtab --skill pinchtab-dev --agent claude-code
Codex
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a codex -y
Cursor
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a cursor -y
Gemini CLI
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a gemini-cli -y
GitHub Copilot
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a github-copilot -y
OpenCode
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a opencode -y
Windsurf
$ npx skills add pinchtab/pinchtab --skill pinchtab-dev -a windsurf -y
SKILL.md
pinchtab-dev.SKILL.mdname: pinchtab-dev
description: Develop and contribute to the PinchTab project. Use when working on PinchTab source code, adding features, fixing bugs, running tests, or preparing PRs. Triggers on "work on pinchtab", "pinchtab development", "contribute to pinchtab", "fix pinchtab bug", "add pinchtab feature".
PinchTab Development
PinchTab is a browser control server for AI agents — Small Go binary with HTTP API.
Project Location
Run everything from the repository root (a clone of `github.com/pinchtab/pinchtab`).
Dev Commands
All development commands run via `./dev`:
| Command | Description | |---------|-------------| | `./dev build` | Build the application | | `./dev dev` | Build & run | | `./dev dashboard` | Hot-reload dashboard development (Vite + Go) | | `./dev run` | Run the application | | `./dev check` | All checks (Go + Dashboard + Plugin) | | `./dev check go` | Go checks only | | `./dev check dashboard` | Dashboard checks only | | `./dev test unit` | Go unit tests | | `./dev test dashboard` | Dashboard unit tests | | `./dev e2e basic` | Basic suite (api + cli + infra) | | `./dev e2e extended` | Extended suite (all extended) | | `./dev e2e smoke` | Smoke suite | | `./dev smoke` | Host Docker smoke checks (`--browser=chrome\|cloak\|all`) | | `./dev e2e test "<name>"` | Run a single E2E test by `start_test` name | | `./dev all` | check + test + e2e extended (pre-push gate) | | `./dev binaries` | Build the full release binary matrix into dist/ | | `./dev doctor` | Setup dev environment |
Architecture
cmd/pinchtab/ CLI entry point
internal/
bridge/ Chrome CDP communication
handlers/ HTTP API handlers
server/ HTTP server
dashboard/ Embedded React dashboard
config/ Configuration
routes/ API route catalogue
assets/ Embedded assets (stealth.js)
dashboard/ React dashboard source (Vite + TypeScript)
tests/e2e/ E2E runner, fixtures, scenarios/{api,cli,infra,plugin}/Workflow: New Feature or Bug Fix
1. **Create branch** from `main`:
git checkout main && git pull
git checkout -b feat/my-feature # or fix/my-bug
2. **Make changes** — follow code patterns in existing files
3. **Run checks locally**:
./dev all # check + test + e2e (one-shot pre-push gate)
# …or individually:
./dev check # Lint + format + typecheck
./dev test unit # Go unit tests
./dev e2e basic # E2E tests (Docker required)
4. **Commit** with conventional commits, usually scoped — `fix(extract): … (PIN-394)`:
- `feat:` new feature
- `fix:` bug fix
- `refactor:` code change without behavior change
- `test:` adding tests
- `docs:` documentation
- `chore:` maintenance
5. **Push and create PR**
Definition of Done (PR Checklist)
Required — Code Quality
- Error handling explicit — all errors wrapped with `%w`, no silent failures
- No regressions — verify stealth, token efficiency, session persistence
- SOLID principles — functions do one thing, testable
- No redundant comments — explain *why*, not *what*
Required — Testing
- New/changed functionality has tests
- Docker E2E tests pass locally: `./dev e2e basic` (or `./dev all` for the full chain)
- If npm wrapper touched: `npm pack` and `npm install` work
Required — Documentation
- README.md updated if user-facing changes
- /docs/ updated if API/architecture changed
Required — Review
- PR description explains what + why
- Commits are atomic with good messages
Key Files
| File | Purpose | |------|---------| | `internal/assets/stealth.js` | Bot detection evasion (light/medium/full levels) | | `internal/bridge/bridge.go` | Chrome CDP bridge | | `internal/handlers/*.go` | HTTP API endpoints | | `dashboard/src/` | React dashboard source | | `internal/routes/routes.go` | API route catalogue | | `tests/e2e/scenarios/api/` | API E2E tests | | `tests/e2e/scenarios/cli/` | CLI E2E tests |
Testing
Unit Tests
./dev test unit # All Go tests
go test ./internal/handlers # Specific package
E2E Tests (requires Docker)
./dev e2e basic # Basic suite (api + cli + infra)
./dev e2e api # API basic tests
./dev e2e cli # CLI basic tests
./dev e2e infra # Infra basic tests
./dev e2e api-extended # API extended tests (multi-instance)
./dev e2e cli-extended # CLI extended tests
./dev e2e infra-extended # Infra extended tests (multi-instance)
./dev e2e extended # Full extended suite (all extended tests)
./dev smoke # Host Docker smoke checks (not an e2e suite)
# Run specific test file(s) with filter (second argument)
./dev e2e api clipboard # Run only clipboard-basic.sh
./dev e2e api-extended tabs # Run tabs-extended.sh
./dev e2e cli browser # Run browser-basic.sh in CLI suite
# Run a single test by its start_test name (fastest debug loop)
./dev e2e test "click with humanize: click input by ref"
./dev e2e test "scroll (down)"
./dev e2e test "low-level mouse"
The scenario filter is one plain substring (no regex, no `|`) matched against scenario file names, groups, tiers, helpers and tags. Requires Docker daemon running.
Single-test mode (`dev e2e test "<name>"`)
Use this when iterating on one specific E2E failure. The runner:
1. Greps `tests/e2e/scenarios/**/*.sh` for `start_test "...<name substring>..."`. 2. Auto-picks the suite (`api`/`cli`/`infra`/`plugin`) and `-extended` variant (or `smoke` for `*-smoke.sh`) from the matching scenario file's path. 3. Builds the images (`compose build`, then `up`) and runs, inside that scenario file, **only the `start_test`...`end_test` blocks whose name contains the substring** — the scenario preamble (helper sourcing, `FIXTURES_URL`, etc.) is preserved, every other test in the file is skipped.
Note
Read more
name: pinchtab-dev description: Develop and contribute to the PinchTab project. Use when working on PinchTab source code, adding features, fixing bugs, running tests, or preparing PRs. Triggers on "work on pinchtab", "pinchtab development", "contribute to pinchtab", "fix pinchtab bug", "add pinchtab feature".
PinchTab Development
PinchTab is a browser control server for AI agents — Small Go binary with HTTP API.
Project Location
Run everything from the repository root (a clone of `github.com/pinchtab/pinchtab`).
Dev Commands
All development commands run via `./dev`:
| Command | Description | |---------|-------------| | `./dev build` | Build the application | | `./dev dev` | Build & run | | `./dev dashboard` | Hot-reload dashboard development (Vite + Go) | | `./dev run` | Run the application | | `./dev check` | All checks (Go + Dashboard + Plugin) | | `./dev check go` | Go checks only | | `./dev check dashboard` | Dashboard checks only | | `./dev test unit` | Go unit tests | | `./dev test dashboard` | Dashboard unit tests | | `./dev e2e basic` | Basic suite (api + cli + infra) | | `./dev e2e extended` | Extended suite (all extended) | | `./dev e2e smoke` | Smoke suite | | `./dev smoke` | Host Docker smoke checks (`--browser=chrome\|cloak\|all`) | | `./dev e2e test "<name>"` | Run a single E2E test by `start_test` name | | `./dev all` | check + test + e2e extended (pre-push gate) | | `./dev binaries` | Build the full release binary matrix into dist/ | | `./dev doctor` | Setup dev environment |
Architecture
cmd/pinchtab/ CLI entry point
internal/
bridge/ Chrome CDP communication
handlers/ HTTP API handlers
server/ HTTP server
dashboard/ Embedded React dashboard
config/ Configuration
routes/ API route catalogue
assets/ Embedded assets (stealth.js)
dashboard/ React dashboard source (Vite + TypeScript)
tests/e2e/ E2E runner, fixtures, scenarios/{api,cli,infra,plugin}/Workflow: New Feature or Bug Fix
1. **Create branch** from `main`:
git checkout main && git pull git checkout -b feat/my-feature # or fix/my-bug
2. **Make changes** — follow code patterns in existing files
3. **Run checks locally**:
./dev all # check + test + e2e (one-shot pre-push gate) # …or individually: ./dev check # Lint + format + typecheck ./dev test unit # Go unit tests ./dev e2e basic # E2E tests (Docker required)
4. **Commit** with conventional commits, usually scoped — `fix(extract): … (PIN-394)`:
- `feat:` new feature
- `fix:` bug fix
- `refactor:` code change without behavior change
- `test:` adding tests
- `docs:` documentation
- `chore:` maintenance
5. **Push and create PR**
Definition of Done (PR Checklist)
Required — Code Quality
- Error handling explicit — all errors wrapped with `%w`, no silent failures
- No regressions — verify stealth, token efficiency, session persistence
- SOLID principles — functions do one thing, testable
- No redundant comments — explain *why*, not *what*
Required — Testing
- New/changed functionality has tests
- Docker E2E tests pass locally: `./dev e2e basic` (or `./dev all` for the full chain)
- If npm wrapper touched: `npm pack` and `npm install` work
Required — Documentation
- README.md updated if user-facing changes
- /docs/ updated if API/architecture changed
Required — Review
- PR description explains what + why
- Commits are atomic with good messages
Key Files
| File | Purpose | |------|---------| | `internal/assets/stealth.js` | Bot detection evasion (light/medium/full levels) | | `internal/bridge/bridge.go` | Chrome CDP bridge | | `internal/handlers/*.go` | HTTP API endpoints | | `dashboard/src/` | React dashboard source | | `internal/routes/routes.go` | API route catalogue | | `tests/e2e/scenarios/api/` | API E2E tests | | `tests/e2e/scenarios/cli/` | CLI E2E tests |
Testing
Unit Tests
./dev test unit # All Go tests go test ./internal/handlers # Specific package
E2E Tests (requires Docker)
./dev e2e basic # Basic suite (api + cli + infra) ./dev e2e api # API basic tests ./dev e2e cli # CLI basic tests ./dev e2e infra # Infra basic tests ./dev e2e api-extended # API extended tests (multi-instance) ./dev e2e cli-extended # CLI extended tests ./dev e2e infra-extended # Infra extended tests (multi-instance) ./dev e2e extended # Full extended suite (all extended tests) ./dev smoke # Host Docker smoke checks (not an e2e suite) # Run specific test file(s) with filter (second argument) ./dev e2e api clipboard # Run only clipboard-basic.sh ./dev e2e api-extended tabs # Run tabs-extended.sh ./dev e2e cli browser # Run browser-basic.sh in CLI suite # Run a single test by its start_test name (fastest debug loop) ./dev e2e test "click with humanize: click input by ref" ./dev e2e test "scroll (down)" ./dev e2e test "low-level mouse"
The scenario filter is one plain substring (no regex, no `|`) matched against scenario file names, groups, tiers, helpers and tags. Requires Docker daemon running.
Single-test mode (`dev e2e test "<name>"`)
Use this when iterating on one specific E2E failure. The runner:
1. Greps `tests/e2e/scenarios/**/*.sh` for `start_test "...<name substring>..."`. 2. Auto-picks the suite (`api`/`cli`/`infra`/`plugin`) and `-extended` variant (or `smoke` for `*-smoke.sh`) from the matching scenario file's path. 3. Builds the images (`compose build`, then `up`) and runs, inside that scenario file, **only the `start_test`...`end_test` blocks whose name contains the substring** — the scenario preamble (helper sourcing, `FIXTURES_URL`, etc.) is preserved, every other test in the file is skipped.
Note
High-performance browser automation bridge and multi-instance orchestrator with advanced stealth injection and real-time dashboard.
Other skills on pinchtab.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about pinchtab-dev.
- Which coding agents can use pinchtab-dev?
- pinchtab-dev installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

