Docs
Start a tunnel in three steps, run it with your own frpc, or drive everything from the API or an AI assistant.
Install · rh commands · Plain frpc · Names · Access rules · Warning page · Limits · API · MCP
Install
Linux and macOS:
curl -fsSL https://remotehost.bitgeek.in/install.sh | sh
The script puts rh in ~/.local/bin (or /usr/local/bin as root). Windows and manual downloads:
- rh-darwin-amd64
- rh-darwin-arm64
- rh-freebsd-amd64
- rh-linux-amd64
- rh-linux-arm
- rh-linux-arm64
- rh-linux-riscv64
- rh-windows-amd64.exe
- rh-windows-arm64.exe
Checksums: SHA256SUMS. On first run rh downloads the
official frp client frpc 0.71.1 from GitHub into
~/.remotehost/ and checks it against SHA-256 sums built into rh.
rh commands
rh login <token> # token from the dashboard; saved in ~/.remotehost/config.json
rh http 3000 # tunnel to http://127.0.0.1:3000 on a random name
rh http 192.168.1.20:8123 # any host:port your machine can reach
rh http 3000 --name myapp # a name you reserved (paid plans)
rh status # account, plan and usage
rh version
rh http keeps running and reconnects by itself. Stop it with Ctrl-C. A random name stays yours for 10 minutes
after the tunnel stops, so a restart keeps the same URL.
Plain frpc
remotehost is a standard frp server. If you already run frpc (0.52 or newer), get a
name with the API (POST /api/v1/names) or from rh http, then use this config:
serverAddr = "connect.t.onio.in"
serverPort = 443
auth.token = "remotehost"
user = "<your account id>"
metadatas.token = "<your rh_ token>"
transport.protocol = "wss"
transport.heartbeatInterval = 30
transport.heartbeatTimeout = 90
loginFailExit = false
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 3000
subdomain = "<your name>"
auth.token is the same for everyone; your rh_ token is what signs you in. Only type = "http"
works for now. The dashboard shows your account id; GET /api/v1/client-config?name=<name>&local=3000 returns this file filled in.
Names
Every tunnel is https://<name>.t.onio.in.
- Random names (all plans): 8 characters, given to you by
rh httpor the API. Yours while the tunnel is online and for 10 minutes after. - Reserved names (Pro 3, Team 20): 3 to 40 characters of a-z, 0-9 and hyphens. Yours until you release them.
Access rules
Paid plans can protect a name with basic auth (user + password) and an IP allowlist (IPs or CIDR ranges). Set them in the
dashboard or with PUT /api/v1/names/<name>/rules. remotehost checks them before a request reaches your machine.
Warning page (Free)
On Free, the first time a browser opens your tunnel it sees a short page saying the site runs through remotehost, with a Continue button (remembered for 7 days). This keeps phishing off t.onio.in. It never shows for:
- requests that are not a browser page load (API calls, webhooks,
curl, fetch withouttext/html); - requests with the header
remotehost-skip-warning: 1; - paid plans.
Limits
| Free | Pro | Team | |
|---|---|---|---|
| Tunnels online at once | 1 | 5 | 25 |
| Reserved names | 0 | 3 | 20 |
| Bandwidth per period | 1 GB | 100 GB | 500 GB |
| Session length | 2 hours | Unlimited | Unlimited |
| Warning page for first-time visitors | Yes | No | No |
| Basic auth and IP allowlists | No | Yes | Yes |
| Custom domains | 0 | 1 | 5 |
| Seats | 1 | 1 | 10 |
Bandwidth counts bytes in and out. When it runs out, new tunnels are refused and visitors see a notice until the period resets. Free periods are calendar months (UTC).
API
Base URL https://remotehost.bitgeek.in/api/v1. Send Authorization: Bearer rh_…. Errors are
{"detail": "…"} with a 4xx status.
| Call | What it does |
|---|---|
GET /me | Account, plan limits, usage, and the frp settings for your client. |
GET /names | Your names with their access rules. |
POST /names {"name"?} | Get a name to start a tunnel on: one of yours, else a new random one. |
POST /names/reserve {"name"} | Reserve a name (paid). |
PUT /names/<name>/rules | {"basic_user", "basic_password", "allow_cidrs": []}; null turns one off. |
DELETE /names/<name> | Release a name. |
GET /tunnels | Online tunnels and those of the last 24 hours, with traffic. |
GET /client-config?name=&local= | A filled-in frpc.toml. |
GET /tokens, POST /tokens, DELETE /tokens/<id> | API tokens. A new token is shown once. |
curl -s -H "Authorization: Bearer $RH_TOKEN" -X POST https://remotehost.bitgeek.in/api/v1/names
MCP
MCP server (Streamable HTTP, JSON responses) at https://remotehost.bitgeek.in/mcp with Authorization: Bearer rh_….
Tools: account_status, list_names, get_name, reserve_name, release_name,
set_access_rules, list_tunnels, client_config, list_tokens,
create_token, revoke_token. Claude Code:
claude mcp add --transport http remotehost https://remotehost.bitgeek.in/mcp --header "Authorization: Bearer $RH_TOKEN"
About
remotehost runs the frp server and uses the unmodified frp client, both under the Apache License 2.0. The frp project does not endorse remotehost. Report abuse at /report.