vibetunnel/docs/ARCHITECTURE.md
Peter Steinberger 7172840fa5 better docs
2025-06-16 23:57:17 +02:00

239 lines
No EOL
11 KiB
Markdown

# VibeTunnel Architecture
This document describes the technical architecture and implementation details of VibeTunnel.
## Architecture Overview
VibeTunnel employs a multi-layered architecture designed for flexibility, security, and ease of use:
```
┌─────────────────────────────────────────────────────────┐
│ Web Browser (Client) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ TypeScript/JavaScript Frontend │ │
│ │ - Asciinema Player for Terminal Rendering │ │
│ │ - WebSocket for Real-time Updates │ │
│ │ - Tailwind CSS for UI │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↕ HTTPS/WebSocket
┌─────────────────────────────────────────────────────────┐
│ HTTP Server Layer │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Dual Implementation: │ │
│ │ 1. Hummingbird Server (Swift) │ │
│ │ 2. Rust Server (tty-fwd binary) │ │
│ │ - REST APIs for session management │ │
│ │ - WebSocket streaming for terminal I/O │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ macOS Application (Swift) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Core Components: │ │
│ │ - ServerManager: Orchestrates server lifecycle │ │
│ │ - SessionMonitor: Tracks active sessions │ │
│ │ - TTYForwardManager: Handles TTY forwarding │ │
│ │ - TerminalManager: Terminal operations │ │
│ │ - NgrokService: Optional tunnel exposure │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ UI Layer (SwiftUI): │ │
│ │ - MenuBarView: System menu bar integration │ │
│ │ - SettingsView: Configuration interface │ │
│ │ - ServerConsoleView: Diagnostics & logs │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
```
## Core Components
### 1. Native macOS Application
The main application is built with Swift and SwiftUI, providing:
- **Menu Bar Integration**: Lives in the system menu bar with optional dock mode
- **Server Lifecycle Management**: Controls starting, stopping, and switching between server implementations
- **System Integration**: Launch at login, single instance enforcement, application mover
- **Auto-Updates**: Sparkle framework integration for seamless updates
Key files:
- `VibeTunnel/VibeTunnelApp.swift`: Main application entry point
- `VibeTunnel/Core/Services/ServerManager.swift`: Orchestrates server operations
- `VibeTunnel/Core/Models/TunnelSession.swift`: Core session model
### 2. HTTP Server Layer
VibeTunnel offers two server implementations that can be switched at runtime:
#### Hummingbird Server (Swift)
- Built-in Swift implementation using the Hummingbird framework
- Native integration with the macOS app
- RESTful APIs for session management
- File: `VibeTunnel/Core/Services/HummingbirdServer.swift`
#### Rust Server (tty-fwd)
- External binary written in Rust for high-performance TTY forwarding
- Spawns and manages terminal processes
- Records sessions in asciinema format
- WebSocket streaming for real-time terminal I/O
- Source: `tty-fwd/` directory
Both servers expose similar APIs:
- `POST /sessions`: Create new terminal session
- `GET /sessions`: List active sessions
- `GET /sessions/:id`: Get session details
- `POST /sessions/:id/send`: Send input to terminal
- `GET /sessions/:id/output`: Stream terminal output
- `DELETE /sessions/:id`: Terminate session
### 3. Web Frontend
A modern web interface for terminal interaction:
- **Terminal Rendering**: Uses asciinema player for accurate terminal display
- **Real-time Updates**: WebSocket connections for live terminal output
- **Responsive Design**: Tailwind CSS for mobile-friendly interface
- **Session Management**: Create, list, and control multiple terminal sessions
Key files:
- `web/`: Frontend source code
- `VibeTunnel/Resources/WebRoot/`: Bundled static assets
## Session Management Flow
1. **Session Creation**:
```
Client → POST /sessions → Server spawns terminal process → Returns session ID
```
2. **Command Execution**:
```
Client → POST /sessions/:id/send → Server writes to PTY → Process executes
```
3. **Output Streaming**:
```
Process → PTY output → Server captures → WebSocket/HTTP stream → Client renders
```
4. **Session Termination**:
```
Client → DELETE /sessions/:id → Server kills process → Cleanup resources
```
## Key Features Implementation
### Security & Tunneling
- **Ngrok Integration**: Optional secure tunnel exposure for remote access
- **Keychain Storage**: Secure storage of authentication tokens
- **Code Signing**: Full support for macOS code signing and notarization
- **Basic Auth**: Password protection for network access
### Terminal Capabilities
- **Full TTY Support**: Proper handling of terminal control sequences
- **Process Management**: Spawn, monitor, and control terminal processes
- **Session Recording**: Asciinema format recording for playback
- **Multiple Sessions**: Concurrent terminal session support
### Developer Experience
- **Hot Reload**: Development server with live updates
- **Comprehensive Logging**: Detailed logs for debugging
- **Error Handling**: Robust error handling throughout the stack
- **Swift 6 Concurrency**: Modern async/await patterns
## Technology Stack
### macOS Application
- **Language**: Swift 6.0
- **UI Framework**: SwiftUI
- **Minimum OS**: macOS 14.0 (Sonoma)
- **Architecture**: Universal Binary (Intel + Apple Silicon)
### Dependencies
- **Hummingbird**: HTTP server framework
- **Sparkle**: Auto-update framework
- **Swift Log**: Structured logging
- **Swift HTTP Types**: Type-safe HTTP handling
- **Swift NIO**: Network framework
### Build Tools
- **Xcode**: Main IDE and build system
- **Swift Package Manager**: Dependency management
- **Cargo**: Rust toolchain for tty-fwd
- **npm**: Frontend build tooling
## Project Structure
```
vibetunnel/
├── VibeTunnel/ # macOS app source
│ ├── Core/ # Core business logic
│ │ ├── Services/ # Core services (servers, managers)
│ │ ├── Models/ # Data models
│ │ └── Utilities/ # Helper utilities
│ ├── Presentation/ # UI layer
│ │ ├── Views/ # SwiftUI views
│ │ └── Utilities/ # UI utilities
│ ├── Utilities/ # App-level utilities
│ └── Resources/ # Assets and bundled files
├── tty-fwd/ # Rust TTY forwarding server
├── web/ # TypeScript/JavaScript frontend
├── scripts/ # Build and utility scripts
└── Tests/ # Unit and integration tests
```
## Key Design Patterns
1. **Protocol-Oriented Design**: `ServerProtocol` allows swapping server implementations
2. **Actor Pattern**: Swift actors for thread-safe state management
3. **Dependency Injection**: Services are injected for testability
4. **MVVM Architecture**: Clear separation of views and business logic
5. **Singleton Pattern**: Used for global services like ServerManager
## Development Guidelines
### Code Organization
- Services are organized by functionality in the `Core/Services` directory
- Views follow SwiftUI best practices with separate view models when needed
- Utilities are split between Core (business logic) and Presentation (UI)
### Error Handling
- All network operations use Swift's async/await with proper error propagation
- User-facing errors are localized and actionable
- Detailed logging for debugging without exposing sensitive information
### Testing Strategy
- Unit tests for core business logic
- Integration tests for server implementations
- UI tests for critical user flows
### Performance Considerations
- Rust server for CPU-intensive terminal operations
- Efficient WebSocket streaming for real-time updates
- Lazy loading of terminal sessions in the UI
## Security Model
1. **Local-Only Mode**: Default configuration restricts access to localhost
2. **Password Protection**: Optional password for network access stored in Keychain
3. **Secure Tunneling**: Integration with Tailscale/ngrok for remote access
4. **Process Isolation**: Each terminal session runs in its own process
5. **No Persistent Storage**: Sessions are ephemeral, recordings are opt-in
## Future Architecture Considerations
- **Plugin System**: Allow third-party extensions
- **Multi-Platform Support**: Potential Linux/Windows ports
- **Cloud Sync**: Optional session history synchronization
- **Terminal Multiplexing**: tmux-like functionality
- **API Extensions**: Programmatic control of sessions
## Acknowledgments
VibeTunnel's architecture is influenced by:
- Modern macOS app design patterns
- Unix philosophy of composable tools
- Web-based terminal emulators like ttyd and gotty
- The asciinema ecosystem for terminal recording