by agrinman

agrinman / wormhole

Expose your local web server to the internet with a public URL.

980 Stars 36 Forks Last release: 3 months ago (0.1.12) MIT License 75 Commits 13 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

BuildRelease crate GitHub Docker Registry crate


lets you expose your locally running web server via a public URL. Written in Rust. Built completely with async-io on top of tokio.
  1. Install
  2. Usage Instructions
  3. Host it yourself


Brew (macOS)

brew install agrinman/tap/tunnelto


cargo install tunnelto

Or Download a release for your target OS here: tunnelto/releases


Quick Start

shell script
tunnelto --port 8000
The above command opens a tunnel and forwards traffic to

More Options:

```shell script ⇢ tunnelto --help tunnelto 0.1.6 Expose your local web server to the internet with a public url.


FLAGS: -h, --help Prints help information -V, --version Prints version information -v, --verbose A level of verbosity, and can be used multiple times

OPTIONS: -k, --key Sets an API authentication key to use for this tunnel -p, --port Sets the port to forward incoming tunnel traffic to on localhost [default: 8000] -s, --subdomain Specify a sub-domain for this tunnel

SUBCOMMANDS: help Prints this message or the help of the given subcommand(s) set-auth Store the API Authentication key

# Host it yourself
1. Compile the server for the musl target. See the `musl_build.sh` for a way to do this trivially with Docker!
2. See `Dockerfile` for a simple alpine based image that runs that server binary.
3. Deploy the image where ever you want.

Testing Locally

```shell script

Run the Server: xpects TCP traffic on 8080 and control websockets on 5000

ALLOWED_HOSTS="localhost" ALLOW_UNKNOWN_CLIENTS=1 cargo run --bin tunnelto_server

Run a local tunnelto client talking to your local tunnelto_server

CTRL_HOST="localhost" CTRL_PORT=5000 CTRL_TLS_OFF=1 cargo run --bin tunnelto -- start -p 8000

Test it out!

Remember 8080 is our local tunnelto TCP server

curl -H '.localhost' "http://localhost:8080/some_path?with=somequery"

Server Env Vars

    : which hostname suffixes do we allow forwarding on
    : an authentication key for restricting access to your tunnelto server
    : a boolean flag, if set, enables unknown (no authentication) clients to use your tunnelto server. Note that unknown clients are not allowed to chose a subdomain via


This implementation does not support multiple running servers (i.e. centralized coordination). Therefore, if you deploy multiple instances of the server, it will only work if the client connects to the same instance as the remote TCP stream.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.