ngrok is $8/mo (Personal). Relay is a self-hosted alternative at $0.99/mo. Here's when each makes sense.
| Relay | ngrok | |
|---|---|---|
| Hosting | Self-hosted, your infra | Managed SaaS (cloud only) |
| Data location | Your server, your disk | ngrok's cloud |
| Free tier | 1 tunnel | Paid only |
| Pro pricing | $0.99/mo | $8/mo (Personal) |
| Dependencies | None (single binary + SQLite) | N/A (managed) |
| Setup time | ~30 seconds | Account signup |
| Dashboard | Built-in at /ui | Cloud dashboard |
| License | BSL 1.1 | Proprietary SaaS |
Relay is a single Go binary with embedded SQLite. Install it with one command, and you are running in under a minute. Your data stays on your server.
curl -fsSL https://stockyard.dev/relay/install.sh | sh
Teams evaluating ngrok alongside Relay tend to split on two axes: feature depth and data residency. ngrok wins on feature depth — it is a mature product with integrations, mobile apps, and a dedicated support team. Relay wins on residency — your tunnel and port forwarder data lives on your server in a SQLite file you can inspect, back up, and migrate without asking anyone for permission.
Relay runs as a single static binary with an embedded SQLite database. There is no application server, no cache layer, no background worker. One process handles HTTP requests and reads from and writes to the database file directly. This simplicity is the entire point — fewer moving parts means fewer things that can break at 2 AM.
Moving from ngrok does not have to be all-or-nothing. Some teams run Relay for new data while keeping ngrok as a read-only archive of historical records. The API makes it straightforward to build a sync script if you need both systems to reflect the same data during a transition period.
Single binary. Free to start. $0.99/mo for Pro.