Terminal sharing with end-to-end encryption. Host a shell session, guests connect and view in real-time.
- End-to-end encryption (Curve25519 key exchange, AES-GCM)
- Direct P2P connections with relay fallback
- Read-only guests by default, host can grant write access
- Session recording to file
- Port forwarding through encrypted channel
- Cross-platform: Windows (ConPTY), Linux, macOS (PTY)
- Self-hosted signaling server
- Single static binary
git clone https://github.com/GH05TCREW/shellshare
cd shellshare
go build -o shellshare cmd/shellshare/main.goshellshare serve --addr :7777shellshare host --server ws://localhost:7777/wsPrints session ID and join command. Session is read-only by default.
Options:
--allow-write- Allow guests to type--name <name>- Set host name--record <file>- Record session to file--forward-target <host:port>- Expose local service to guests--session <id>- Use custom session ID
shellshare guest <session-id> --server ws://localhost:7777/wsOptions:
--user <name>- Set guest name--forward-listen <:port>- Access host's forwarded service locally
shellshare list --server ws://localhost:7777/wsType these in the host terminal:
/grant <user|*>- Grant write access/revoke <user|*>- Revoke write access/who- List connected guests/quit- End session
Optional ~/.shellshare/config.toml:
[server]
signaling_url = "ws://localhost:7777/ws"
[security]
auto_approve_guests = false
fingerprint_verification = true
session_timeout = 3600
[display]
show_join_notifications = true
color_scheme = "auto"Environment variables:
SHELLSHARE_SIGNALING_URLSHELLSHARE_NAMESHELLSHARE_ALLOW_WRITESHELLSHARE_READ_ONLY
- Host and guests connect to signaling server via WebSocket
- Curve25519 key exchange establishes shared secret per guest
- Host attempts direct TCP connection to each guest
- Falls back to relay through signaling server if direct fails
- Terminal data encrypted with AES-GCM before transmission
- Server cannot decrypt traffic (end-to-end encryption)
Host exposes a local service:
shellshare host --forward-target localhost:8080Guest accesses it:
shellshare guest <session-id> --forward-listen :8080
# Now localhost:8080 on guest connects to host's serviceHost records all output:
shellshare host --record session.logReplay:
cat session.log- Each guest gets unique encryption key
- Signaling server only routes encrypted envelopes
- Fingerprint verification on connection
- Host controls write permissions per guest
- No plaintext transmission
MIT