Skip to content

Fix: add compatibility for sandbox environments by replacing Unix sockets with tcp localhost#18

Open
dudgeon wants to merge 2 commits into
pasky:mainfrom
dudgeon:main
Open

Fix: add compatibility for sandbox environments by replacing Unix sockets with tcp localhost#18
dudgeon wants to merge 2 commits into
pasky:mainfrom
dudgeon:main

Conversation

@dudgeon

@dudgeon dudgeon commented Mar 15, 2026

Copy link
Copy Markdown

In sandboxed environments (Claude Code on macOS Seatbelt, Linux seccomp),
net.createServer().listen() on a Unix domain socket path fails with
EPERM: operation not permitted. Since the daemon is spawned with
stdio: 'ignore', this error is silently swallowed, breaking all
page-level commands (snap, eval, click, type, etc.).

Replace Unix domain sockets with TCP localhost on ephemeral ports:

server.listen(0, '127.0.0.1') lets the OS assign a random port
Port, PID, and auth token written atomically to a .port discovery file
Parent reads the port file to connect and authenticates with the token
Auth token (randomBytes + timingSafeEqual) compensates for TCP's weaker
access control vs Unix socket file permissions
This pattern mirrors Chrome DevTools (--remote-debugging-port=0 +
DevToolsActivePort file), Jupyter kernels, nREPL (.nrepl-port), and
VS Code Remote (connectionToken).

claude and others added 2 commits March 15, 2026 02:37
In sandboxed environments (Claude Code on macOS Seatbelt, Linux seccomp),
net.createServer().listen() on a Unix domain socket path fails with
EPERM: operation not permitted. Since the daemon is spawned with
stdio: 'ignore', this error is silently swallowed, breaking all
page-level commands (snap, eval, click, type, etc.).

Replace Unix domain sockets with TCP localhost on ephemeral ports:
- server.listen(0, '127.0.0.1') lets the OS assign a random port
- Port, PID, and auth token written atomically to a .port discovery file
- Parent reads the port file to connect and authenticates with the token
- Auth token (randomBytes + timingSafeEqual) compensates for TCP's weaker
  access control vs Unix socket file permissions

This pattern mirrors Chrome DevTools (--remote-debugging-port=0 +
DevToolsActivePort file), Jupyter kernels, nREPL (.nrepl-port), and
VS Code Remote (connectionToken).

https://claude.ai/code/session_01SzqvCN7CacGJXyEfKDwXXK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants