A cross-platform GUI application for managing multiple wstunnel instances. Built with Rust and iced-rs for a native, performant user interface.
- Visual Management: View all configured tunnel instances with real-time status indicators (green/running, red/stopped)
- Easy Configuration: Add, edit, and delete tunnel configurations through a form-based UI
- Lifecycle Control: Start, stop, and delete tunnels from the interface
- Autostart Support: Configure tunnels to start automatically when the application launches
- Log Access: View tunnel process logs with one click (opens in default text editor)
- Headless Mode: Run without GUI for server deployments and automation
- Custom Paths: Specify custom config file and wstunnel binary paths via CLI or config file
- Rust 1.89.0 or newer
- wstunnel binary (repository included in submodule or specify custom path)
# Clone with submodules
git clone --recursive https://github.com/RobbyV2/wstunnel_manager.git
cd wstunnel_manager
# Or initialize submodules if already cloned
just src get-submodules
# Build both binaries
just src build-temp# GUI mode
just src run
# Headless mode (for servers)
just src run-headless
# Mock mode (for development/testing)
just src run-mockNote: All just commands must be run from the project root (not inside the wstunnel folder, as it has its own justfile).
Configuration is stored in config.yaml (created automatically on first run). Examples are in ./config_examples
- Launch the application with
just src runor./target/wstunnel_manager - Click "Add" to create a new tunnel configuration
- Fill in the tunnel details:
- Tag: A descriptive name for the tunnel
- CLI Args: wstunnel command-line arguments
- Autostart: Check to start automatically on launch
- Click "Start" to launch a tunnel
- Click "Logs" to view tunnel output
- Click "Stop" to terminate a running tunnel
- Click "Delete" to remove a tunnel configuration
For server deployments or automation:
# Run with default config (./config.yaml)
./wstunnel_manager --headless
# Run with custom config path
./wstunnel_manager --headless --config /path/to/config.yaml
# Run with custom wstunnel binary
./wstunnel_manager --headless --wstunnel-path /path/to/wstunnelHeadless mode:
- Starts all tunnels with
autostart: true - Logs to configured log directory
- Gracefully shuts down all tunnels on SIGTERM/Ctrl+C
- No GUI window
For UI development without spawning real processes:
# Windows
set WSTUNNEL_MANAGER_MOCK=1 && cargo run
# Linux/macOS
WSTUNNEL_MANAGER_MOCK=1 cargo run
# Or use just (from project root)
just src run-mockNote: All commands must be run from the project root using just src <command>.
# Format code
just src fmt
# Check code (no compilation)
just src check
# Build debug binary
just src build
# Build release binary
just src build-release
# Run tests
just src test
# Build wstunnel from submodule (note: runs in wstunnel directory automatically)
just src build-wstunnel
# Build both binaries to ./temp folder
just src build-temp
# Clean build artifacts
just src cleanTunnel process logs are stored in ./logs/ (or configured) with the format:
logs/{name}-{pid}-{timestamp}.log
Where {name} is the sanitized tunnel tag (or tunnel ID if no tag is set).
Logs contain:
- wstunnel stdout/stderr output
- Timestamps for each line
- Process exit codes and errors
Access logs by:
- Clicking "Logs" button in GUI (opens in default text editor)
- Navigating to the logs directory manually
- Make it so that headless mode has more useful commands, like a status command