github owenthereal/upterm v0.38.0
Upterm 0.38.0

12 hours ago

New: upterm join, a guest command that joins a session and rejoins on its own when the connection drops. The host's view now offers it first, with the plain ssh line under it for guests without upterm.

New

  • upterm join joins a session from the connect string the host shares: ssh://, ws:// or wss://ID@host, a bare ID@host, or the ssh … line upterm prints, pasted whole. If the connection drops, it resets most terminal modes the session had set, says why it's waiting and when it tries next (Enter retries, Ctrl-C stops), and rejoins with the same connect string; ~. leaves. It exits with the session's status. It offers keys as ssh does (the agent's, then the default key files; a key is generated only when there are none) and checks the relay's key against known_hosts. It doesn't read ~/.ssh/config: use -i, or plain ssh, for per-host settings.
  • The host's view, upterm session info, upterm session current and upterm --help show a ➤ Join: line above ➤ SSH:. session info -o json and upterm host --detach -o json carry joinCommand beside sshCommand. A ws or wss relay behind a path gets no Join line, since upterm join takes no path.
  • A forced command (--force-command) starts again each time upterm join rejoins, so don't join one whose effects mustn't repeat with upterm join.

Behaviour changes

  • upterm host and upterm join check a relay certificate from an authority no @cert-authority line trusts by the certificate's own key, as OpenSSH does. A stale pin of the public relay now reads as a changed key rather than an unknown host, a plain ssh-keyscan line for a self-signed relay now verifies it, and a certificate whose signer is @revoked is refused.
  • When the hosted command exits or the session is stopped, upterm host waits for each guest to receive its exit status before closing its connection to the relay: one round trip normally, and at most about 2 s more when a guest doesn't answer. A guest that asks for a shell after that is refused rather than accepted and cut off.
  • upterm attach no longer prints (status 0) when a session ends normally; any other status is still shown.
  • On a self-hosted relay with no Consul and both ws and ssh listeners, a ws guest is now always handed to the relay's own SSH proxy, as an ssh guest is. Joining a session on another node takes one more hop inside the relay, and a refusal arrives when the guest's channel opens rather than in a banner.

Fixes

  • Guests' terminals no longer answer the host program's terminal queries. DECRQM (tmux 3.8 typed 2026;2$y into the pane), DCS queries such as XTGETTCAP, kitty graphics queries and queries wrapped for tmux are now filtered from guests' output.
  • A guest sometimes got no exit status when the session's command exited: a plain ssh guest exited 255 ("remote command exited without exit status"), and upterm join waited for a host that wasn't coming back.
  • The REMOTE HOST IDENTIFICATION HAS CHANGED warning shows the fingerprint of the key the relay presented, not the pinned one.
  • On Windows, upterm join treats an SSH_AUTH_SOCK nobody listens on as no agent. A waiting line no longer erases the line above it after the terminal is widened.
  • upterm session info shows ending as soon as a session starts to tear down, so a script that reads it the moment upterm host returns is no longer told ready, with a connect string, for a session that has ended. upterm session wait is still the way to read how it ended.

Docs

  • The Herdr guide's jump to your machine's own sshd is now four ordered steps (sshd, forwarding, the alias, the host key), records the host key before herdr --remote needs it, and has a troubleshooting line for Connection closed by UNKNOWN port 65535.

Compatibility

  • upterm join joins any host's session through any relay. Through a relay older than 0.37.0, a refusal from another relay node can't be told from a missing session, so upterm join keeps waiting rather than stopping on it; through one older than 0.34.0, that holds for any key refusal.
  • The host's view gains a ➤ Join: block above ➤ SSH:, and its JSON gains joinCommand. action-upterm reads sshCommand and is unaffected.

Changelog

Don't miss a new upterm release

NewReleases is sending notifications on new releases.