Before you start
- Tailscale account (free tier is fine)
- Same tailnet on every device
JANET_API_HOST=0.0.0.0on hosts that answer remotely
1 · Install janet-mesh + Tailscale
brew tap MzxzD/janet && brew install MzxzD/janet/janet-mesh
brew services start tailscale sudo tailscale up
tailscale status tailscale ip -4 janet-mesh-env
Enable MagicDNS in the Tailscale admin console.
2 · Bind Janet on the host
export JANET_API_HOST=0.0.0.0 janet-api-server
Put the same env in your LaunchAgent plist, systemd unit, or menu bar starter. WebSocket for Call Janet: run
simple_websocket_server.py from janet-seed if that’s your stack.3 · Linux firewall (ufw)
sudo ufw allow in on tailscale0 to any port 22 sudo ufw allow in on tailscale0 to any port 8080 sudo ufw allow in on tailscale0 to any port 8765 sudo ufw allow in on tailscale0 to any port 9090 sudo ufw reload sudo ufw status
4 · janet-peer trusted_networks
trusted_networks = [
"192.168.0.0/16",
"10.0.0.0/8",
"172.16.0.0/12",
"100.64.0.0/10",
]
5 · iPhone (Call Janet)
ws://YOUR-JANET-HOST.your-tailnet.ts.net:8765
Install the Tailscale app; sign in to the same tailnet.
6 · Health check from laptop
curl -sS "http://YOUR-JANET-HOST.your-tailnet.ts.net:8080/health"
7 · Cursor (Composer / Agent)
"cursor.openai.baseUrl": "http://YOUR-JANET-HOST.your-tailnet.ts.net:8080/v1", "cursor.openai.apiKey": "janet-local-dev"
8 · Continue.dev
apiBase: http://YOUR-JANET-HOST.your-tailnet.ts.net:8080/v1 apiKey: janet-local-dev
9 · Snippet helper (repo or Homebrew)
bash janet_cursor_tailscale_snippet.sh --skip-health YOUR-JANET-HOST.your-tailnet.ts.net
janet-cursor-tailscale-snippet --skip-health YOUR-JANET-HOST.your-tailnet.ts.net
Verification
| Check | Action |
|---|---|
| Tailscale | tailscale ping OTHER-NODE |
| API | curl …/health |
| iPhone | LTE + Tailscale → Call Janet connected |
| IDE | One Agent + one Continue turn |
Full runbook with repo links: Janet-Projects/janet_orchestration_module/docs/REMOTE_ACCESS_TAILSCALE.md. Inference stays on your hardware; Tailscale is only the overlay.