Reported issues for DOMShell
Pod holds 17 of 21 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.
Back to DOMShell.
Most discussed
Playwright/Puppeteer backend
Alternative to the Chrome extension for headless agent workflows.
Use Playwright or Puppeteer as the browser automation backend instead of the Chrome debugger API.
From roadmap: Platform
Read the thread · 2026-02-08 · open · 6 comments
MCP server: confirmAction can deadlock the Node event loop in non-TTY parents
Symptom
When the MCP server is launched without `--no-confirm` from a non-interactive parent (Claude Desktop, Cursor, any GUI MCP client), a `tier === "write"` command can deadlock the entire Node.js event loop instead of producing a clear deny.
Root cause
`confirmAction` (mcp-server/index.ts:85) attempts to read user input via:
```typescript const fd = openSync("/dev/tty", "r+"); writeSync(fd, prompt); const bytesRead = readSync(fd, buf, 0, 10, null
Read the thread · 2026-05-26 · closed · 3 comments
feat(extension): honor initial_url for group_id="new" — eliminate about:blank placeholder on lane creation
Goal
Eliminate the about:blank placeholder tab that gets created on group_id="new" lane creation when the agent already knows the URL it wants to start at. Make the fresh lane's working tab navigate directly to the target URL.
Background
Today, group_id="new" triggers createAgentLane() → groupNew(["agent"]) which calls chrome.tabs.create({ url: "about:blank", active: false }) to get a tab Chrome will let us group. Then the agent's first open <url> call creates a second t
Read the thread · 2026-06-17 · closed · 2 comments
feat(extension): drop eager groupNew on SESSION_START — connection-default lane should only exist if explicitly requested via group_id="new"
Goal
Stop the eager groupNew(["agent"]) call in the WS bridge's SESSION_START handler. The connection-default lane (the Chrome tab group with one about:blank tab, titled 🐚 agent) that's currently auto-created on every MCP initialize should not exist. Isolation should happen only when the agent explicitly requests it via group_id="new".
Why this is the right fix
A QA-UX integrator team reported that orphan agent tab groups accumulate across connection cycles — unattribu
Read the thread · 2026-06-20 · closed · 1 comment
createAgentLane silently swallows groupNew failure — group_id="new" can return no [lane:] marker with no error
Symptom
domshell_execute with group_id="new" sometimes returns a successful command result with no [lane: ...] marker and no error. The agent has no signal that their requested isolated lane was never created — they just see the command output and have no handle to rejoin.
Observed during 2.0.2 validation cycle (cowork agent and Claude Desktop, multiple times).
Root cause
Read the thread · 2026-06-01 · closed · 1 comment
Stdio MCP disconnect leaves auto-assigned lanes orphaned
Symptom
In stdio MCP mode, every connection auto-creates a lane (`mcp:
For stdio MCP, every connection is genuinely fresh — there's no reconnect case. A wrapper that opens a fresh `ClientSession` for each call (the canonical pattern when the agent doesn't want long-lived MCP state, e.g., HKUDS/CLI-Anything's n
Read the thread · 2026-05-29 · closed · 1 comment
Document continue-on-error semantics of multi-line domshell_execute
What needs documenting
`mcp-server/index.ts:1115-1127` — when `domshell_execute` receives multi-line input, the splitter runs each line in sequence and does not halt on error:
```typescript for (const line of lines) { if (lines.length > 1) out.push(`$ ${line}`); const r = await execWithSecurity(line, sidRef.sid, lane); out.push(r.result); laneId = r.laneId; if (lane === "new" && r.lane
Read the thread · 2026-05-27 · closed · 1 comment
js / eval can hang the MCP call when the expression returns a non-resolving Promise
Symptom
`js ` and `eval ` (same kernel function under the hood) can hang indefinitely if the user's expression returns a Promise that never resolves — or if the expression triggers a page-level deadlock (broken navigation, beforeunload that waits on something, infinite loop in a handler).
The MCP-side call sees a timeout. The CDP target stays stuck. Worst case the agent gives up and the user sees a stalled tool call.
Surfaced 2026-05-25 by an agent dispatching mouse events
Read the thread · 2026-05-26 · closed · 1 comment
Most recent
bug(extension+mcp-server): WS bridge goes zombie after long idle; one-sided keepalive cannot detect it (timeouts -32001 until manual restart)
Symptom
After DOMShell has been idle for hours/days (no MCP traffic, Claude Desktop wasn't actively driving the browser), the next domshell_execute call from a client hits an MCP -32001 Request timed out. The container is healthy, the WS socket on port 9876 still reads ESTABLISHED in netstat, the side panel says "connected (authenticated)" — but commands sent over the WS never get a response. Only fix observed: restart the thv proxy AND the Chrome extension (both — neither alone re
Read the thread · 2026-06-12 · open · 0 comments
AX-tree collapsing hides React-handler-bearing inner divs (LinkedIn-style fake links)
Symptom
Some SPAs bind their React activation handlers to an inner `
Read the thread · 2026-05-26 · open · 0 comments
Agent-declared sessions — address a DOMShell lane by id, for multi-chat isolation and handoff
Problem
DOMShell gives each MCP connection its own isolated session (#33). But MCP exposes no identity below the connection — clients like Claude Desktop multiplex every chat over a single connection, so two chats land in the same lane and share it.
Proposed direction
Add an optional group_id parameter to domshell_execute:
- omitted → the connection's current lane (stable — never spawns a new one)
"new"→ create a fresh lane; the command runs in it; the new id is retu
Read the thread · 2026-05-22 · open · 0 comments
Session tab-group isolation — agent works in its own tab group while you browse
Problem
When DOMShell drives the browser, there is no separation between the agent's tabs and the user's tabs — the agent attaches to a tab inside the user's normal Chrome window. You cannot tell which tabs the agent controls, and nothing stops it from navigating or acting on a tab you are actively using. Sharing one Chrome window between a human and an agent is error-prone.
Proposal
When an MCP session starts, DOMShell creates a labeled Chrome tab group and places its working tab(s) in
Read the thread · 2026-05-21 · open · 0 comments
Experiment: DOMShell vs Raw HTML interface comparison
Summary
Run an apples-to-apples comparison of DOMShell's AX-tree filesystem interface vs raw HTML scraping, using the same model (Qwen3-4B) on the same tasks.
Design
Core matrix — [nexa, ollama] x [domshell, html]:
| DOMShell | Raw HTML | |
|---|---|---|
| Nexa serve | agent.py via MCP | raw_html_agent.py via requests+BS4 |
| Ollama | agent.py via MCP | raw_html_agent.py via requests+BS4 |
All 4 cells use the same Qwen3-4B weights. Only variables: interfa
Read the thread · 2026-02-10 · open · 0 comments
Experiment: DOMShell vs Vision (browser-use) with same local model
Summary
Run the same Wikipedia tasks from experiments/nexa/ using Nexa's vision-based Web-Agent-Qwen3VL (Playwright + screenshots) and compare against the DOMShell results.
Why
The current Nexa experiment compares 1.7B/4B local models against Claude Opus — that's a model-size comparison, not an interface comparison. To validate DOMShell's text/AX-tree design, we need an apples-to-apples test: **same model, s
Read the thread · 2026-02-10 · open · 0 comments
--text flag: inline visible text previews for ls and find
Summary
Add a --text flag to ls and find that shows inline visible text previews per element using .innerText (rendered text only, respects CSS display:none and visibility:hidden).
Problem
When agents scan a page, they must cat each element individually to see what text it contains. For a page with 50 links, that's 50 tool calls just to read link labels.
Solution
ls --text and find --text
Shows a truncated, dimmed text preview inline with each element:
[x]
[Read the thread](https://github.com/apireno/DOMShell/issues/27) · 2026-02-08 · open · 0 comments
### Switch MCP server from stdio to SSE/Streamable HTTP transport
## Problem
The current MCP server uses stdio transport, meaning it must be spawned as a child process by a single MCP client (e.g. Claude Desktop). This means:
- Only one client can use it at a time (Claude Desktop OR Claude CLI, not both)
- Server lifecycle is tied to whichever client spawned it
- Each client needs its own config entry
## Solution
Switch to SSE (Server-Sent Events) or Streamable HTTP transport:
- MCP server runs as a standalone long-lived HTTP server on `localhost:9876/mcp`
[Read the thread](https://github.com/apireno/DOMShell/issues/26) · 2026-02-08 · open · 0 comments
### Standalone headless browser mode
Ship DOMShell as a self-contained headless Chromium process (via Chrome for Testing or embedded Chromium) that agents launch directly.
- No extension install, no user Chrome profile
- `npx domshell --headless` and connect via MCP
- Ideal for CI pipelines, server-side automation, and agent-in-a-loop workflows
From roadmap: **Platform**
[Read the thread](https://github.com/apireno/DOMShell/issues/23) · 2026-02-08 · open · 0 comments
The remaining reports are on [the project's issue tracker](https://github.com/apireno/DOMShell/issues).