Expose Localhost to the Internet. Securely.
The self-hosted solution for secure reverse tunneling that works with your existing SSH. No client installation, no extra software — just one command.
Key Features
No Client Required
Works with the OpenSSH already on your machine. No downloads, no installations, no agents.
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
Run a single ssh -R command — no client or agent to install.
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. Users connect with standard SSH — no client software required.
$ 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.