Show HN: Self-hosted tunnels: local directory/port, your domain, HTTPS, passkeys Developer Markus Schappim released mygrok, a self-hosted tunnel tool written in about 9,500 lines of Go with eight dependencies, that lets users forward local ports or directories to public HTTPS URLs on their own domains without accounts, session limits, or third-party infrastructure. The tool includes two binaries, mygrokd for the server and mygrok for clients, and supports stable subdomains, automatic TLS, WebAuthn passkeys, IP rules, and quick recovery from network blips, with installation via Homebrew, Go, or a server install script. Your own ngrok. Forward a local port to a public HTTPS URL on a domain you own — on a server you own, for the price of the smallest VPS your provider sells. Two Go binaries, no daemon zoo, no account, no session limits, no "your tunnel expired" page. mygrokd runs on a box with wildcard DNS pointed at it; mygrok runs wherever you want to expose something. mygrok http 3000 --subdomain=jarvis → https://jarvis.your-domain.com mygrok serve gallery ./photos static folder, public URL, one command mygrok mcp 8790 --subdomain=tools local MCP server → claude.ai connector Why why · Install install · 60 seconds to a public URL 60-seconds-to-a-public-url What it looks like what-it-looks-like — the web UI Locking things down locking-things-down — basic auth, IP rules, passkeys Feature tour feature-tour · CLI at a glance cli-at-a-glance Docs: CLI reference /schappim/mygrok/blob/main/docs/cli.md · Config file /schappim/mygrok/blob/main/docs/config.md · Access control /schappim/mygrok/blob/main/docs/access-control.md · Run your own server /schappim/mygrok/blob/main/docs/server.md · MCP connectors /schappim/mygrok/blob/main/docs/mcp.md · Architecture & protocol /schappim/mygrok/blob/main/docs/architecture.md Limitations limitations · Contributing /schappim/mygrok/blob/main/CONTRIBUTING.md · Security /schappim/mygrok/blob/main/SECURITY.md Tunnel services are great until you're paying monthly for a random subdomain that changes every restart, or your webhook testing hits a session limit mid-debug, or you'd rather not route your unreleased product through someone else's infrastructure. mygrok is the boring alternative: you own every piece. The server, the domain, the certificate, the auth token, the binary. Nothing phones home. There's no account to create and no free tier to age out of. The whole thing is about 9,500 lines of Go with eight dependencies. What you get that a plain SSH reverse tunnel doesn't give you: Stable, memorable URLs. jarvis.your-domain.com , every time. Real TLS , issued and renewed automatically. No self-signed warnings. Survives reboots — one command installs a launchd agent or systemd unit. Access control that isn't just a password — IP rules and WebAuthn passkeys, both managed from a web UI or the CLI. Heals from network blips in under a second instead of sitting in backoff waiting for a dead session to time out. Homebrew macOS and Linux : brew install schappim/mygrok/mygrok From your own server — this is the nice one. Binaries served by your mygrokd are stamped with its address at build time, so they arrive already knowing where to connect: curl -sSL https://tunnel.your-domain.com/install | bash Set MYGROK INSTALL DIR=$HOME/bin if you'd rather not use sudo. With Go: go install github.com/schappim/mygrok/cmd/mygrok@latest Homebrew and go install builds are deliberately generic — they carry no default server, so point them at yours with MYGROK SERVER or ~/.mygrok/config.toml . See Config file /schappim/mygrok/blob/main/docs/config.md . One command on a fresh Debian/Ubuntu box — DigitalOcean, Hetzner, EC2, Vultr, a Pi under your desk: curl -sSL https://raw.githubusercontent.com/schappim/mygrok/main/deploy/install-server.sh \ | sudo bash -s -- --domain example.com --email you@example.com It creates a service user, installs the binary, generates an auth token, writes a hardened systemd unit, opens the firewall, and prints the two DNS records to add. Full walkthrough for each cloud, plus DNS and certificate options, in docs/server.md . export MYGROK AUTHTOKEN="