A custom desktop application for managing SSH port forwarding to a Trinity Core private World of Warcraft server. Built with Electron, React, and TypeScript.
- 🔒 Secure SSH Tunneling: Establish encrypted port forwarding to your Trinity Core server
- 🔄 Automatic Reconnection: Exponential backoff retry logic (1s → 60s) for resilient connections
- 📊 Real-time Status: Live tunnel status indicators with connection state visualization
- ⚙️ Easy Configuration: YAML-based configuration file for multiple server profiles
- 🎨 Modern UI: Clean, dark-themed React interface with TailwindCSS
- 🐳 Docker Ready: No local dependencies needed - all tooling runs in Docker
- Docker and Docker Compose
- SSH private key for your Trinity Core server
- Configuration file (
araxiatrinity.yml)
- Create configuration file in your home directory:
cat > ~/araxiatrinity.yml << 'EOF'
version: 2
autoConnect: true
servers:
- name: "BattleNet Server"
host: "your.server.com"
serverType: "auth"
tunnels:
- localPort: 1119
remotePort: 1119
name: "BattleNet Auth"
- localPort: 8081
remotePort: 8081
name: "BattleNet Realm"
- name: "WorldServer 1"
host: "your.server.com"
serverType: "world"
tunnels:
- localPort: 8085
remotePort: 8085
name: "WorldServer"
EOF- Build Docker image:
docker-compose build- Run the application:
docker-compose upThe launcher will start in development mode with hot reloading.
- Select a Server: Click on a server in the left sidebar
- Connect: Click the "Connect" button to establish SSH tunnels
- Monitor: Watch tunnel status indicators for connection state
- Edit Config: Click "Edit Config" to modify server settings
- Disconnect: Click "Disconnect" to close tunnels
The araxiatrinity.yml file defines your server connections:
version: 2
autoConnect: true
servers:
- name: "BattleNet Server"
host: "server.example.com"
serverType: "auth"
tunnels:
- localPort: 1119
remotePort: 1119
name: "BattleNet Auth"
- localPort: 8081
remotePort: 8081
name: "BattleNet Realm"
- name: "WorldServer 1"
host: "server.example.com"
serverType: "world"
tunnels:
- localPort: 8085
remotePort: 8085
name: "WorldServer"
# Add multiple world servers with different local ports
- name: "WorldServer 2"
host: "server.example.com"
serverType: "world"
tunnels:
- localPort: 8086
remotePort: 8085
name: "WorldServer"Server Types:
auth- BattleNet authentication server (typically only one)world- World servers (can have multiple with different local ports)
Configuration Versioning:
The launcher automatically migrates old configuration files to the latest version. If you have a config without serverType fields, the launcher will:
- Detect the server type based on name and port numbers
- Add the
serverTypefield automatically - Save the updated configuration
- Log the migration process to the console
Current config version: 2
See SETUP.md for detailed configuration instructions.
- Electron Main Process: Manages SSH connections and IPC
- React UI: Real-time tunnel status and configuration
- SSH Tunneling: Port forwarding via ssh2 library
- Configuration: YAML-based, stored in user home directory
See ARCHITECTURE.md for technical details.
- SETUP.md - Installation and configuration guide
- ARCHITECTURE.md - Technical architecture
- DECISIONS.md - Design decisions and rationale
- PLAN.md - Development roadmap
- PROGRESS.md - Development progress tracking
docker-compose run builder npm run builddocker-compose updocker-compose exec builder sh- Electron 28 - Desktop application framework
- React 18 - UI framework
- TypeScript 5 - Type-safe JavaScript
- Vite 5 - Build tool and dev server
- TailwindCSS 3 - Utility-first CSS
- ssh2 1.14 - SSH client library
- js-yaml 4.1 - YAML parser
- Lucide React - Icon library
- ✅ Context isolation between main and renderer processes
- ✅ Preload script validates all IPC messages
- ✅ SSH credentials never logged or stored in memory
- ✅ Private key authentication (no passwords)
- ✅ Secure IPC message passing
- Verify SSH server is running on remote host
- Check firewall allows SSH (port 22)
- Confirm SSH key has correct permissions:
chmod 600 ~/.ssh/id_rsa
- Check what's using the port:
lsof -i :PORT - Change local port in configuration
- Verify
araxiatrinity.ymlexists in home directory - Check YAML syntax is valid
- Ensure file permissions allow reading
See SETUP.md for more troubleshooting steps.
MIT
Contributions welcome! Please see CONTRIBUTING.md for guidelines.
For issues and questions, please open an issue on GitHub.