Files
tty7/docs/remote/workspaces.mdx
T
Hongwei Qin c2950fc434 feat(ui): forget orphaned remote workspaces when a profile is deleted (#508)
Deleting an SSH profile used to leave every remote workspace entry that had
connected through it behind, labelled with a bare internal id and retrying a
route that could never work again.

`RemoteRef` now carries a `RouteSnapshot` of the profile it was made from —
name, user, host, port — written at creation and refreshed on every reopen,
`serde(default)` so older session files load. The snapshot serves labels only:
`PartialEq`/`Hash` ignore it, or a refresh would split one entry into two.

Deleting a profile cascade-forgets the entries routing through it. Forgets,
not deletes: `WorkspaceRemove` is never sent, so the sessions on the remote
machine keep running and connecting again under a new profile brings them
back from the machine's own workspace list. An entry holding a live or
in-flight link is left alone, as is one whose window is still on screen — a
window whose workspace the store has forgotten reads as local, and its next
tab would open a local shell on what the user still sees as a remote box.
Whatever survives parks instead: no retries, no error, and an inline action
to drop it deliberately. A live or preempted link outranks a lost route.

Labels fall back from the live profile to the snapshot to a placeholder, so
no branch renders a bare UUID. Resolving the live name reads memory rather
than reparsing `~/.ssh/config`, because that path runs on every frame of a
window with a remote workspace open.

Closes #485.
2026-08-11 22:10:56 +08:00

130 lines
5.2 KiB
Plaintext

---
title: "Remote workspaces"
description: "Whole workspaces hosted on another machine — files, repos, panes, and git all stay over there."
---
An SSH pane runs one shell on a remote machine. A **remote workspace** goes
further: tty7 runs a server on the far machine, and the whole workbench points
at it. Tabs, splits, the file tree, the git panel, the diff overlay, the process
list — all of it is the remote machine's, rendered here.
Nothing is synced or copied. The repository stays where it is.
<Frame caption="Placeholder — screenshot: a remote workspace open, sidebar showing remote repos, with the machine name in the strip">
<img src="/images/placeholder.svg" alt="A remote workspace in tty7" />
</Frame>
## Connecting
<Steps>
<Step title="Open the switcher">
<kbd>⌘ ⇧ O</kbd>. Machines are listed alongside your local workspaces —
*This Computer* first, then every saved SSH profile and, on Windows, every
WSL distribution.
</Step>
<Step title="Pick a machine">
tty7 connects over the same SSH stack as everything else, so profiles,
keychain credentials, and jump hosts all apply.
</Step>
<Step title="Approve the server install, once">
The first connection asks:
> tty7 will write its server binary to *devbox* so this machine can host
> workspaces there. Nothing else on *devbox* is touched, and no sudo is
> used.
It shows the exact path, version, size, source, and SHA-256 before you
agree. Later upgrades on that machine install silently.
</Step>
<Step title="Open a workspace">
From then on the machine's workspaces are in the switcher, and a new one
opens like a local one.
</Step>
</Steps>
## What gets installed
| | |
|---|---|
| **What** | A single static `tty7-server` binary |
| **Where** | `~/.local/share/tty7/bin/tty7-server-c<control>p<protocol>` |
| **Privileges** | None. No sudo, nothing outside your home directory |
| **Hosts** | Linux, x86-64 or aarch64 |
The binary is named after the wire dialect it speaks, so a client and a server
that disagree never quietly half-work — tty7 installs the matching one instead.
On Windows, a WSL distribution is handed the Linux server the installer already
shipped, so a WSL workspace needs no network access at all.
## Reattaching
Remote workspaces are the point at which persistence pays off twice: the panes
survive on the remote machine whether or not your laptop is awake, and you can
reattach from a different client entirely.
A strip along the top of the window says what the connection is doing —
*connecting*, *reconnecting (attempt 3)*, *disconnected*, or *taken over by
someone else*. Reconnection is automatic; a workspace another client has claimed
says so by name rather than fighting over it.
## Deleting a profile
Deleting an SSH profile forgets every local workspace entry that connected
through it. The confirmation names the profile's endpoint and counts the
entries going with it, and the profile's keychain credentials go too. Only the
bookmarks on this computer are touched — the sessions on the remote machine
keep running, and connecting to that machine again under a new profile brings
its workspaces back into the switcher from the machine's own list.
An entry holding a live or in-flight connection is left alone, and parks once
the link drops: it stops reconnecting on its own, keeps the name of the route
that made it rather than falling back to an internal id, and its switcher row
offers **Remove entry**. The sessions behind it are still on the machine,
waiting for a new profile.
## Keeping the server current
Two dialogs you may meet:
<AccordionGroup>
<Accordion title="Update tty7's server on “devbox”?">
The machine is serving sessions from a build whose protocol this client
cannot speak. tty7 has already installed a matching server, but the one
already running is the one your sessions are on. **Update Server** replaces
it and **ends every session it is hosting** — including ones this window is
not showing. Cancel leaves the machine exactly as it is.
</Accordion>
<Accordion title="Restart tty7's server on “devbox”?">
Same consequence, deliberately: every shell on that machine ends. Workspaces
and layouts are kept and come back with fresh shells.
</Accordion>
</AccordionGroup>
<Warning>
Both of these end other people's work if the machine is shared. tty7 spells
out what will happen before either one runs — read it.
</Warning>
## What a remote pane cannot do
- **Fork an agent session.** The fork command would run against the *local*
agent, so tty7 does not offer it.
- **Move very large files through the Files panel.** Drag-and-drop across the
link is capped at what one control frame can carry; past that the panel tells
you to use [SFTP](/remote/sftp).
## From the CLI
```bash
tty7 machine ls # this machine plus every link the server holds
tty7 -m devbox ls # route any command to a linked machine
tty7 -m devbox run -- cargo test
```
`-m` matches the full link key (`me@devbox:22`) or just the host. It uses a link
the local server *already* holds — it will not dial a fresh connection, and it
says so rather than guessing. Connect from the switcher first.
[CLI overview →](/cli/overview)