mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-03-25 09:25:50 +00:00
* Add Linux implementation of VibeTunnel This commit introduces a complete Linux port of VibeTunnel, providing feature parity with the macOS version. The implementation includes: - Full Go-based server with identical REST API and WebSocket endpoints - Terminal session management using PTY (pseudo-terminal) handling - Asciinema recording format for session playback - Compatible CLI interface matching the macOS `vt` command - Support for all VibeTunnel features: password protection, network modes, ngrok integration - Comprehensive build system with Makefile supporting various installation methods - Systemd service integration for running as a system daemon The Linux version maintains 100% compatibility with the existing web UI and can be used as a drop-in replacement for the macOS app on Linux systems. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Add comprehensive ngrok integration to Linux VibeTunnel Implements full ngrok tunnel support for the Go/Linux version to match the macOS Swift implementation, enabling secure public access to local VibeTunnel instances. - **ngrok Service**: Complete lifecycle management with status tracking - **HTTP API**: RESTful endpoints matching macOS version - **CLI Support**: Command-line ngrok flags and integration - **Auto-forwarding**: Built-in HTTP request forwarding to local server - `POST /api/ngrok/start` - Start tunnel with auth token - `POST /api/ngrok/stop` - Stop active tunnel - `GET /api/ngrok/status` - Get current tunnel status - Uses `golang.ngrok.com/ngrok` SDK for native Go integration - Thread-safe service with mutex protection - Comprehensive error handling and logging - Real-time status updates (disconnected/connecting/connected/error) - Proper context cancellation for graceful shutdown ```bash vibetunnel --serve --ngrok --ngrok-token "your_token" vibetunnel --serve --port 4030 --ngrok --ngrok-token "your_token" ``` - Added golang.ngrok.com/ngrok v1.13.0 - Updated web packages (security fixes for puppeteer) Maintains full API compatibility with macOS VibeTunnel for seamless cross-platform operation and consistent web frontend integration. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * up * Fix SSE streaming performance with byte-based approach Addresses @badlogic's review feedback to prevent performance issues with line-based file reading in processNewContent(). ## Changes Made ### Performance Fix - **Byte-based seeking**: Replace line counting with file position tracking - **Efficient reads**: Only read new content since last position using file.Seek() - **Memory optimization**: Avoid reading entire file on each update - **Incomplete line handling**: Properly handle partial lines at file end ### Technical Details - Changed lastLineCount *int → seenBytes *int64 - Use file.Seek(seenBytes, 0) to jump to last read position - Read only new content with currentSize - seenBytes - Handle incomplete lines by adjusting seek position - Maintains same functionality with better performance ### Benefits - **Scalability**: No longer reads entire file for each update - **Performance**: O(new_content) instead of O(total_content) - **Memory**: Constant memory usage regardless of file size - **Reliability**: Handles concurrent writes and partial lines correctly This prevents the SSE streaming from exploding in our faces as @badlogic warned, especially for long-running sessions with large output files. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Optimize streaming performance to reduce 1+ second delays Implements multiple optimizations to address user-reported 1+ second delay between typing and stream rendering: ## PTY Reading Optimizations - **Reduced sleep times**: 100ms → 1ms for EOF checks - **Faster polling**: 10ms → 1ms for zero-byte reads - **FIFO optimization**: 1s → 100ms for stdin EOF polling ## UTF-8 Buffering Improvements - **Timeout-based flushing**: 5ms timer for incomplete UTF-8 sequences - **Real-time streaming**: Don't wait for complete sequences in interactive mode - **Smart buffering**: Balance correctness with responsiveness ## File I/O Optimizations - **Immediate sync**: Call file.Sync() after each write for instant fsnotify - **Reduced SSE timeout**: 1s → 100ms for session alive checks - **Better responsiveness**: Ensure file changes trigger immediately ## Technical Changes - Added StreamWriter.scheduleFlush() with 5ms timeout - Enhanced writeEvent() with conditional file syncing - Optimized PTY read/write loop timing - Improved SSE streaming frequency These changes target the main bottlenecks identified in the PTY → file → fsnotify → SSE → browser pipeline. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix critical stdin polling delay causing 1+ second input lag - Reduced FIFO EOF polling from 100ms to 1ms - Reduced EAGAIN polling from 1ms to 100µs - Added immediate continue after successful writes - This eliminates the major input delay bottleneck 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix critical performance issues causing resource leaks and CPU burns Performance optimizations based on code review feedback: 1. **Fix SSE goroutine leaks**: - Added client disconnect detection to SSE streams - Propagate write errors to detect when clients close connections - Prevents memory leaks from abandoned streaming goroutines 2. **Fix PTY busy-loop CPU burn**: - Increased sleep from 1ms to 10ms in idle scenarios - Reduces CPU wake-ups from 1000/s to 100/s (10x improvement) - Significantly reduces CPU usage when PTY is idle 3. **Multi-stream disconnect detection**: - Added error checking to multi-stream write operations - Prevents goroutine leaks in multi-session streaming These fixes address the "thing of the things" - performance\! 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Standardize session creation API response format to match Rust server Changes: - Updated Go server session creation response to include success/message/error fields - Now returns: {"success": true, "message": "Session created successfully", "error": null, "sessionId": "..."} - Maintains backward compatibility with existing sessionId field - Go server already supported both input formats (cmdline/command, cwd/workingDir) This achieves protocol compatibility between Go and Rust implementations. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix delete endpoint to return 200 OK with JSON response - Changed handleKillSession to return 200 OK instead of 204 No Content - Added JSON response with success/message fields for consistency - Fixes benchmark tool compatibility expecting 200 response 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Update Go server API to match Rust format exactly - Use 'command' array instead of 'cmdline' - Use 'workingDir' instead of 'cwd' - Remove compatibility shims for cleaner API - Better error messages matching Rust server 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Major performance optimizations for Go server - Remove 100ms artificial delay in session creation (-100ms per session) - Optimize PTY I/O handling with reduced polling intervals - Implement persistent stdin pipes to avoid repeated open/close - Batch file sync operations to reduce I/O overhead (5ms batching) - Remove blocking status updates from API handlers - Increase SSE session check interval from 100ms to 1s Target: Match Rust performance (60ms avg latency, 16+ ops/sec) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix O_NONBLOCK compilation issue * Add comprehensive TLS/HTTPS support with Caddy integration Features: - Optional TLS support via CLI flags (defaults to HTTP like Rust) - Self-signed certificate generation for localhost development - Let's Encrypt automatic certificate management for domains - Custom certificate support for production environments - HTTP to HTTPS redirect capability - Maintains 100% backward compatibility with Rust version Usage examples: - Default HTTP: ./vibetunnel --serve (same as Rust) - HTTPS with self-signed: ./vibetunnel --serve --tls - HTTPS with domain: ./vibetunnel --serve --tls --tls-domain example.com - HTTPS with custom certs: ./vibetunnel --serve --tls --tls-cert cert.pem --tls-key key.pem 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix terminal sizing issues and implement dynamic resize support Backend changes: - Add handleResizeSession API endpoint for dynamic terminal resizing - Implement Session.Resize() and PTY.Resize() methods with proper validation - Add session registry in Manager to track running sessions with PTY access - Fix stdin error handling to prevent session crashes on EAGAIN errors - Write resize events to asciinema stream for frontend synchronization - Update default terminal dimensions from 80x24 to 120x30 Frontend changes: - Add width/height parameters to SessionCreateData interface - Calculate appropriate terminal dimensions when creating sessions - Implement automatic resize API calls when terminal dimensions change - Add terminal-resize event dispatch for backend synchronization - Ensure resize events bubble properly for session management Fixes nvim being stuck at 80x24 by implementing proper terminal dimension management and dynamic resizing capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Add client-side resize caching and Hack Nerd Font support - Implement resize request caching to prevent redundant API calls - Add debouncing to terminal resize events (250ms delay) - Replace ResizeObserver with window.resize events only to eliminate pixel-level jitter - Add Hack Nerd Font Mono as primary terminal font with Fira Code fallback - Update session creation to use conservative 120x30 defaults - Fix terminal dimension calculation in normal mode 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Add comprehensive XTerm color and rendering enhancements - Complete 256-color palette support with CSS variables (0-255) - Enhanced XTerm configuration with proper terminal options - True xterm-compatible 16-color theme - Text attribute support: bold, italic, underline, dim, strikethrough, inverse, invisible - Cursor blinking with CSS animation - Font rendering optimizations (disabled ligatures, antialiasing) - Terminal-specific CSS styling for better rendering - Mac option key as meta, alt-click cursor movement - Selection colors and inactive selection support 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
6 KiB
6 KiB
VibeTunnel Linux
A Linux implementation of VibeTunnel that provides remote terminal access via web browser, fully compatible with the macOS VibeTunnel app.
Features
- 🖥️ Remote Terminal Access: Access your Linux terminal from any web browser
- 🔒 Secure: Optional password protection and localhost-only mode
- 🌐 Network Ready: Support for both localhost and network access modes
- 🔌 ngrok Integration: Easy external access via ngrok tunnels
- 📱 Mobile Friendly: Responsive web interface works on phones and tablets
- 🎬 Session Recording: All sessions recorded in asciinema format
- ⚡ Real-time: Live terminal streaming with proper escape sequence handling
- 🛠️ CLI Compatible: Full command-line interface for session management
Quick Start
Build from Source
# Clone the repository (if not already done)
git clone <repository-url>
cd vibetunnel/linux
# Build web assets and binary
make web build
# Start the server
./build/vibetunnel --serve
Using the Pre-built Binary
# Download latest release
wget <release-url>
chmod +x vibetunnel
# Start server on localhost:4020
./vibetunnel --serve
# Or with password protection
./vibetunnel --serve --password mypassword
# Or accessible from network
./vibetunnel --serve --network
Installation
System-wide Installation
make install
User Installation
make install-user
As a Service (systemd)
make service-install
make service-enable
make service-start
Usage
Server Mode
Start the web server to access terminals via browser:
# Basic server (localhost only)
vibetunnel --serve
# Server with password protection
vibetunnel --serve --password mypassword
# Server accessible from network
vibetunnel --serve --network
# Custom port
vibetunnel --serve --port 8080
# With ngrok tunnel
vibetunnel --serve --ngrok --ngrok-token YOUR_TOKEN
Access the dashboard at http://localhost:4020 (or your configured port).
Session Management
Create and manage terminal sessions:
# List all sessions
vibetunnel --list-sessions
# Create a new session
vibetunnel bash
vibetunnel --session-name "dev" zsh
# Send input to a session
vibetunnel --session-name "dev" --send-text "ls -la\n"
vibetunnel --session-name "dev" --send-key "C-c"
# Kill a session
vibetunnel --session-name "dev" --kill
# Clean up exited sessions
vibetunnel --cleanup-exited
Configuration
VibeTunnel supports configuration files for persistent settings:
# Show current configuration
vibetunnel config
# Use custom config file
vibetunnel --config ~/.config/vibetunnel.yaml --serve
Example configuration file (~/.vibetunnel/config.yaml):
control_path: /home/user/.vibetunnel/control
server:
port: "4020"
access_mode: "localhost" # or "network"
static_path: ""
mode: "native"
security:
password_enabled: true
password: "mypassword"
ngrok:
enabled: false
auth_token: ""
advanced:
debug_mode: false
cleanup_startup: true
preferred_terminal: "auto"
update:
channel: "stable"
auto_check: true
Command Line Options
Server Options
--serve: Start HTTP server mode--port, -p: Server port (default: 4020)--localhost: Bind to localhost only (127.0.0.1)--network: Bind to all interfaces (0.0.0.0)--static-path: Custom path for web UI files
Security Options
--password: Dashboard password for Basic Auth--password-enabled: Enable password protection
ngrok Integration
--ngrok: Enable ngrok tunnel--ngrok-token: ngrok authentication token
Session Management
--list-sessions: List all sessions--session-name: Specify session name--send-key: Send key sequence to session--send-text: Send text to session--signal: Send signal to session--stop: Stop session (SIGTERM)--kill: Kill session (SIGKILL)--cleanup-exited: Clean up exited sessions
Advanced Options
--debug: Enable debug mode--cleanup-startup: Clean up sessions on startup--server-mode: Server mode (native, rust)--control-path: Control directory path--config, -c: Configuration file path
Web Interface
The web interface provides:
- Dashboard: Overview of all terminal sessions
- Terminal View: Real-time terminal interaction
- Session Management: Start, stop, and manage sessions
- File Browser: Browse filesystem (if enabled)
- Session Recording: Playback of recorded sessions
Compatibility
VibeTunnel Linux is designed to be 100% compatible with the macOS VibeTunnel app:
- Same API: Identical REST API and WebSocket endpoints
- Same Web UI: Uses the exact same web interface
- Same Session Format: Compatible asciinema recording format
- Same Configuration: Similar configuration options and structure
Development
Prerequisites
- Go 1.21 or later
- Node.js and npm (for web UI)
- Make
Building
# Install dependencies
make deps
# Build web assets
make web
# Build binary
make build
# Run in development mode
make dev
# Run tests
make test
# Format and lint code
make check
Project Structure
linux/
├── cmd/vibetunnel/ # Main application
├── pkg/
│ ├── api/ # HTTP server and API endpoints
│ ├── config/ # Configuration management
│ ├── protocol/ # Asciinema protocol implementation
│ └── session/ # Terminal session management
├── scripts/ # Build and utility scripts
├── Makefile # Build system
└── README.md # This file
License
This project is part of the VibeTunnel ecosystem. See the main repository for license information.
Contributing
Contributions are welcome! Please see the main VibeTunnel repository for contribution guidelines.
Support
For support and questions:
- Check the main VibeTunnel documentation
- Open an issue in the main repository
- Check existing issues for known problems