Ephemeral peer-to-peer tunnel chat from the terminal
Create secure, temporary chat rooms that connect peers directly through WebRTC tunnels. Perfect for quick collaboration, file sharing, or secure communication without leaving your terminal.
- 🔒 End-to-end encrypted peer-to-peer communication
- 🚀 Zero configuration - works out of the box
- 📱 Cross-platform - works on macOS, Linux, and Windows
- 🌐 NAT traversal - connects through firewalls and routers
- 💬 Real-time chat with typing indicators
- 📁 File sharing capabilities
- 🎯 Ephemeral rooms - automatically cleaned up
- 🔑 Pro features with TURN servers for reliable connections
# Start a chat room
npx tunnel-chat@latest
# Join an existing room
npx tunnel-chat@latest join <room-name>Get your API key and unlock premium features:
# Get your Pro API key
npx tunnel-chat@latest auth your-email@example.com
# Set your API key
export TUNNEL_API_KEY="sk_..."
# Now enjoy Pro features with reliable TURN servers
npx tunnel-chat@latestnpm install -g tunnel-chat
# or
pnpm add -g tunnel-chatnpx tunnel-chat@latest| Command | Description |
|---|---|
tunnel-chat |
Create or join a chat room |
tunnel-chat join <name> |
Join a specific room |
tunnel-chat auth <email> |
Get your Pro API key |
tunnel-chat upgrade |
Upgrade to Pro plan |
| Command | Description |
|---|---|
/help |
Show available commands |
/quit or /exit |
Leave the chat |
/upload <file> |
Share a file (Pro only) |
/fpkey |
Show DTLS fingerprints for verification |
| Variable | Description | Required |
|---|---|---|
TUNNEL_API_KEY |
Your Pro API key for premium features | No |
TUNNEL_SIGNAL |
Custom signaling server URL | No |
BILLING_SERVER |
Custom billing server URL | No |
# Set your Pro API key
export TUNNEL_API_KEY="sk_ditch_abc123..."
# Optional: Use custom signaling server
export TUNNEL_SIGNAL="wss://your-server.com"Upgrade to Pro for enhanced reliability and features:
- 🌐 TURN servers for guaranteed connectivity through corporate firewalls
- 📁 File uploads to cloud storage
- 🔄 Multi-peer rooms (coming soon)
- 🛡️ Priority support
Want to run your own instance? Here's how:
- Node.js 20+
- Stripe account (for billing)
- Resend account (for emails)
- Optional: TURN server for NAT traversal
# Required for billing
STRIPE_SECRET_KEY=sk_live_...
STRIPE_PRICE_ID=price_...
STRIPE_WEBHOOK_SECRET=whsec_...
# Required for email auth
RESEND_API_KEY=re_...
RESEND_FROM=no-reply@yourdomain.com
PUBLIC_BASE_URL=https://yourdomain.com
# Optional TURN server
TURN_SECRET=your-coturn-secret
TURN_REALM=yourdomain.com
# Server config
PORT=8787
KEYS_PATH=./server/keys.json# Build the image
docker build -t tunnel-chat .
# Run with environment variables
docker run -p 8787:8787 \
-e STRIPE_SECRET_KEY=sk_live_... \
-e RESEND_API_KEY=re_... \
tunnel-chat# Install Fly CLI
curl -L https://fly.io/install.sh | sh
# Deploy
fly deploy- End-to-end encryption: All messages are encrypted using WebRTC's built-in DTLS
- Ephemeral: Rooms are automatically deleted after inactivity
- No data retention: Messages are never stored on servers
- Peer verification: Use
/fpkeyto verify connection fingerprints - Open source: Full transparency - audit the code yourself
# Clone the repository
git clone https://github.com/razchiriac/tunnel-chat.git
cd tunnel-chat
# Install dependencies
pnpm install
# Build the project
pnpm run buildpnpm run dev # Development CLI
pnpm run server # Run signaling server only
pnpm run combined # Run combined billing + signaling server
pnpm run build # Build TypeScript to JavaScript┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client A │ │ Signaling │ │ Client B │
│ │◄──►│ Server │◄──►│ │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ Direct P2P Connection │
└──────────────────────────────────────┘
- Signaling Server: Facilitates WebRTC handshake
- TURN Servers: Help with NAT traversal (Pro only)
- Billing Server: Handles Stripe subscriptions and API keys
- P2P Connection: Direct encrypted communication between peers
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License - see LICENSE file for details.
- 🐛 Issues: GitHub Issues
- Built with WebRTC for peer-to-peer communication
- Stripe for payment processing
- Resend for transactional emails
- Cloudflare for CDN and DNS services
- Fly.io for hosting
Made with ❤️ by the Tunnel Chat team