Remote shell access platform. Access VM terminals via web browser without SSH.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Browser │◄──WS───►│ Server │◄──WS───►│ Agent │
│ (xterm.js) │ │ │ │ (on VM) │
└─────────────┘ └─────────────┘ └─────────────┘
- Agent runs on your VMs, connects outbound to server (works behind NAT)
- Server authenticates agents, proxies terminal sessions
- Browser shows connected VMs, click to open terminal
- No SSH required on VMs
- Works behind NAT/firewalls (agent connects outbound)
- 2-way authentication (token + Ed25519 signature)
- Full terminal support (vim, htop, colors, resize)
- Web-based UI with xterm.js
Download pre-built binaries from Releases or build from source.
mkdir -p keys
openssl genpkey -algorithm ed25519 -out keys/server.key
openssl pkey -in keys/server.key -pubout -out keys/server.pubgo build -o bin/server ./server
go build -o bin/agent ./agent./bin/server \
--port 8080 \
--server-key keys/server.key \
--token YOUR_SECRET_TOKENcurl -sL https://raw.githubusercontent.com/targc/holdthedoor/main/install-agent.sh | sudo bash -s -- \
--server wss://YOUR_SERVER/ws/agent \
--token YOUR_SECRET_TOKENUse
wss://for HTTPS servers,ws://for HTTP.
To uninstall:
curl -sL https://raw.githubusercontent.com/targc/holdthedoor/main/uninstall-agent.sh | sudo bashThis downloads the correct binary, installs it, and sets up a systemd service (Linux).
Or manually:
./agent \
--server wss://YOUR_SERVER/ws/agent \
--server-pubkey server.pub \
--token YOUR_SECRET_TOKEN \
--name "my-vm"Navigate to http://YOUR_SERVER:8080 - you'll see connected VMs in the sidebar.
docker build -f Dockerfile.server -t holdthedoor-server .
docker run -p 8080:8080 \
-v $(pwd)/keys:/app/keys:ro \
holdthedoor-server \
--server-key /app/keys/server.key \
--token YOUR_SECRET_TOKEN| Direction | Method |
|---|---|
| Agent → Server | Static token authentication |
| Server → Agent | Ed25519 signature verification |
The agent sends a random challenge; server signs it with private key. Agent verifies signature using server's public key. This prevents MITM attacks even if an attacker intercepts the token.
| Flag | Required | Description |
|---|---|---|
--port |
No | Server port (default: 8080) |
--server-key |
Yes | Path to Ed25519 private key |
--token |
Yes | Agent authentication token |
| Flag | Required | Description |
|---|---|---|
--server |
No | Server WebSocket URL (default: ws://localhost:8080/ws/agent) |
--server-pubkey |
Yes | Path to server's Ed25519 public key |
--token |
Yes | Authentication token |
--name |
No | VM display name (default: hostname) |
MIT