# VibeTunnel iOS/iPadOS Native App Specification ## Overview VibeTunnel iOS is a native SwiftUI application that provides a beautiful, native interface to the VibeTunnel terminal multiplexer backend. The app allows users to create, manage, and interact with terminal sessions on their Mac from their iOS/iPadOS devices. ## Target Platform - **iOS/iPadOS**: 18.0+ - **Universal App**: Single app that adapts to iPhone and iPad - **SwiftUI**: Modern declarative UI framework - **Terminal Engine**: SwiftTerm (https://github.com/migueldeicaza/SwiftTerm) ## Core Features ### 1. Connection Management - **Initial Setup Dialog**: - Server URL/IP input field - Port configuration (default: 3000) - Connection testing with status feedback - Saved connections list (stored in UserDefaults/KeyChain) - Auto-reconnection on app launch ### 2. Session Management - **Session List View**: - Display all active and exited sessions - Real-time status updates (auto-refresh every 3 seconds) - Session cards showing: - Session name/command - Working directory - Status (running/exited) - PID (if running) - Exit code (if exited) - Started time - Last modified time - Pull-to-refresh functionality - Search/filter capabilities - **Session Actions**: - Create new session - Kill running session - Clean up exited session files - Clean up all exited sessions - Tap to view terminal ### 3. Terminal View - **SwiftTerm Integration**: - Full terminal emulation using SwiftTerm - Support for ANSI escape sequences - 256-color and true color support - VS Code dark theme colors - Font: SF Mono or custom monospace fonts - Adjustable font size - **Input/Output**: - Native iOS keyboard integration - Special keys toolbar (arrows, escape, tab, ctrl) - Copy/paste support - URL detection and tap-to-open - Smooth scrolling with momentum - Pinch-to-zoom font sizing - **Real-time Updates**: - Server-Sent Events (SSE) for terminal output streaming - Efficient buffer management - Auto-scroll to bottom on new output - Scroll position indicator ### 4. Session Creation - **New Session Form**: - Command input (default: zsh) - Working directory picker - Session name (optional) - Terminal dimensions (auto-calculated based on device) - Recent commands/directories ### 5. iPad-Specific Features - **Split View Support**: - Session list in sidebar - Terminal in main view - Multiple terminal tabs - Drag and drop support - **Keyboard Support**: - Hardware keyboard shortcuts - Command+T for new session - Command+W to close session - Command+K to clear terminal - **Multitasking**: - Slide Over support - Split View with other apps - Stage Manager compatibility ## Technical Architecture ### 1. Project Structure ``` ios/ ├── VibeTunnel/ │ ├── App/ │ │ ├── VibeTunnelApp.swift │ │ └── ContentView.swift │ ├── Models/ │ │ ├── Session.swift │ │ ├── ServerConfig.swift │ │ └── TerminalData.swift │ ├── Views/ │ │ ├── Connection/ │ │ │ ├── ConnectionView.swift │ │ │ └── ServerConfigForm.swift │ │ ├── Sessions/ │ │ │ ├── SessionListView.swift │ │ │ ├── SessionCardView.swift │ │ │ └── SessionCreateView.swift │ │ ├── Terminal/ │ │ │ ├── TerminalView.swift │ │ │ ├── TerminalHostingView.swift │ │ │ └── TerminalToolbar.swift │ │ └── Common/ │ │ ├── LoadingView.swift │ │ └── ErrorView.swift │ ├── Services/ │ │ ├── APIClient.swift │ │ ├── SessionService.swift │ │ ├── TerminalService.swift │ │ └── SSEClient.swift │ ├── Utils/ │ │ ├── KeychainHelper.swift │ │ ├── ColorTheme.swift │ │ └── Extensions/ │ └── Resources/ │ ├── Assets.xcassets │ └── Info.plist └── VibeTunnel.xcodeproj ``` ### 2. Data Models ```swift // Session Model struct Session: Codable, Identifiable { let id: String let command: String let workingDir: String let name: String? let status: SessionStatus let exitCode: Int? let startedAt: Date let lastModified: Date let pid: Int? let waiting: Bool? let width: Int? let height: Int? } enum SessionStatus: String, Codable { case running case exited } // Server Configuration struct ServerConfig: Codable { let host: String let port: Int let name: String? var baseURL: URL { URL(string: "http://\(host):\(port)")! } } // Terminal Event struct TerminalEvent { let timestamp: Double let type: EventType let data: String enum EventType: String { case output = "o" case input = "i" case resize = "r" case marker = "m" } } ``` ### 3. API Integration ```swift // API Client Protocol protocol APIClientProtocol { func getSessions() async throws -> [Session] func createSession(_ data: SessionCreateData) async throws -> String func killSession(_ sessionId: String) async throws func cleanupSession(_ sessionId: String) async throws func cleanupAllExitedSessions() async throws -> [String] func sendInput(sessionId: String, text: String) async throws func resizeTerminal(sessionId: String, cols: Int, rows: Int) async throws } // SSE Client for Terminal Streaming class SSEClient: NSObject { func connect(to url: URL) -> AsyncStream func disconnect() } ``` ### 4. SwiftTerm Integration ```swift // Terminal View Controller class TerminalViewController: UIViewController { private let terminal: TerminalView // SwiftTerm private let sessionId: String private let sseClient: SSEClient // Configure terminal with VS Code theme // Handle input/output // Manage resize events // Stream terminal data via SSE } ``` ### 5. State Management - Use SwiftUI's `@StateObject` and `@ObservedObject` for view models - Combine framework for reactive updates - AsyncStream for SSE handling - UserDefaults for connection preferences - Keychain for secure credential storage ## UI/UX Design ### 1. Design System - **Colors**: Match VS Code dark theme - Background: #1e1e1e - Foreground: #d4d4d4 - Accent: System blue - Success: System green - Error: System red - **Typography**: - System fonts for UI - SF Mono for terminal - Dynamic Type support - **Components**: - Native SwiftUI components - Consistent padding and spacing - Smooth animations and transitions ### 2. Navigation Flow ``` ConnectionView (if not connected) ↓ SessionListView (main screen) ├→ SessionCreateView (modal) └→ TerminalView (push/detail) └→ TerminalToolbar (overlay) ``` ### 3. Responsive Design - Adaptive layouts for different device sizes - Compact/Regular size class handling - Landscape optimization - Dynamic terminal sizing ## Implementation Phases ### Phase 1: Foundation (Tasks 2-4) - Set up Xcode project with SwiftUI - Create basic navigation structure - Implement connection dialog - Build data models and API client - Store server configuration ### Phase 2: Session Management (Task 5, 8) - Session list view with real-time updates - Session card components - Create new session form - Kill and cleanup actions - Pull-to-refresh ### Phase 3: Terminal Integration (Tasks 6-7, 9) - Integrate SwiftTerm library - Terminal view wrapper - SSE streaming client - Input handling - Resize support ### Phase 4: Polish & iPad (Task 10) - iPad-specific layouts - Keyboard shortcuts - Settings view - Connection management - Performance optimization ## Testing Strategy ### Unit Tests - API client methods - Data model parsing - Session state management - URL construction ### UI Tests - Connection flow - Session creation - Terminal interaction - Error handling ### Integration Tests - End-to-end session lifecycle - SSE streaming reliability - Terminal command execution ## Security Considerations - Use HTTPS when possible (with option for HTTP in local network) - Store credentials in Keychain - Validate server certificates - Sanitize terminal output - Handle authentication if backend requires it ## Performance Optimization - Lazy loading of session list - Efficient terminal buffer management - Debounced resize events - Background session updates - Memory-efficient SSE streaming ## Future Enhancements 1. **Multiple Connections**: Support multiple VibeTunnel servers 2. **Session Sharing**: Share terminal sessions with others 3. **Recording**: Record and playback terminal sessions 4. **Themes**: Additional color themes beyond VS Code 5. **Shortcuts**: Customizable keyboard shortcuts 6. **File Transfer**: Upload/download files through the app 7. **Notifications**: Background notifications for session events ## Dependencies - **SwiftTerm**: Terminal emulator engine - **Alamofire** (optional): For networking (or use URLSession) - **KeychainSwift**: Secure credential storage ## App Store Considerations - Ensure compliance with App Store guidelines - Proper error handling and user feedback - Privacy policy for network usage - Export compliance for encryption ## Conclusion This specification outlines a comprehensive native iOS/iPadOS client for VibeTunnel that leverages SwiftUI and SwiftTerm to provide a superior terminal experience compared to the web interface. The app will be fast, responsive, and take full advantage of native iOS features while maintaining feature parity with the web frontend.