mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-03-25 09:25:50 +00:00
11 KiB
11 KiB
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 pointVibeTunnel/Core/Services/ServerManager.swift: Orchestrates server operationsVibeTunnel/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 sessionGET /sessions: List active sessionsGET /sessions/:id: Get session detailsPOST /sessions/:id/send: Send input to terminalGET /sessions/:id/output: Stream terminal outputDELETE /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 codeVibeTunnel/Resources/WebRoot/: Bundled static assets
Session Management Flow
-
Session Creation:
Client → POST /sessions → Server spawns terminal process → Returns session ID -
Command Execution:
Client → POST /sessions/:id/send → Server writes to PTY → Process executes -
Output Streaming:
Process → PTY output → Server captures → WebSocket/HTTP stream → Client renders -
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
- Protocol-Oriented Design:
ServerProtocolallows swapping server implementations - Actor Pattern: Swift actors for thread-safe state management
- Dependency Injection: Services are injected for testability
- MVVM Architecture: Clear separation of views and business logic
- Singleton Pattern: Used for global services like ServerManager
Development Guidelines
Code Organization
- Services are organized by functionality in the
Core/Servicesdirectory - 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
- Local-Only Mode: Default configuration restricts access to localhost
- Password Protection: Optional password for network access stored in Keychain
- Secure Tunneling: Integration with Tailscale/ngrok for remote access
- Process Isolation: Each terminal session runs in its own process
- 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