- Restructure session-view to use proper flexbox layout (header/xterm/buttons)
- Container now exactly fits viewport height (100vh)
- Header shows command and working directory stacked
- XTerm gets all remaining space with horizontal scrolling
- Mobile buttons integrated into layout instead of overlaying
- Replace setTimeout with requestAnimationFrame for better performance
- Add isPreview parameter to renderer for future preview scaling
- Disable pointer events on preview terminals so clicks pass through
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace Gruvbox color scheme with VS Code Dark theme colors
- Remove inappropriate terminal.clear() calls from live stream connections
- Add debugging logs for SSE events to investigate DOM recreation issue
- Ensure only snapshots clear terminal, streams append new content
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace AsciinemaPlayer with XTerm.js renderer in session-view and session-list
- Add XTerm CSS for proper terminal styling and hide input textarea
- Implement resize event handling (r-type cast events) in renderer
- Add Ctrl+Enter and Shift+Enter key combination support
- Update tty-fwd to handle ctrl_enter and shift_enter keys
- Set TERM=xterm-256color in tty-fwd for proper Unicode box-drawing
- Add font scaling and preview sizing for session-list terminals
- Remove asciinema dependencies and update CSS accordingly
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add configurable scrollback parameter to Renderer constructor
- Default to 1,000,000 lines (up from 1,000) for full session history
- Users can now scroll through entire terminal session history
- Fix renderer-entry.ts import path (remove .js extension)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove old custom ANSI renderer (src/client/renderer.ts)
- Rename XTermRenderer to Renderer and move to renderer.ts
- Update renderer-entry.ts to export single Renderer class
- Rename and update all test files:
- test-xterm-renderer.html → test-renderer.html
- simple-xterm-test.html → simple-test.html
- debug-xterm.html → debug-renderer.html
- Remove obsolete custom renderer tests
- Update tests/index.html with new test descriptions
- All tests now use single XTerm.js-based Renderer
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create renderer-entry.ts to bundle both Renderer and XTermRenderer
- Add bundle:renderer script to generate public/bundle/renderer.js
- Update all test files to import from ../bundle/renderer.js
- Remove all unpkg/CDN XTerm.js script imports
- Tests now use bundled dependencies for faster loading
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use SettingsLink in MenuBarView for native SwiftUI settings opening
- Move HiddenWindowView to SettingsOpener.swift for better organization
- Keep programmatic settings access via notification for AppDelegate use
- Position hidden window offscreen to avoid menu click interference
- Remove unused HiddenWindow.swift and ObjectiveC imports
- Fix for FB10184971: Settings doesn't work in MenuBarExtra-only apps
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace TypeScript compilation with esbuild bundling
- Organize all generated files in public/bundle/
- Remove PWA features and simplify index.html
- Add XTerm.js renderer with same API as custom renderer
- Create comprehensive test suite in public/tests/
- Update .gitignore to only track source files
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update build:css script to use npx tailwindcss instead of global
- Update watch:css script to use npx tailwindcss instead of global
- Ensures consistent builds using project dependencies
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created CLIInstaller utility to symlink vt binary to /usr/local/bin
- Added 'Install vt Command' button to Advanced Settings
- Handles sudo authentication through system dialogs
- Checks for existing installations and provides replacement option
- Includes proper error handling and user feedback
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement browser URL routing with session ID parameters
- Add browser back/forward navigation support
- Auto-load session view from URL on page refresh
- Add mobile swipe-back gesture from left edge
- Reorganize mobile controls: arrow keys + special keys in normal view
- Simplify text overlay to show only SEND and SEND+ENTER buttons
- Remove left arrow from BACK button for cleaner look
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add periodic heartbeats (every 15 seconds) to keep SSE connections alive
- Enhance response headers to prevent proxy buffering (X-Accel-Buffering: no)
- Fix monitorFileChanges to read entire file from beginning like tail -f
- Process lines synchronously to maintain order
- Send initial connection message to establish stream immediately
- Remove empty line filtering to match tail -f behavior exactly
This ensures streams stay open indefinitely and don't timeout due to inactivity.
The tty-fwd binary should handle its own directory requirements. This removes:
- ensureControlDirectoryExists() function
- All calls to ensure control directory exists during startup and API calls
- Directory writability checks
The control directory path is still passed to tty-fwd, but VibeTunnel no longer manages its creation.
- Add automatic session view switching after creating new sessions
- Poll for session to appear in list and switch immediately when found
- Handle tty-fwd ID mismatch by falling back to newest session
- Add comprehensive debugging for session creation flow
- Clean control directory contents on server startup for fresh state
- Improve session creation UX with seamless transition to interactive view
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add entitlements to allow spawning executables with different signatures
- Create build script to properly sign tty-fwd binary during builds
- Add error logging for better debugging of process termination
- Validate control directory permissions before use
- Changed build script shell from /bin/sh to /bin/zsh for better compatibility
- Sources user's .zshrc or .zprofile to get the actual PATH configuration
- Properly handles all Node.js installation methods (nvm, homebrew, fnm, etc.)
- Added PATH debugging output to help troubleshoot issues
- Maintains fallback for systems without zsh configuration files
Also includes:
- Added PATH environment fix for ngrok detection in NgrokService
- Implemented proper update channel support in SparkleUpdaterManager using delegate methods
- Fixed session name placeholder text in web frontend
- Move CREATE SESSION button from session list to app header for better visibility
- Hide CLEAN EXITED button when "hide exited" is checked (only show when needed)
- Simplify session list controls layout with clean flex design
- Add proper state management for create modal between app and session list
- Maintain hide exited state when navigating between views
- Fix checkbox blocking issue with better event timing
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added detailed error messages for common exit codes (SIGKILL, command not found, etc.)
- Create control directory (~/.vibetunnel/control) if it doesn't exist
- Trim whitespace from error output for cleaner messages
- Specifically handle exit code 9 (SIGKILL) which occurs when control directory is missing
- Ensure directory exists in both listSessions() and createSession()
- Handle error type properly in catch block
- Check if error is instanceof Error before accessing message property
- Provide fallback for unknown error types
- Added "Build Web Frontend" phase that runs npm install and npm run build
- Copies built web assets from web/public/ to app Resources folder
- Modified TunnelServer.swift to only serve static files from bundled Resources
- Removed development path options from static file serving
- Added proper PATH configuration for npm in build script
- Add session status polling in session view to detect when sessions end
- Switch from live stream to static snapshot for exited sessions
- Fix session list player creation for toggled visibility states
- Use requestAnimationFrame for better DOM timing instead of setTimeout
- Rename checkbox label from "--filter-exited" to "hide exited"
- Implement smart kill/clean button behavior based on session status
- Remove all focus outlines from session view interface
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Increase General tab height by 50px to 450px for better spacing
- Style server port field with rounded border and centered text
- Center the Tailscale recommendation footer text
- Add tty-fwd-universal to inputPaths to fix "Operation not permitted" error
- Set alwaysOutOfDate flag to ensure build phase runs when needed
- Increase General settings tab height from 300 to 400 pixels
- Fix ngrok alert handling to use SwiftUI alerts instead of NSAlert
- Set startingUpdater to false in DEBUG builds to prevent automatic initialization
- Keep all automatic update checks and downloads disabled in DEBUG mode
- Only start the updater manually in release builds if needed
- This ensures no update-related dialogs appear during development
- Show alert dialog when attempting to enable ngrok without auth token
- Move update channel and check for updates from Advanced to General settings
- Place update controls under Application section for better accessibility
- Add AppKit import for NSAlert functionality
- Basic routing and keyboard handling implemented
- Terminal display and input sending functional
- Still needs polish and bug fixes before fully working
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix session count display to show on single line in menu bar
- Add conditional compilation to disable automatic updates in DEBUG mode
- Add "Open Dashboard" menu item that opens internal server URL
- Convert Help menu from popover to native macOS submenu style
- Enable automatic update downloads in Sparkle configuration
- Increase Advanced Settings tab height from 400 to 500 pixels
- Add Tailscale recommendation with clickable markdown link
- Fix Sendable protocol conformance issues throughout codebase
- Add ApplicationMover utility for app installation location management
These changes improve the overall user experience by making the UI more
intuitive and ensuring automatic updates work correctly in production
while being disabled during development.
- Add session-view.ts component for full-screen terminal interaction
- Implement real-time keyboard input handling for all key types
- Add routing between session list and interactive session view
- Support special keys, Ctrl combinations, and regular text input
- Remove compiled JS files from git tracking (should be build artifacts)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change asciinema player fit mode from 'both' to 'width' for horizontal expansion
- Add overflow-hidden to prevent vertical overflow from breaking layout
- Terminal previews now always use full card width
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add NgrokService to manage ngrok tunnel lifecycle
- Integrate ngrok with TunnelServer via API endpoints (/api/ngrok/*)
- Add UI controls in Advanced Settings for ngrok configuration
- Store auth tokens securely in macOS Keychain
- Add ServerMonitor to track server status across the app
- Show tunnel status and public URL when active
- Support CLI-based ngrok integration (requires brew install ngrok)
This allows VibeTunnel to be accessed remotely via ngrok tunnels,
fulfilling the "use Claude Code anywhere" promise.