# frp / rathole

Tunnels you host. frp and rathole are Apache-2.0 — ngrok without the tunnel meter.

**Replaces:** ngrok

**Tier:** Easy

## Problem

ngrok sells a public URL in front of a box you already run. You wanted that URL on a server you control. frp is Apache-2.0 (server + client). rathole is Apache-2.0 if you want a smaller Rust tunnel. Cloudflare Tunnel is not open source — do not call it the OSS path.

## Stack

- [frp](https://github.com/fatedier/frp) — Apache-2.0 fast reverse proxy (server + client)
- [rathole](https://github.com/rapiz1/rathole) — Apache-2.0 Rust tunnel if you want a smaller binary

## Estimated SaaS cost saved

| You stop paying | Typical / year | Self-host instead |
|---|---:|---|
| ngrok paid tunnel (small team) | $1,200 | frp or rathole server |

**About $1,200 / year** on a small team, before you count lock-in.

## Deploy on Railway

Placeholder: frp server (or rathole server) on Railway with a public domain; the client stays on the machine you are exposing. No one-click template in this repo yet — Start on Railway.

[Start on Railway](https://c17.io/go/railway/frp-tunnel?from=%2Fstacks%2Ffrp-tunnel.md)

[Headscale if this is a mesh VPN, not a public tunnel](https://c17.io/stacks/headscale-vpn)

## AGENT_PROMPT

```
Replace ngrok with frp (preferred) or rathole.

- Run the server on a public host. Point a domain at it. Run the client on the machine that used ngrok.
- Confirm one HTTP and one TCP path. Lock tokens. Write AGENT_PROMPT.md.
- Do not install Cloudflare Tunnel and call it open source.
```

## FAQ

### frp or rathole?

frp if you want the common docs. rathole if you want a smaller Rust binary. Pick one.

### Is this Tailscale?

No. Tailscale is a mesh VPN — /replace/tailscale. ngrok is a public ingress URL.

Source: https://c17.io/stacks/frp-tunnel
