// blog

← all posts

Why we host the lrok edge in Helsinki

·6 min read·infrastructure · pricing · eu

The first technical question I got after launching lrok was "why Helsinki?" I'll write the long version here once, link it from every comparison page, and stop having the conversation in DMs.

Three reasons that all matter

1. Hetzner is 4-10x cheaper than the US hyperscalers for the same hardware. A bare-metal box from Hetzner that I run lrok on — 8 cores, 64 GB RAM, 1 Gbps unmetered — costs €40/mo. The closest AWS equivalent (m7i.4xlarge with EBS bandwidth) is ~$650/mo. Cloudflare and ngrok both eat that cost; I don't have to. That difference is why lrok can charge $9/mo flat for Pro and still be profitable.

2. EU jurisdiction. GDPR-compliant operators selling to EU customers have to disclose where data is processed. Helsinki is in the EU; the legal posture is unambiguous. For European devs whose company prohibits sending request bodies through US-jurisdictional infra, "the edge is in Helsinki" is enough due diligence.

3. Latency is fine for everywhere except the US West Coast. Helsinki is ~30-50ms RTT to most of Europe, ~80-180ms to US-East, ~180-220ms to US-West. For webhook testing, OAuth callbacks, and mobile-app dev — the lrok use cases — that's invisible. For low-latency game traffic, it would matter; that's a market I'm not chasing.

What "edge" means here

A single Hetzner box runs the whole lrok control plane and forwarder. One process binds:

  • :8080 for HTTP forwarding (Traefik in front terminates TLS, hands me HTTP)
  • :7000 for the agent control plane (yamux over TLS, agents dial in)
  • :30000-30099 for raw TCP tunnels

Traefik handles TLS at the edge with Let's Encrypt; my Go process consumes Traefik's acme.json to share the cert for the agent control plane. One box, one binary, one Postgres, one Redis. Total infra cost ~€60/mo.

Multi-region is a nice-to-have on the roadmap for Pro customers who explicitly want sub-50ms RTT from US-East. It's not the lever I'd pull first; the per-region cost adds 100% to ops overhead and the 80ms-vs-30ms tradeoff doesn't matter for most webhook flows.

What I gave up

US-jurisdictional services (ngrok, Cloudflare Tunnel) win some enterprise procurement processes by default — "we already use Cloudflare; lrok is one more vendor". Solo devs and small teams are weight-insensitive there; mid-market sales would care.

us-east-1 default also wins on Stripe and Twilio webhook latency for US-based services — Stripe's edge is in Virginia. A webhook from Stripe to a Helsinki tunnel adds the trans-Atlantic hop. For testing it doesn't matter; for prod, you wouldn't run a webhook handler through a tunnel anyway.

What I'd do differently

If I were starting today and didn't already have the Hetzner setup running, I'd still pick Helsinki. The pricing math is too good. The thing I'd do differently is plan for multi-region from day one — not deploy multiple regions, but design the registry and routing so adding a us-east edge later is a flag flip.

Today, the registry is in-memory; cross-region replication would mean a real distributed store. Tractable, just not done.

The user-visible answer

When someone asks "is your service GDPR-friendly?", I say yes and link the privacy policy. When they ask "where is the edge?", I say Helsinki. When they ask "is there a US edge?", I say not yet, here's the latency I see from US-East. Three sentences, no spin.

$ curl -fsSL https://lrok.io/install.sh | sh
$ lrok login
$ lrok http 3000
  Forwarding https://violet-mole.lrok.io  →  http://127.0.0.1:3000

The server you're tunneling to is the same Helsinki Hetzner box I described above.

// try it yourself

lrok is a hosted reverse-tunnel: one command, public HTTPS URL, reserved subdomain on the free plan. $9/mo flat for unlimited.