Everything the client and the dashboard can do today. Contents: Quickstart · Locking a link · Webhooks · Stable URLs · Request log · Limits · Error codes · How it works
Needs Linux or macOS (x86_64 or arm64), bash, curl and python3. The installer puts frpc (the open-source frp client, v0.61.1) and the ot script into ~/.local/bin.
curl -fsSL https://app.overnight.technology/install.sh | bash export PATH="$PATH:$HOME/.local/bin" ot login --token YOUR_API_TOKEN # shown on the dashboard after signup ot http 3000 --slug demo # your app on localhost:3000
You get https://demo.overnight.technology. The token and settings are kept in ~/.config/ot-tunnels/. Stop the tunnel with Ctrl+C.
Every tunnel requires auth. Requests that fail it get a 401 and never reach your machine.
| Mode | Command | How visitors get in |
|---|---|---|
| token (default) | ot http 3000 --slug demo | Header X-OT-Tunnel: <secret>, or open https://demo.overnight.technology/?ot=<secret> |
| basic | ot http 3000 --slug demo --basic client:s3cret | The browser asks for username and password |
| own secret | ot http 3000 --slug demo --secret my-long-secret | Token mode with a secret you choose instead of a generated one |
| IP allowlist | ot http 3000 --slug demo --allow 203.0.113.7,10.0.0.0/8 | Only those IPs or CIDRs, and they still need the token or password |
The same options are in the dashboard under Create tunnel.
Webhook senders cannot type a password, so use token mode and put the secret in the URL you register with them:
ot http 4242 --slug hooks --secret a-long-random-string # register this as the webhook URL: https://hooks.overnight.technology/your/webhook/path?ot=a-long-random-string
The query string is passed through to your app unchanged, so ignore the ot parameter there. Each delivery shows up in the request log with its status code.
A slug belongs to the account that created it. Running ot http again with the same slug keeps the same URL and applies the flags you pass this time, so you can restart your laptop or change the port without sending a new link. If you passed no --secret, the existing secret stays. Running without --allow clears the allowlist.
The dashboard lists the latest 200 requests per tunnel: time, method, path, status, client IP, browser and bytes in and out, including requests that were refused with 401. Request and response bodies are not stored. The API is GET https://app.overnight.technology/api/tunnels/<slug>/logs with Authorization: Bearer <API token>.
| Plan | Price | Tunnels | Requests per day (UTC) | Transfer per month |
|---|---|---|---|---|
| Starter | €9/mo | 1 | 10,000 | 1 GB |
| Builder | €19/mo | 3 | 50,000 | 5 GB |
| Team | €29/mo | 10 | 200,000 | 20 GB |
Request bodies up to 20 MB. Your app has 60 seconds to answer each request. After the daily request limit, requests get a 429 until midnight UTC.
| 401 | Missing or wrong token or password, or the visitor's IP is not on the allowlist. |
| 404 unknown tunnel | No tunnel with that slug exists. |
| 409 slug taken | Another account owns that slug. Pick a different one. |
| frpc: start proxy error | The tunnel server only lets your account bind slugs it owns. “this slug does not belong to your account”: create it with ot http first. “client too old”: clients installed before 7 November 2026 need the install command again. |
| 429 | Daily request limit for your plan reached. |
| 502 / 404 from frp | Auth passed, but ot http is not running or nothing is listening on the local port. |
frpc on your machine keeps an outbound connection to ctrl.overnight.technology:7000, so no inbound ports or router changes are needed. Public HTTPS terminates at Cloudflare, passes our auth gateway on our server in Nuremberg, Germany, and only then goes through frps to your machine. Service checks run every 60 seconds on the status page. Questions: hello@overnight.technology.