mirror of
https://github.com/VibedByKaKi/t3-code-android-nightly.git
synced 2026-10-09 11:51:15 +02:00
343 lines
17 KiB
Markdown
343 lines
17 KiB
Markdown
# Remote access
|
|
|
|
Connect a phone, browser, or another desktop app to T3 Code running on a different
|
|
machine. That machine must stay running and reachable while you work.
|
|
|
|
## T3 Connect
|
|
|
|
T3 Connect makes an environment available to your other devices without setting
|
|
up router forwarding. In the desktop app on the host, open **Settings →
|
|
Connections**, sign in, and enable **T3 Connect** for that environment.
|
|
|
|
For a command-line host, run:
|
|
|
|
```bash
|
|
t3 connect
|
|
```
|
|
|
|
Follow the sign-in instructions. Setup offers a
|
|
[background service](./background-service.md); if you decline it, start the
|
|
server with `t3 serve`. Saving your sign-in alone does not make the machine
|
|
reachable.
|
|
|
|
On your other device, sign in to the same T3 Connect account and choose the
|
|
environment. Over SSH, the CLI prints a browser link and a short code. Open the
|
|
link on any device, confirm the code matches, and approve. The CLI continues on
|
|
its own, so you do not need to forward an OAuth callback port.
|
|
|
|
T3 Connect renews access credentials when needed without disconnecting a healthy
|
|
connection. Pull request diffs and provider settings keep working after the
|
|
previous credential expires. A failed renewal affects that request; it does not
|
|
disconnect an otherwise healthy conversation.
|
|
|
|
## Pair over a LAN or private network
|
|
|
|
Use direct pairing when the other device can reach the host's network address.
|
|
|
|
On a desktop host, open **Settings → Connections**, enable **Network access**,
|
|
then create a pairing link using an address the other device can reach. Changing
|
|
network access restarts the desktop app. You can turn it off in the same place.
|
|
|
|
For a command-line host, replace `<private-ip>` with the host's LAN or tailnet
|
|
address:
|
|
|
|
```bash
|
|
t3 serve --host <private-ip>
|
|
```
|
|
|
|
If a server is already running, generate a fresh link without restarting it:
|
|
|
|
```bash
|
|
t3 pair
|
|
```
|
|
|
|
Scan the QR code on your phone or paste the pairing URL into **Add environment**
|
|
in the receiving app. Connection settings are under **Settings → Connections**
|
|
on web and desktop and **Settings → Environments** on mobile. A loopback address
|
|
such as `127.0.0.1` reaches only the device opening the link.
|
|
|
|
Pairing authorizes that device for future connections. Use a fresh one-time link
|
|
for each new device; you do not need the original token to reconnect. Links
|
|
created in Settings can only be copied from the client that created them while
|
|
its Connections page stays open. If you leave or reload that page, create
|
|
another link to share.
|
|
|
|
### Reach one machine several ways
|
|
|
|
A machine can have more than one route: LAN, Tailscale, a public URL, SSH, or
|
|
T3 Connect. To add one, choose **Add route** in the machine's route list, or
|
|
next to it in the T3 Connect list. Pairing the same machine again over another
|
|
address also adds a route instead of a second machine. A new route is placed by
|
|
speed, in that order, and you can reorder routes at any time.
|
|
|
|
While connected through T3 Connect or a paired address, T3 Code also learns the
|
|
machine's current LAN and Tailscale addresses and adds them as routes, so
|
|
pairing once through T3 Connect is enough to use the LAN at home. When the
|
|
machine's LAN address changes, for example after it joins another Wi-Fi network,
|
|
the learned route follows it. The machine must allow network access for its LAN
|
|
address to be learned. You can reorder a learned route, but not remove it; it
|
|
goes away with the route it was learned through, or when the machine stops
|
|
reporting that address.
|
|
|
|
T3 Code connects over the first route that answers. Away from home, a LAN
|
|
address that does not answer is checked briefly and skipped. It is only tried
|
|
again, after the other routes, if none of them connect. While connected over a
|
|
later route, T3 Code checks the earlier ones when your network changes, when you
|
|
return to the app, and every minute, and moves back as soon as one works.
|
|
|
|
On web and desktop, select the route count under the machine's name in
|
|
**Settings → Connections** to see its routes. Drag a route to change the order,
|
|
or remove it. On mobile, open the machine under **Settings → Environments** and
|
|
choose **Edit**. Signing out of T3 Connect removes only that route; a machine
|
|
you can still reach another way stays saved.
|
|
|
|
Open **Permissions** next to **Routes** in web or desktop, or **Your permissions**
|
|
in the mobile route details, to see what your current connection can do on that
|
|
environment. For a remote environment, this is in its route details. Permissions
|
|
shown there apply only to the route marked **In use**; other routes are not
|
|
checked. Direct pairing and T3 Connect have separate sessions and may grant
|
|
different permissions.
|
|
|
|
### Balance new threads across machines
|
|
|
|
Auto balance is off by default. On web and desktop, enable it in
|
|
**Settings → Connections → Load balancing** to automatically choose a machine for
|
|
new threads in projects grouped across connected environments. The section
|
|
appears once two or more machines are switched on.
|
|
Each machine starts at **Normal**. Choose **Prefer** to favor it when it has CPU and
|
|
memory available, **Less often** to reduce its share, or **Manual only** to exclude
|
|
it from automatic selection. These are preferences, not fixed traffic percentages.
|
|
Preferences are saved separately in each client.
|
|
|
|
The composer checks eligible machines when choosing a draft's environment, then keeps
|
|
that choice stable. Choose **Auto balance** again to check current resources, or choose
|
|
a specific machine to override it. Choosing a branch or worktree also keeps the draft
|
|
on that machine. Existing threads stay where they started. If resource checks are
|
|
unavailable or all eligible machines are full, choose a machine manually to continue.
|
|
Mobile keeps its manual environment selection.
|
|
|
|
### Tailscale HTTPS
|
|
|
|
Join both devices to the same tailnet. In the desktop app, enable **Tailscale
|
|
HTTPS** in **Settings → Connections**. Turn it off there to remove that route.
|
|
|
|
To start a command-line server with Tailscale HTTPS:
|
|
|
|
```bash
|
|
t3 serve --tailscale-serve
|
|
```
|
|
|
|
For an already-running server:
|
|
|
|
```bash
|
|
t3 pair --tailscale
|
|
```
|
|
|
|
The pairing link uses an address such as `https://machine.tailnet.ts.net/`.
|
|
The mapping created by `pair --tailscale` persists across restarts. Remove its
|
|
default-port mapping with:
|
|
|
|
```bash
|
|
tailscale serve --https=443 off
|
|
```
|
|
|
|
If that port is already in use, choose another with
|
|
`--tailscale-serve-port`. See `t3 pair --help` for other pairing options.
|
|
|
|
### Hosted web app
|
|
|
|
[app.t3.codes](https://app.t3.codes) needs an HTTPS endpoint. It connects directly
|
|
to your server; a hosted pairing link does not make an unreachable backend
|
|
reachable or convert HTTP to HTTPS.
|
|
|
|
For a plain HTTP LAN endpoint, use the direct pairing URL in a browser that can
|
|
open it, or pair from the desktop app. On mobile, an IP address entered without a
|
|
scheme uses HTTP, so include `https://` when your server uses HTTPS.
|
|
|
|
## Desktop-managed SSH
|
|
|
|
In the desktop app, open **Settings → Connections → Add environment**, choose
|
|
**SSH**, and enter a host or SSH alias such as `user@example.com`. T3 Code starts
|
|
or reuses a server there and opens the port forward for you. Projects, provider
|
|
credentials, and agent work stay on the remote machine.
|
|
|
|
The remote host must be Linux or an Apple Silicon Mac with `curl` or `wget`,
|
|
`tar`, `sha256sum` or `shasum`, and [provider setup](./install.md#providers).
|
|
The first launch downloads T3 Code's server to `~/.t3/runtime` on the host, so
|
|
it takes longer than later ones.
|
|
Provider CLIs must be on the `PATH` of a non-interactive login shell there;
|
|
check with:
|
|
|
|
```bash
|
|
ssh user@example.com 'sh -lc "command -v claude codex"'
|
|
```
|
|
|
|
If SSH reconnecting fails after an app update, retry the launch once. Removing
|
|
the connection stops a server that T3 Code launched; a server that was already
|
|
running is left alone.
|
|
|
|
For Antigravity's Google callback on a remote host, see
|
|
[remote sign-in](./providers-antigravity.md#sign-in-from-a-remote-device).
|
|
|
|
## Browser on a remote environment
|
|
|
|
Browser tabs belong to the environment, so you and your agents see the same
|
|
tabs from any device. The desktop app shows its own environment's tabs
|
|
directly. Every other device, and the desktop app for other environments,
|
|
streams them from the host. Agents keep using them while no device is
|
|
connected, and `localhost` addresses reach servers on the host.
|
|
|
|
The first tab downloads a headless Chrome, about 120 MB, into the T3 home. It
|
|
is the same browser [HTML renders](html-renders.md) use, so a host downloads it
|
|
only once. Some Linux hosts need [setup](#browser-host-setup) before it can
|
|
start.
|
|
|
|
Agent tabs have separate storage and share a Chromium process. Take control before
|
|
typing into an agent's tab, then release control when you want the agent to
|
|
continue. Read-only connections can watch without changing the page.
|
|
|
|
While you have control, the tab works with your device: text the page copies or
|
|
cuts goes to your clipboard, a file picker on the page opens your device's
|
|
picker, and a finished download is offered for you to save. Popups such as
|
|
sign-in windows open as their own tabs. Downloads stay on the host until the
|
|
tab closes. Audio does not play on your device.
|
|
|
|
On a phone, tap the floating preview's corner dot to show its controls, then
|
|
**Pop into separate window** to keep watching in picture-in-picture over other
|
|
apps.
|
|
|
|
### Browser host setup
|
|
|
|
macOS, Windows, and Linux desktops run the browser as is. Some Linux hosts need
|
|
one-time setup: Ubuntu 23.10 and later block the sandbox the browser runs in,
|
|
and minimal images and containers lack libraries it loads. When that happens,
|
|
the server says so at startup, and browser tabs and HTML previews show the
|
|
command to run on the host:
|
|
|
|
```sh
|
|
sudo t3 browser setup
|
|
```
|
|
|
|
The server shows the exact line for how you started it, such as
|
|
`sudo npx t3 browser setup`, and keeps your `PATH` when Node is installed only
|
|
for your user. Where `t3` is not on your `PATH`, such as with only the
|
|
desktop app installed, it names the full path of the app's own `t3` instead. It allows Chrome's sandbox with an AppArmor profile and installs
|
|
any missing libraries with apt. It is safe to run again. Without `sudo`, it
|
|
only reports what it would change.
|
|
|
|
The browser always runs in Chrome's sandbox. Where you cannot change the host,
|
|
set `T3CODE_SERVER_BROWSER_SANDBOX=0` for the environment to run without it.
|
|
|
|
## Connect an outside agent
|
|
|
|
Claude Code, Codex, ChatGPT and other agents T3 Code did not start can drive
|
|
threads on an environment through its MCP server. See
|
|
[outside agents](./outside-agents.md) for setup.
|
|
|
|
## Manage or revoke access
|
|
|
|
On the host, **Settings → Connections** lets authorized administrators create
|
|
pairing links and revoke client sessions. Revoking an unused link prevents new
|
|
pairings; revoke a device's session to remove its existing access. Command-line
|
|
management is available through `t3 auth --help`.
|
|
|
|
A session with an open connection stays listed after its access credential
|
|
expires.
|
|
|
|
To choose a token's permissions, pass `--scope` once for each scope you want:
|
|
|
|
```sh
|
|
npx t3 pair --scope orchestration:read --scope relay:read
|
|
```
|
|
|
|
The selected scopes replace the default permissions. The same option works with
|
|
`npx t3 auth pairing create` and `npx t3 auth session issue`; each command's
|
|
`--help` lists the available scopes. Without `--scope`, pairing tokens retain
|
|
standard client permissions and issued bearer sessions retain administrative
|
|
permissions.
|
|
|
|
To change an existing client's permissions, create a fresh pairing link with the
|
|
scopes it needs. In a browser opened directly on the environment, open that link
|
|
to replace the browser's current grant. For mobile or a saved remote environment
|
|
in web or desktop, use **Add Environment** with the fresh link or code; pairing
|
|
the same environment replaces its saved grant. Reconnecting alone does not change
|
|
permissions.
|
|
|
|
Grouping checkouts does not combine their permissions. Shared project settings
|
|
require `orchestration:operate` on every member environment; actions on one
|
|
checkout use that checkout's permissions.
|
|
|
|
`source-control:write` covers direct Git and pull request changes made from the
|
|
client: pushing, switching or creating branches, cloning, and removing
|
|
worktrees. It does not restrict what a task does. Starting a task in a new
|
|
worktree still creates that branch and worktree with `orchestration:operate`,
|
|
and the agent it runs can use Git however the environment allows.
|
|
|
|
Settings changes, provider management, and environment maintenance can be granted
|
|
separately from access administration. New standard pairings include these
|
|
permissions. Existing clients can stay connected after an update, but newly separated
|
|
features may require pairing again with the permissions they need. Older clients
|
|
may show controls that the server denies. Create a fresh pairing link to change
|
|
a client's permissions.
|
|
|
|
`filesystem:read` allows browsing host files, opening workspace files, and viewing
|
|
local changes. Add `filesystem:write` to allow editing files or saving plans to
|
|
the workspace. These scopes control direct file access from the client.
|
|
|
|
To remove an environment from T3 Connect, open your account menu's **T3 Connect**
|
|
page, or **Settings → T3 Connect** on mobile, and choose **Deregister**. This
|
|
revokes its cloud access and frees its host space even when the environment is
|
|
offline or has been wiped. Removing an environment from a device's connection
|
|
settings only forgets it on that device; it stays registered to your account.
|
|
|
|
When idle tunnel cleanup is enabled, T3 Connect removes a linked environment's
|
|
tunnel after it stays offline for several minutes. The environment stays linked
|
|
and keeps the same address. When the host starts again or wakes, T3 Connect
|
|
creates a replacement tunnel on its own. You do not need to pair again. Cleanup
|
|
usually runs five to ten minutes after the tunnel goes down.
|
|
|
|
T3 Connect also removes the tunnel of an environment running an older version of
|
|
T3 Code once it has been offline for seven days. That environment shows a message
|
|
asking you to update. Start T3 Code on that computer and update it to the latest
|
|
version; it reconnects at the same address without pairing again.
|
|
|
|
On a command-line host, `t3 connect unlink` disables exposure while retaining
|
|
your login; `t3 connect logout` also clears that login. Background-service
|
|
[removal](./background-service.md#manage-the-service) is separate.
|
|
|
|
Treat pairing URLs and authorization codes as passwords. Do not include them in
|
|
screenshots, logs, or bug reports.
|
|
|
|
## T3 Connect troubleshooting
|
|
|
|
Run `t3 connect status` on the host to inspect saved authorization and link
|
|
configuration. It is not a live reachability check. If the environment appears
|
|
offline, run `t3 service status` and read the displayed log. If it disappears
|
|
when SSH closes, see [background-service troubleshooting](./background-service.md#troubleshooting).
|
|
|
|
| Error | Recovery |
|
|
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| `environment_link_limit_exceeded` or managed tunnel limit | Deregister an unused environment, then restart T3 Code on the host. |
|
|
| `auth_invalid` or `invalid_bearer` | Run `t3 connect login`. If credentials were revoked, run `t3 connect logout`, then `t3 connect` again. Restart the server after signing in. |
|
|
| Expired or invalid link proof | Check the host's date and time, update T3 Code, then restart it. |
|
|
| HTTP 403 without a recognized error | Check relay access, proxies, and firewall rules. Keep any Cloudflare Ray ID for a bug report. |
|
|
| HTTP 408, 429, or 5xx | Check network and relay availability. Startup retries temporary failures for up to ten minutes. |
|
|
|
|
After fixing a permanent rejection, restart the host's server. On Linux, use
|
|
`systemctl --user restart t3code.service` for the background service. For a
|
|
foreground server, stop it and run `t3 serve` again with your usual options.
|
|
Include the diagnostic message and trace ID when reporting a persistent failure.
|
|
|
|
For a connection that still fails after linking, check the date and time on both
|
|
devices. For server version warnings, follow [Updating T3 Code](./updating.md).
|
|
|
|
## Using the Desktop App as a Remote Only
|
|
|
|
If a computer should only drive work running elsewhere, turn off its local environment. In the
|
|
desktop app, open **Settings → Connections** and switch off **Local
|
|
environment**. T3 Code restarts without a local server: no local agents or terminals run, WSL
|
|
backends stay off, and other devices can no longer connect to this computer. Your projects,
|
|
history, and saved connections are kept, and you keep working through pairing, T3 Connect, or SSH.
|
|
|
|
Switch **Local environment** back on in the same place to restart with your previous local
|
|
settings.
|