Seikan is a self-hosted tunneling reverse proxy — an ngrok replacement — with automatic Let's Encrypt.

A public server exposes services running behind NAT/firewalls through a long-lived outbound tunnel from a client. The client dials the server over one TLS connection multiplexed with yamux; the server terminates public HTTPS (per-domain Let's Encrypt certs) and raw TCP, and proxies each public connection over the tunnel to the client, which forwards it to a local address.

            :443 HTTPS (autocert)       same :443, ALPN "seikan-tunnel"
 browser ───────────────────────► server ◄──────────────────────── client ──► localhost:3000
            Host: app.example.com    │  route Host→frontend→stream      (your machine)
 tcp     ───────────────────────►    │  per-frontend public TCP port
            :10000-20000             ▼  admin API on the admin host (Bearer key)

Two binaries, no external services. Client keys and connect tokens are stored only as SHA-256 hashes in an embedded bbolt database; administrator passwords as bcrypt hashes.

Clients dial the same :443 as browsers do. A client announces the seikan-tunnel ALPN protocol during the TLS handshake and the server hands that connection to the tunnel instead of the HTTP server, so exposing a service costs no extra inbound port.

Prerequisites

Server

Nothing else: no database, no reverse proxy in front, no external services. State (frontends, key hashes, autocert cache) lives on disk in /var/lib/seikan.

Client

Use cases →