How to reach the server from a phone
Run with uvx, pip or from source, the server listens only on 127.0.0.1:8770 on its own machine by default; with Docker Compose the port is published on every interface. To upload recordings, the phone has to reach it. This page gives two ways to do that, depending on your network.
App version
Since apk-v1.5.1 the app connects to http:// addresses: inside Tailscale or a LAN, enter the http:// address directly (an iOS build from main too, see Install and connect the phone app). Older APKs (1.5.0 and before) connect only to https://: upgrade, or follow The phone connects over the public internet below.
The phone and the server are on the same Tailscale network or LAN
Make the server reachable on its Tailscale or LAN address.
Docker:
docker-compose.ymlalready publishes the port on every interface; nothing to change. To publish it only on the Tailscale address, change the port line to this, then rundocker compose up -d:yamlports: - "100.x.y.z:8770:8770" # only on this machine's Tailscale addressWithout Docker: set
HOST=0.0.0.0in.envand restart the server.
In a browser on your computer, open the web UI at the address the phone will use, e.g.
http://100.x.y.z:8770/?token=<your token>(a Tailscale address) orhttp://192.168.1.10:8770/?token=<your token>(a LAN address).Open 连接手机 (Connect phone,
/connect) and scan the QR code with the app. The QR code carries the address picked under 「手机用哪个地址」 (Address for the phone): with the page opened at127.0.0.1, the first Tailscale or LAN address the server finds is picked by default. In Docker the server can't see the computer's interfaces, so the list has only this page's own address: open the page at the computer's LAN or Tailscale address, or pick 「自己填」 (Enter it yourself).
The phone connects over the public internet
- Put a reverse proxy with TLS in front of port 8770, such as Caddy, nginx, a Cloudflare Tunnel or Tailscale Serve. The proxy must forward WebSockets (the web UI receives pushes on
/ws). - Point the proxy's health check at
GET /api/health: it needs no token and returns{"ok":true}. - Open the web UI at
https://<your-domain>/?token=<your token>, then scan the QR code on 连接手机.
Don't expose a server whose token is empty: anyone could then read and write your data.
With nginx: by default it accepts request bodies of up to 1 MB only (client_max_body_size), so it rejects larger recording files with 413 when you import recordings. Raise the limit.