4.8 KiB
VibeTunnel Architecture
VibeTunnel is a modern terminal multiplexer with native macOS and iOS applications, featuring a Node.js/Bun-powered server backend and real-time web interface. The architecture prioritizes performance, security, and seamless cross-platform experience through WebSocket-based communication and native UI integration.
The system consists of four main components: a native macOS menu bar application that manages server lifecycle, a Node.js/Bun server handling terminal sessions, an iOS companion app for mobile terminal access, and a web frontend for browser-based interaction. These components communicate through a well-defined REST API and WebSocket protocol for real-time terminal I/O streaming.
Component Map
macOS Application - Native Swift app in mac/VibeTunnel/
- ServerManager (mac/VibeTunnel/Core/Services/ServerManager.swift) - Central server lifecycle coordinator
- BunServer (mac/VibeTunnel/Core/Services/BunServer.swift) - Bun runtime integration
- BaseProcessServer (mac/VibeTunnel/Core/Services/BaseProcessServer.swift) - Base class for server implementations
- TTYForwardManager (mac/VibeTunnel/Core/Services/TTYForwardManager.swift) - Terminal forwarding logic
- SessionMonitor (mac/VibeTunnel/Core/Services/SessionMonitor.swift) - Active session tracking
Node.js/Bun Server - JavaScript backend in web/src/server/
- app.ts - Express application setup and configuration
- server.ts - HTTP server initialization and shutdown handling
- pty/pty-manager.ts - Native PTY process management
- pty/session-manager.ts - Terminal session lifecycle
- services/terminal-manager.ts - High-level terminal operations
- services/buffer-aggregator.ts - Terminal buffer optimization
- routes/sessions.ts - REST API endpoints for session management
iOS Application - Native iOS app in ios/VibeTunnel/
- BufferWebSocketClient (ios/VibeTunnel/Services/BufferWebSocketClient.swift) - WebSocket client for terminal streaming
- TerminalView (ios/VibeTunnel/Views/Terminal/TerminalView.swift) - Terminal rendering UI
- TerminalHostingView (ios/VibeTunnel/Views/Terminal/TerminalHostingView.swift) - UIKit integration layer
Web Frontend - TypeScript/React app in web/src/client/
- Terminal rendering using xterm.js
- WebSocket client for real-time updates
- Session management UI
Key Files
Server Protocol Definition
- mac/VibeTunnel/Core/Protocols/VibeTunnelServer.swift - Defines server interface
Session Models
- mac/VibeTunnel/Core/Models/TunnelSession.swift - Core session data structure
- web/src/server/pty/types.ts - TypeScript session types
Binary Integration
- mac/scripts/build-bun-executable.sh - Builds Bun runtime bundle
- web/build-native.js - Native module compilation for pty.node
Configuration
- mac/VibeTunnel/Core/Models/AppConstants.swift - Application constants
- web/src/server/app.ts (lines 20-31) - Server configuration interface
Data Flow
Session Creation Flow
- Client request → POST /api/sessions (web/src/server/routes/sessions.ts:createSessionRoutes)
- TerminalManager.createTerminal() (web/src/server/services/terminal-manager.ts)
- PtyManager.spawn() (web/src/server/pty/pty-manager.ts) - Spawns native PTY process
- Session stored in manager, WebSocket upgrade prepared
- Response with session ID and WebSocket URL
Terminal I/O Stream
- User input → WebSocket message to /api/sessions/:id/ws
- BufferAggregator processes input (web/src/server/services/buffer-aggregator.ts)
- PTY process receives input via pty.write()
- PTY output → BufferAggregator.handleData()
- Binary buffer snapshot or text delta → WebSocket broadcast
- Client renders using xterm.js or native terminal view
Buffer Optimization Protocol
- Binary messages use magic byte 0xBF (ios/VibeTunnel/Services/BufferWebSocketClient.swift:50)
- Full buffer snapshots sent periodically for synchronization
- Text deltas for incremental updates between snapshots
- Automatic aggregation reduces message frequency
Server Lifecycle Management
- ServerManager.start() (mac/VibeTunnel/Core/Services/ServerManager.swift)
- Creates BunServer instance
- BaseProcessServer.start() spawns server process
- Health checks via HTTP /health endpoint
- Log streaming through Process.standardOutput pipe
- Graceful shutdown on stop() with SIGTERM
Remote Access Architecture
- NgrokService (mac/VibeTunnel/Core/Services/NgrokService.swift) - Secure tunnel creation
- HQClient (web/src/server/services/hq-client.ts) - Headquarters mode for multi-server
- RemoteRegistry (web/src/server/services/remote-registry.ts) - Remote server discovery
Authentication Flow
- Basic Auth middleware (web/src/server/middleware/auth.ts)
- Credentials stored in macOS Keychain via DashboardKeychain service
- Optional password protection for network access