Expose Localhost to the Internet. Securely.
The self-hosted, clientless alternative to ngrok. Maintain full control over your data and traffic with strict access policies.
Key Features
Zero Config
Works with standard OpenSSH installed on every machine. No client installation required.
Device Flow Auth
Secure, browser-based authentication for every session. OAuth 2.0 device flow.
Rust Core
Built on russh and tokio for high-performance async concurrency and minimal overhead.
God Mode
Admins can monitor active connections and terminate suspicious tunnels instantly.
Virtual Ports
Smart port handling - bind to port 80, forward to any local port seamlessly.
Private & Secure
Data never leaves your infrastructure. TLS termination and end-to-end encryption included.
How It Works
Terminal
User runs ssh -R from any machine with OpenSSH installed.
Gatekeeper
Node.js web server initiates device flow authentication.
Tunnel
Rust server establishes high-performance stream connection.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ YOUR DEV │ │ GATEKEEPER │ │ TUNNEL │
│ MACHINE │─────▶│ NODE.JS │─────▶│ RUST │
│ (ssh -R) │ │ (auth) │ │ (stream) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ │
└─────────── localhost:3000 ◀─────────────┘
EXPOSED AS
https://demo.youdomain
Self-Host in Minutes
Deploy your own tunnel server with Docker. Full control, zero dependencies on external services.
$ docker-compose up -d$ docker pull ghcr.io/ZingerLittleBee/EXLO:latest$ git clone https://github.com/ZingerLittleBee/EXLO && cd EXLO && cargo build --release# Server Configuration DOMAIN=your.domain SSH_PORT=2222 HTTP_PORT=80 HTTPS_PORT=443 # Authentication AUTH_PROVIDER=github GITHUB_CLIENT_ID=your_client_id GITHUB_CLIENT_SECRET=your_client_secret # Database DATABASE_URL=postgres://user:pass@localhost/fwd # TLS (auto-generated if not provided) TLS_CERT_PATH=/etc/ssl/certs/fwd.crt TLS_KEY_PATH=/etc/ssl/private/fwd.key
Contribute to EXLO
Open source thrives on community contributions. Here's how you can help make EXLO better.
Report Issues
Found a bug? Open an issue on GitHub with steps to reproduce.
$ gh issue createSubmit PRs
Fork the repo, make changes, and submit a pull request.
$ git checkout -b feature/awesomeImprove Docs
Help us improve documentation and tutorials.
$ vim docs/README.mdJoin Discord
Connect with other contributors and maintainers.
$ discord.gg/fwd-rs1. Fork the repository and create your branch from `main`.
2. If you've added code that should be tested, add tests.
3. Ensure the test suite passes with `cargo test`.
4. Make sure your code follows the existing style (`cargo fmt`).
5. Issue that pull request!
Join the Community
Connect with developers who are building and using EXLO around the world.