WitNote / docs /headless-vs-headed.md
AUXteam's picture
Upload folder using huggingface_hub
6a7089a verified
# 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.