Skip to content

Ateam Go: SSH onboarding with a provider step, provider links and a Paste button - #558

Merged
pallaoro merged 7 commits into
mainfrom
ssh-onboarding-followups
Nov 9, 2026
Merged

pallaoro merged 7 commits into
mainfrom
ssh-onboarding-followups

Conversation

@pallaoro

@pallaoro pallaoro commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

Follow-up to #556 (merged): Ateam Go's onboarding for boxes reached over SSH, from Get started to a box that can run its first task.

What changes

Create a box asks where the box runs. Hetzner (the app creates it, as before), boxd, or another server. Providers are entries of facts in src/provider-setup.ts (login, host and port hints, what the password is called and where it comes from), not flows of their own. boxd shows its steps one at a time with links (create a machine, then its phone page: Another SSH app, Copy token), then opens Add a box over SSH as boxd, the password field named "boxd token", the port left empty since each machine has its own. Another server goes straight to the form as root, with where its password comes from. On Hetzner's page, Connection is two cards with why: Tailscale (recommended for security) or SSH (no Tailscale account); SSH is the default when the phone isn't on a tailnet.

Providers can open Ateam Go filled in. ateamgo://ssh?host=&port=&user=&provider= opens Add a box with the machine filled in and a note to check the host, the way boxd's phone page opens Termius (host, port and user in the link, the token on the clipboard). The link never carries a password; a Paste button beside the password field (iOS's own UIPasteControl via expo-clipboard, iOS 16+, no Allow Paste prompt) takes what the provider copied in one tap. The format is in docs/providers/README.md.

A new box can run a task. A server Ateam Go installs over SSH (or any box with no coding agent) opens Finish setting up, which offers Install Claude Code / Install Codex: the box terminal installs it, then signs in (Codex's installer runs with CODEX_NON_INTERACTIVE=1).

boxd over SSH needs no boxd key. boxd's provider definition says an SSH connection wakes its machines (sshWakes), so a tap connects instead of asking for an org-wide boxd API key, and background tries don't dial such a box (the dial would wake it).

Tailscale only where it's needed. Get started no longer opens with an amber Tailscale warning: its state sits on Pair with Ateam for Mac. A Tailscale box that isn't connected says when Tailscale is off on the phone, with Turn on. Box settings opens with a Connection row (SSH user@host:port and what it logs in with, or the tailnet address) that edits it.

SSH credentials don't outlive their box. The Keychain follows the saved list (commitBoxes): a box's key and password go once the list without it is stored; root's password goes after setup switches to the ateam user. Removing a box that logs in by key asks first.

Docs. PRIVACY.md covers SSH (credentials on the phone, what Create a box sends with SSH). The provider docs cover the provider step, boxd over SSH, and the link format.

Checked

  • tsc --noEmit (apps/mobile and packages/protocol), bun test (138 mobile, 164 protocol), Biome on the changed files.
  • On a fresh boxd server as a new user with no agent: the phone's installer finished in about 60 s and the engine reported agents: []; both install commands installed their agent and went straight to sign-in (no "Start Codex now?" prompt); the running engine then reported agents: ["claude","codex"].
  • In the iOS simulator, on an empty app: Get started, the provider step, boxd's steps one at a time, Hetzner's Connection cards, the boxd form (user, token label and help, host and port hints), Add a box's SSH form as root, and the app starting normally on a build without expo-clipboard (no Paste button there).

Not checked

  • The Paste button and the ateamgo://ssh link on screen: they need a native build of this branch (the simulator build has neither expo-clipboard nor the ateamgo scheme).
  • A full boxd onboarding against a real machine, including boxd's SSH gateway taking a password login and the second open connecting with no key.
  • The Tailscale-off card tray and Box settings' Connection row on screen, and the root password removal (native, not compiled here).

… needed, credential cleanup

- A server set up over SSH (or any box with no coding agent) opens Finish
  setting up instead of Add a project. With no agent on the box, it offers
  Install Claude Code / Install Codex: the box terminal installs it, then
  signs in from a fresh login shell. Codex's installer runs with
  CODEX_NON_INTERACTIVE=1 so it doesn't stop to ask to start Codex.
- Get started no longer opens with a Tailscale warning: the Tailscale state
  sits on Pair with Ateam for Mac, the one way in that needs it.
- Create a box picks SSH when the phone isn't on a tailnet. The SSH form
  starts at root, with where its password comes from; setup turns root into
  the ateam user and then deletes root's password from the Keychain.
- A box's SSH key and password leave the Keychain with it (removed, or
  edited onto a new identity), once the list without it is saved. Removing
  a key-login box asks first, since that key may be the only way in.
