web-terminal-server
Version:
Professional web-based terminal server with persistent sessions, live sharing, smart port detection, Cloudflare tunnels, and full CLI support
337 lines (245 loc) • 9.58 kB
Markdown
# 🖥️ Web Terminal Server
[](https://www.npmjs.com/package/web-terminal-server)
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org)
> Professional web-based terminal server with persistent sessions, live sharing, port monitoring, and full CLI support. Perfect for AI CLI tools like Claude Code, Codex, and Gemini CLI.
## ✨ Features
- 🔄 **Persistent Sessions** - Terminal processes keep running even when disconnected
- 🔗 **Live Sharing** - Share terminal sessions with unique URLs
- 💾 **Session History** - Full output history preserved across reconnections
- 🔍 **Smart Port Detection** - Automatic discovery of ports opened from your terminal
- 🌐 **Cloudflare Tunnels** - One-click public URLs with cloudflared integration
- 🚀 **Live Port Notifications** - Pop-up alerts when new ports are detected in terminal
- 📡 **Live Button** - Quick access to active tunnel URLs directly in terminal header
- 📁 **Quick Navigation** - Copy `cd` commands to process directories
- 🎮 **Mobile Support** - Touch-friendly controls for mobile devices
- 🔒 **Security Levels** - Configurable access control (full/limited/restricted)
- 📊 **Session Monitor** - Real-time monitoring with bulk management
- ✅ **Batch Operations** - Select and delete multiple sessions at once
- ⚡ **Optimized Performance** - Smart caching and efficient port tracking
- 🎨 **Modern UI** - Consistent design with glass-morphism effects and smooth animations
- 📱 **Help Modals** - Built-in interactive guides for all features
## 🚀 Quick Start
### Using npx (Recommended)
```bash
npx web-terminal-server
```
That's it! Your terminal server is now running at http://localhost:5000
### With custom options:
```bash
# Run on different port
npx web-terminal-server --port 3000
# Enable ngrok tunnel
npx web-terminal-server --ngrok
# Set security level
npx web-terminal-server --security limited
# Don't open browser automatically
npx web-terminal-server --no-browser
```
## 📦 Installation
### Global Installation
```bash
npm install -g web-terminal-server
web-terminal-server
```
Or use the short alias:
```bash
wts
```
### Local Installation
```bash
npm install web-terminal-server
npx web-terminal-server
```
### From Source
```bash
git clone https://github.com/OzlevyQ/web-terminal-server.git
cd web-terminal-server
npm install
npm start
```
## 🔧 Configuration
### Environment Variables
Create a `.env` file in your project root:
```env
# Server Configuration
PORT=5000
HOST=0.0.0.0
# Security Settings
# Options: full, limited, restricted
TERMINAL_SECURITY=full
# Session Management
MAX_SESSIONS=10
SESSION_TIMEOUT=3600000
DETACHED_SESSION_TIMEOUT=86400000
# External Access (Important for sharing!)
BASE_URL=http://localhost:5000
# Ngrok (optional)
NGROK_AUTH_TOKEN=your_auth_token_here
# Terminal Configuration
TERMINAL_SHELL=/bin/bash
TERMINAL_COLS=80
TERMINAL_ROWS=24
# Performance
MAX_BUFFER_SIZE=52428800
CHUNK_SIZE=32768
# Data Storage
DATA_DIR=./data
```
### Security Levels
| Level | Description | Use Case |
|-------|-------------|----------|
| `full` | Complete system access | Development, trusted environments |
| `limited` | Home + temp directories | Shared servers |
| `restricted` | Home directory only | Public deployments |
## 🌐 External Access with Ngrok
### Method 1: Built-in Integration
```bash
# Set your auth token in .env
NGROK_AUTH_TOKEN=your_token_here
# Run with --ngrok flag
npx web-terminal-server --ngrok
```
### Method 2: Manual Ngrok
```bash
# Terminal 1: Start the server
npx web-terminal-server
# Terminal 2: Start ngrok
ngrok http 5000
```
Copy the public URL (e.g., `https://abc123.ngrok.io`) and set it in your `.env`:
```env
BASE_URL=https://abc123.ngrok.io
```
## 📊 Available Pages
Access these pages while the server is running:
- **`/`** - Main dashboard with web terminal
- **`/ports`** - Port monitoring page with open ports list
- **`/monitor`** - Session monitoring dashboard
## 🔍 Smart Port Detection & Cloudflare Tunnels
### Automatic Port Discovery
The `/ports` page automatically detects open ports (1-9000) on your system and provides:
- **Port Number** - The port where the service is running
- **Process Name** - Name of the process using the port
- **🔗 Open Button** - Direct link to `http://localhost:PORT`
- **📁 Copy cd Button** - Copies `cd` command to process working directory
- **🌐 Create Tunnel** - One-click Cloudflare tunnel creation for public access
### Live Port Notifications (New! 🎉)
When you run a server in the terminal, a beautiful notification pops up:
1. **Automatic Detection** - Detects when ports are opened from your terminal session
2. **Smart Filtering** - Only shows ports from YOUR terminal (not system ports)
3. **One-Click Tunnels** - Create public URLs instantly with Cloudflare
4. **Live Button** - Active tunnel shows in terminal header with port number
5. **Works Everywhere** - Functions in normal, shared, and connected sessions
### Cloudflare Tunnel Setup
Install cloudflared to enable public tunnels:
```bash
# macOS
brew install cloudflared
# Linux
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared
```
Once installed:
- Click "Create Tunnel" on any port
- Get instant public URL (e.g., `https://abc-xyz-123.trycloudflare.com`)
- Share with anyone, anywhere
- Click "LIVE :8080" button in terminal header to open
### Example Use Cases:
- Share local dev server with clients instantly
- Test mobile apps against local backend
- Demo work-in-progress without deployment
- Remote debugging with team members
- Quick API endpoint sharing
## 🎯 Use Cases
### AI CLI Tools
Perfect for running interactive AI tools:
- **Claude Code** - Anthropic's coding assistant
- **Codex CLI** - OpenAI's code generation
- **Gemini CLI** - Google's AI interface
- **Any interactive CLI** that needs persistent sessions
### Development Workflows
- Remote pair programming
- Live debugging sessions
- Server monitoring
- Build process watching
- Port monitoring for multiple services
### Education
- Live coding demonstrations
- Student terminal access
- Interactive tutorials
## 📱 Mobile Support
The terminal works perfectly on mobile devices with:
- Touch-optimized controls
- Virtual keyboard integration
- Gesture support
- Responsive layout
Access the controls panel with the ⚙️ button for:
- Arrow keys navigation
- Special keys (Tab, Esc, Ctrl+C)
- Copy/paste functionality
## 🔗 Session Sharing
1. Start any terminal session
2. Click the **Share** button
3. Copy the generated URL
4. Share with anyone!
The shared session will:
- Show all previous output
- Continue from exactly where you left off
- Allow real-time collaboration
## 📊 Session Monitoring
Access the monitor at `http://localhost:5000/monitor` to see:
- All active and saved sessions
- Session statistics and resource usage
- Quick access links to any session
- **Bulk management** - Select multiple sessions with checkboxes
- **Batch deletion** - Delete multiple sessions at once with a single confirmation
- Beautiful visual feedback for selected sessions
## 🛡️ Security Best Practices
1. **Always use environment variables** for production URLs
2. **Set appropriate security levels** based on your use case
3. **Use HTTPS** in production (via ngrok or reverse proxy)
4. **Limit session numbers** to prevent resource exhaustion
5. **Configure timeouts** for inactive sessions
## 🐛 Troubleshooting
### "cd /" doesn't work
- Check security level: needs `TERMINAL_SECURITY=full`
- Verify in server logs on startup
### Session not persisting
- Ensure `data/` directory is writable
- Check session timeout settings
- Verify BASE_URL is correctly set
### Ngrok not working
- Install globally: `npm install -g ngrok`
- Set auth token: `ngrok authtoken YOUR_TOKEN`
- Check firewall settings
### Mobile keyboard issues
- Use the Controls panel (⚙️ button)
- Try the Keyboard button first
- Ensure browser has input focus
### Port monitoring shows no ports
- Make sure you have other services running
- `lsof` command must be available (macOS/Linux)
- Check if ports are actually open: `lsof -i -P | grep LISTEN`
## 🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
## 📝 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 🙏 Acknowledgments
- [xterm.js](https://github.com/xtermjs/xterm.js) - Terminal rendering
- [node-pty](https://github.com/microsoft/node-pty) - Pseudo terminal support
- [Socket.io](https://socket.io/) - Real-time communication
- [Express](https://expressjs.com/) - Web framework
## 📞 Support
- 🐛 Issues: [GitHub Issues](https://github.com/OzlevyQ/web-terminal-server/issues)
- 💬 Discussions: [GitHub Discussions](https://github.com/OzlevyQ/web-terminal-server/discussions)
---
<p align="center">
Made with ❤️ by developers, for developers
</p>