vibetunnel/linux/README.md
Helmut Januschka b90bfd9f46
Add Go implementation of VibeTunnel server (#16)
* 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>
2025-06-18 23:32:35 +02:00

266 lines
No EOL
6 KiB
Markdown

# 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
```bash
# 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
```bash
# 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
```bash
make install
```
### User Installation
```bash
make install-user
```
### As a Service (systemd)
```bash
make service-install
make service-enable
make service-start
```
## Usage
### Server Mode
Start the web server to access terminals via browser:
```bash
# 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:
```bash
# 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:
```bash
# Show current configuration
vibetunnel config
# Use custom config file
vibetunnel --config ~/.config/vibetunnel.yaml --serve
```
Example configuration file (`~/.vibetunnel/config.yaml`):
```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
```bash
# 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:
1. Check the [main VibeTunnel documentation](../README.md)
2. Open an issue in the main repository
3. Check existing issues for known problems