A user friendly linux GUI tool that allows users to easily create and maintain remote ssh tunnels.
- Easy Tunnel Management: Create, edit, and manage SSH tunnels through a simple, intuitive interface
- Multiple Configuration Files: Save, open, and manage different sets of tunnel configurations in YAML files
- Configuration Manager: Centralized interface for managing multiple tunnel configuration files (Ctrl+O)
- Import/Export: Load configurations from files or export current tunnels to new files
- Configuration Merging: Combine tunnels from multiple configuration files
- Persistent Configuration: Tunnel configurations are saved to disk in YAML format
- Real-time Status: See which tunnels are connected or disconnected at a glance
- Quick Connect/Disconnect: Toggle tunnel connections with a single click
- Enhanced Error Handling: Port conflict detection and SSH connectivity testing
- Connection Cancellation: Cancel connection attempts that are taking too long
- Custom Window Controls: Native desktop experience with custom title bar
- Keyboard Shortcuts: Efficient navigation with keyboard shortcuts
- System Tray Integration: Run in background with system tray support
- Linux-Optimized: Native Linux desktop application with AppImage distribution
- Ctrl+N: Add new tunnel
- Ctrl+O: Open Configuration Manager
- F5 / Ctrl+R: Refresh tunnel list
- Ctrl+Q: Close application (with confirmation)
- Ctrl+H: Hide to system tray
- ?: Show keyboard shortcuts help dialog
Tunstun now supports managing multiple YAML configuration files:
- Save As: Save current tunnels to a custom YAML file
- Open: Load tunnels from any YAML file
- Export: Export current configuration without changing the active file
- Merge: Combine tunnels from multiple files
- New: Create a new empty configuration
Use the folder icon in the toolbar for quick access to:
- Configuration Manager (Ctrl+O)
- New Configuration
- Open Configuration File
- Save As...
- Export Current Configuration
The Configuration Manager provides:
- View all configuration files in your tunstun configuration directory
- File information (tunnel count, last modified, size)
- Load, merge, or delete configurations
- Create new configurations
- Browse for files anywhere on your system
- Built-in Flutter file browser with no external dependencies
- Add a Tunnel: Click the "+" button to add a new tunnel configuration
- Connect/Disconnect: Use the play/stop buttons to control individual tunnels
- Manage Configurations: Press Ctrl+O to open the Configuration Manager
- Save/Load: Use the folder menu to save current tunnels or load different configurations
- Connect All: Use "Connect All" to start all tunnels at once
Download the latest AppImage from the Releases page:
# For Debian/Ubuntu 
apt install libayatana-appindicator3-1
# For Arch/Manjaro
pacman -S gtk3 libayatana-indicator libdbusmenu-glib
# Download and make executable
chmod +x tunstun-*.AppImage
# Run the application
./tunstun-*.AppImageAppImage Features:
- ✅ Self-contained, no installation required
- ✅ System tray integration
- ✅ Works on most Linux distributions
- ✅ Bundled system dependencies (libayatana-appindicator3, etc.)
./build-appimage.shThis creates two optimized AppImage versions:
- Release Version: tunstun-release-YYYYMMDD-HHMM-x86_64.AppImage(~19MB, production-ready)
- JIT Version: tunstun-jit-YYYYMMDD-HHMM-x86_64.AppImage(~47MB, debug build)
git clone https://github.com/weop/tunstun.git
cd tunstun
flutter pub get
flutter run -d linux- SSH client installed on your system
- SSH access to the jump server
- Linux: glibc 2.31+ (Ubuntu 20.04+, equivalent for other distros)
- Flutter 3.8.0 or higher
- Linux: sudo apt install libayatana-appindicator3-devfor system tray support
# Get dependencies
flutter pub get
# Install system tray dependencies
sudo apt install libayatana-appindicator3-dev
# Run on Linux desktop
flutter run -d linux
# Build for release
flutter build linux --releaseTunnel configurations are automatically saved to:
- Primary: ~/Documents/tunstun/tunnels.yaml
- Fallback: ~/tunstun/tunnels.yaml(if Documents directory is not accessible)
The tunstun directory is automatically created if it doesn't exist.
Example configuration format:
tunnels:
  - id: "example-1"
    name: "Development Server"
    remoteHost: "192.168.2.1"
    remotePort: 80
    sshUser: "ssh-user"
    sshHost: "ssh-server"
    localPort: 8080
    isConnected: false