- PRIVACY.md and the provider docs describe the SSH path.

Checked on a fresh boxd server: after the phone's install the engine
reports no agents; both install commands install and start sign-in; the
running engine then reports claude and codex on the next connect.
@pallaoro
pallaoro force-pushed the ssh-onboarding-followups branch from 39922f5 to 114e1fa Compare November 9, 2026 19:10
@pallaoro
pallaoro changed the base branch from termius-apparently-is-able-to-provide to main November 9, 2026 19:10
… say when Tailscale is off

- Box settings opens with a Connection row: SSH (user@host:port, key or password on this phone) or Tailscale (address, needs Tailscale on this phone). Tapping it opens Edit box, which works while the box is away.
- A Tailscale box that isn't connected, on a phone with Tailscale off, shows why under its card with a Turn on Tailscale button, ahead of the steps and provider trays.
- Root setup skips removing the root password on a dev build that predates removePassword, instead of failing.
- First step: Hetzner (the app creates it, as before), boxd, or another server. Providers are entries of facts in src/provider-setup.ts (login, host and port hints, what the password is called and where to get it), not flows of their own.
- boxd: its two steps at the provider with links (create a machine, then a token on its phone page), then the Add a box form over SSH as user boxd, the password field named boxd token, and the port left empty with where to find it, since each machine has its own.
- Another server: straight to the form over SSH as root.
- Connection on Hetzner's page is two cards with why (Tailscale recommended for security, SSH needs no Tailscale account) instead of a row that read as plain text.
- Hetzner's mark joins the phone's provider logos; docs/providers describe the step.
Side by side, boxd's two steps read as two options. Now Step 1 of 2 shows alone, with its link as a button, then Next; the last step's button is Connect over SSH, with Previous step under it.
…h link

- ateamgo://ssh?host=&port=&user=&provider= opens Add a box over SSH with the machine filled in and a note to check the host, the way boxd's phone page opens Termius. It never carries a password or token: the provider copies that to the clipboard and the user pastes it. Parsed strictly (src/ssh-link.ts, sharing pair-link's query parser and host rule); nothing connects until Connect, and the first connection still asks to trust the host key.
- docs/providers/README.md documents the format for providers.
- boxd's steps and docs follow its phone sheet as it is now: Another SSH app, Copy token (there is no Create token button there).
…s its wake

- boxd's provider definition says an SSH connection wakes its machines (sshWakes): its gateway wakes a machine in standby on the first packet.
- For such a box (boxes.ts dialWakes) a tap no longer opens Edit box asking for a boxd API key, an org-wide credential the SSH path never needs; the dial wakes it. A failed dial reads as a failure, not sleep.
- Background tries (start-up, foreground, retries) don't dial it, since that would wake it: it rests asleep on its card until something on it is opened, like a Tailscale box that sleeps.
- provider-setup.ts notes where boxd's SSH facts should move once a second provider is reached over SSH.
iOS's own paste control (expo-clipboard's ClipboardPasteButton, UIPasteControl, iOS 16+) pastes in one tap what a provider copied, such as boxd's token, with no Allow Paste prompt. expo-clipboard loads its native side on import, so it's required only once that side is known to be there: a build made before it starts as before, without the button. A trailing line break from the copy is dropped.
@pallaoro pallaoro changed the title Finish Ateam Go's SSH onboarding: agent install, Tailscale only where needed, credential cleanup Ateam Go: SSH onboarding with a provider step, provider links and a Paste button Nov 9, 2026
@pallaoro
pallaoro merged commit 4315fd9 into main Nov 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant