| # Headless vs Headed |
|
|
| PinchTab instances can run Chrome in two modes: |
|
|
| - **Headless**: no visible browser window |
| - **Headed**: visible browser window |
|
|
| You usually run one server with `pinchtab`, then start instances in either mode through the API or CLI. |
|
|
| --- |
|
|
| ## Headless mode |
|
|
| Headless is the default mode for managed instances. |
|
|
| ```bash |
| curl -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"mode":"headless"}' |
| # CLI Alternative |
| pinchtab instance start |
| # Response |
| { |
| "id": "inst_0a89a5bb", |
| "profileId": "prof_278be873", |
| "profileName": "instance-1741400000000000000", |
| "port": "9868", |
| "headless": true, |
| "status": "starting" |
| } |
| ``` |
|
|
| ### Good fit for |
|
|
| - agents and automation |
| - CI and batch jobs |
| - containers and remote servers |
| - higher-throughput workloads |
|
|
| ### Tradeoffs |
|
|
| - no visible browser window |
| - debugging usually happens through snapshots, screenshots, text extraction, and logs |
|
|
| --- |
|
|
| ## Headed mode |
|
|
| Headed mode launches a visible Chrome window. |
|
|
| ```bash |
| curl -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"mode":"headed"}' |
| # CLI Alternative |
| pinchtab instance start --mode headed |
| # Response |
| { |
| "id": "inst_1b9a5dcc", |
| "profileId": "prof_278be873", |
| "profileName": "instance-1741400000000000001", |
| "port": "9869", |
| "headless": false, |
| "status": "starting" |
| } |
| ``` |
|
|
| ### Good fit for |
|
|
| - development |
| - debugging |
| - local testing |
| - visual verification |
| - human-in-the-loop workflows |
|
|
| ### Tradeoffs |
|
|
| - requires a display environment |
| - usually uses more CPU and memory than headless mode |
|
|
| --- |
|
|
| ## Side-by-side comparison |
|
|
| | Aspect | Headless | Headed | |
| |---|---|---| |
| | Visibility | No window | Visible window | |
| | Debugging | Snapshot- and log-based | Direct visual feedback | |
| | Display required | No | Yes | |
| | CI use | Strong fit | Usually poor fit | |
| | Local development | Fine | Usually easier | |
| | Resource usage | Lower | Higher | |
|
|
| --- |
|
|
| ## Recommended workflows |
|
|
| ## Development workflow |
|
|
| Use a visible browser while you are building and validating the flow: |
|
|
| ```bash |
| curl -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"mode":"headed"}' |
| # CLI Alternative |
| pinchtab instance start --mode headed |
| ``` |
|
|
| When you need persistence, create a profile first: |
|
|
| ```bash |
| curl -X POST http://localhost:9867/profiles \ |
| -H "Content-Type: application/json" \ |
| -d '{"name":"dev"}' |
| # Response |
| { |
| "status": "created", |
| "id": "prof_278be873", |
| "name": "dev" |
| } |
| ``` |
|
|
| Then launch the profile in headed mode: |
|
|
| ```bash |
| curl -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"profileId":"prof_278be873","mode":"headed"}' |
| # CLI Alternative |
| pinchtab instance start --profileId prof_278be873 --mode headed |
| # Response |
| { |
| "id": "inst_ea2e747f", |
| "profileId": "prof_278be873", |
| "profileName": "dev", |
| "port": "9868", |
| "headless": false, |
| "status": "starting" |
| } |
| ``` |
|
|
| ## Production workflow |
|
|
| Use headless mode for repeatable unattended work: |
|
|
| ```bash |
| for i in 1 2 3; do |
| curl -s -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"mode":"headless"}' | jq . |
| done |
| # CLI Alternative |
| for i in 1 2 3; do |
| pinchtab instance start |
| done |
| ``` |
|
|
| --- |
|
|
| ## Inspecting a headless instance |
|
|
| You can debug a headless instance through tab APIs. |
|
|
| List the instance tabs: |
|
|
| ```bash |
| curl http://localhost:9867/instances/inst_0a89a5bb/tabs | jq . |
| # Response |
| [ |
| { |
| "id": "CDP_TARGET_ID", |
| "instanceId": "inst_0a89a5bb", |
| "url": "https://pinchtab.com", |
| "title": "PinchTab" |
| } |
| ] |
| ``` |
|
|
| Then inspect the tab: |
|
|
| ```bash |
| curl http://localhost:9867/tabs/CDP_TARGET_ID/snapshot | jq . |
| ``` |
|
|
| ```bash |
| curl http://localhost:9867/tabs/CDP_TARGET_ID/text | jq . |
| ``` |
|
|
| ```bash |
| curl http://localhost:9867/tabs/CDP_TARGET_ID/screenshot > page.jpg |
| ``` |
|
|
| --- |
|
|
| ## Display requirements |
|
|
| Headed instances need a display environment. |
|
|
| ### macOS |
|
|
| Headed mode works with the native desktop session. |
|
|
| ### Linux |
|
|
| Headless works anywhere. |
| Headed mode needs X11 or Wayland. |
|
|
| ```bash |
| ssh -X user@server 'pinchtab instance start --mode headed' |
| ``` |
|
|
| ### Windows |
|
|
| Headed mode works with the native desktop session. |
|
|
| ### Docker |
|
|
| Headless is the normal choice in containers: |
|
|
| ```bash |
| docker run -d -p 9867:9867 pinchtab/pinchtab |
| curl -X POST http://localhost:9867/instances/start \ |
| -H "Content-Type: application/json" \ |
| -d '{"mode":"headless"}' |
| ``` |
|
|
| --- |
|
|
| ## Dashboard |
|
|
| The dashboard lets you monitor running instances and profiles while you use either mode. |
|
|
| Useful views: |
|
|
| - Monitoring: running instances, status, tabs, and optional memory metrics |
| - Profiles: saved profiles, launch actions, and live details |
| - Settings: runtime and dashboard preferences |
|
|
| --- |
|
|
| ## Summary |
|
|
| - Use **headless** for unattended automation and scale. |
| - Use **headed** for local debugging and human-visible workflows. |
| - Choose the mode per instance, not per server. |
|
|