Skip to Content
Teitunnel

Getting started

Install Teitunnel

Download and install Teitunnel on macOS, Windows or Linux, with Homebrew, winget, apt or dnf, or install the teitunnel command on a server or in Docker. Verify, update and uninstall.

Teitunnel runs on macOS 14 or later, Windows 10 and 11 and Linux (GNOME, KDE and other desktops). The teitunnel command runs on the same systems, on any Linux server and in Docker. It's free and open source, and it installs and checks Cloudflare's cloudflared for you.

Download

The button below picks the right file for your computer. Other systems are in the tabs further down, and every file is also on the download page.

DownloadVersion 0.6.0 · free

Install it

Open the disk image

Open Teitunnel_…_universal.dmg from your Downloads folder. One download runs on both Apple silicon and Intel Macs.

Drag Teitunnel to Applications

Drag the Teitunnel icon onto the Applications folder in the window that opens, then eject the disk image.

Open it

Open Teitunnel from Applications or Spotlight. The first time, macOS asks whether to open an app downloaded from the internet: choose Open. The app is signed with Teispace's Developer ID and notarized by Apple.

Teitunnel lives in the menu bar as well as the Dock, and keeps credentials in your keychain.

With Homebrew, the same signed app, with the teitunnel command linked for you:

brew install --cask teispace/tap/teitunnel

The first launch

Teitunnel opens on Overview. Before anything can be shared it needs cloudflared, Cloudflare's connector:

  • If you already have one (from Homebrew, winget or your package manager), Teitunnel finds and uses it.
  • If not, choose Install cloudflared. Teitunnel downloads the latest release from GitHub and checks it before use: the download must match the digest GitHub publishes, the binary must match the checksum in Cloudflare's release notes, and on macOS its code signature must be Cloudflare's. A request GitHub can't answer is tried up to three times, and a download that stalls for 30 seconds stops with an error instead of waiting forever. On a CI runner, set GITHUB_TOKEN so the release lookup doesn't share GitHub's limit for anonymous requests (the token goes to GitHub's API only).

The managed copy lives in Teitunnel's own folder and is updated from Settings ▸ cloudflared. When it updates, running connectors move to the new version without dropping your routes.

Then share something with Quick Share (no account needed), or connect a Cloudflare account to use your own domains.

Overview after setup: traffic, routes and Quick Shares
Overview, once you have routes and shares.

The teitunnel command

Every copy of the app comes with the teitunnel command, for routes, shares and the Doctor from a terminal, a script or over SSH. Where the system's installer can put it on your PATH, it does:

Installed withThe command
Windows installerOn the PATH; the uninstaller removes it
Linux .deb or .rpm/usr/bin/teitunnel
Homebrew caskLinked into Homebrew's bin
macOS disk image, Linux AppImageOffered once after setup

On the disk image and the AppImage, the Overview asks once, Use Teitunnel from the terminal too? Install links it into Homebrew's bin or /usr/local/bin on macOS, or ~/.local/bin with the AppImage. If Teitunnel can't write to that folder, it shows the one command to run instead. Not Now is remembered too.

Either way, Settings ▸ General ▸ Command line installs or uninstalls it at any time, and says where it is. It updates with the app. Teitunnel never replaces or removes a teitunnel it didn't put there. See the command line reference.

Tab completion

teitunnel completions <shell> prints a completion script for bash, zsh, fish, powershell or elvish. It completes commands and flags, and also your own hostnames, tunnels, domains, shares and accounts, read from this computer without going online. Load it in every new shell:

source <(teitunnel completions zsh)                  # zsh, in ~/.zshrc
eval "$(teitunnel completions bash)"                 # bash, in ~/.bashrc
teitunnel completions fish > ~/.config/fish/completions/teitunnel.fish
teitunnel completions powershell | Out-String | Invoke-Expression  # in $PROFILE

--static prints a script with commands and flags only, which never runs teitunnel.

Verify a download

Every file is built from the public repository by GitHub Actions and listed in the release's SHA256SUMS.txt, with build provenance you can check with the GitHub CLI:

shasum -a 256 -c SHA256SUMS.txt --ignore-missing     # macOS (sha256sum -c on Linux)
gh attestation verify Teitunnel_0.2.0_universal.dmg --repo teispace/teitunnel

Homebrew, the Linux repository and the Docker image check the same files. Details, and the Windows commands, are in Verify a download.

Updates

Teitunnel checks for a new version when it opens and once a day, and downloads it in the background. Every update is signed, and the app refuses one whose signature doesn't match the key built into it. When an update is ready, the sidebar says so: choose Restart to Update, or just quit, and it installs. On Linux, .deb and .rpm installs wait for Restart to Update, because your system asks for an administrator password. If you installed from Teitunnel's repository, sudo apt upgrade or sudo dnf upgrade brings new versions too.

A check downloads one small file from GitHub and sends nothing about you. To check only when you ask, turn off Settings ▸ General ▸ Check for updates automatically; on macOS, Teitunnel ▸ Check for Updates… checks now.

The teitunnel command that came with the app updates with it. Elsewhere:

Installed withUpdate with
Homebrewbrew upgrade teitunnel (cask) or brew upgrade teitunnel-cli (formula)
wingetwinget upgrade Teispace.Teitunnel
apt or dnf repositorysudo apt upgrade or sudo dnf upgrade
Dockerdocker pull teispace/teitunnel, then recreate the container
A downloaded archiveDownload the new one and replace the file

Update to 0.2.0 before 5 October 2026

From 2026-10-05 Cloudflare stops including a tunnel's connections in its tunnel list. 0.2.0 reads them from Cloudflare's new endpoint; 0.1.x would show every tunnel as if no machine ran it. See What's new in 0.2.0.

Uninstall

Uninstalling doesn't change your Cloudflare account: tunnels, routes and DNS records stay. To clean up first:

  1. Remove your routes in Teitunnel (Routes), so their DNS records go too.
  2. Turn off Keep running when Teitunnel quits in Tunnels, so no connector keeps running as a service.
  3. If you installed the command from Settings ▸ General ▸ Command line, choose Uninstall there.
  4. Settings ▸ Accounts ▸ Disconnect each account: it deletes the credentials from your keychain and revokes sign-ins.

Then remove the app:

SystemRemove the appSettings and history
macOSDrag Teitunnel from Applications to the Trash, or brew uninstall --cask teitunnel (--zap also removes its settings)~/Library/Application Support/com.teispace.teitunnel
WindowsSettings ▸ Apps ▸ Installed apps ▸ Teitunnel ▸ Uninstall (removes the command too)%APPDATA%\com.teispace.teitunnel
Linuxsudo apt remove teitunnel, sudo dnf remove teitunnel, or delete the AppImage; to drop the repository too, delete /etc/apt/sources.list.d/teitunnel.list or /etc/yum.repos.d/teitunnel.repo~/.local/share/com.teispace.teitunnel
ServerDelete teitunnel, or brew uninstall teitunnel-cli, or remove the container and its teitunnel volumeThe same folder as on that system

Delete that folder too if you want nothing left behind. To build Teitunnel yourself instead, see the contributing guide.

Next

Edit on GitHub

Last updated on

On this page