github owenthereal/upterm v0.39.0
Upterm 0.39.0

4 hours ago

v0.39.0 rebuilds a session's replay for joining terminals and adds keys for checking session status, richer JSON output, and safer upgrades.

Joining from a different terminal size

  • A joining guest or upterm attach now receives a rebuilt screen and recent history instead of replaying cursor movements recorded at earlier terminal sizes. This improves joining a desktop session from a phone or a narrower terminal, including Claude Code, shells, editors and terminal monitors. The live stream continues from the same point. #653, #664
  • When terminal state cannot be rebuilt faithfully, or rebuilding exceeds its budget, the join uses the previous raw replay and logs why. Unsupported terminal features and unsafe byte sequences trigger this fallback. Valid UTF-8 characters split by the buffer boundary still allow rebuilding. #676
  • The joining terminal's previous screen moves into its scrollback. Session state such as titles, the working directory and the last clipboard write per selection is restored; a scrollback-clear in the captured output also clears the joiner's older scrollback.
  • Limits: the visible screen keeps the session's layout until the application repaints after a resize. History preserves wrapped rows as separate lines, so copying can insert extra newlines; tabs become spaces, and width shrinks can truncate text. A raw fallback retains the old replay's limitations.

Session commands and terminal output

  • In upterm host and upterm attach, type ~? at the start of a line to see the session's guests, relay connection and available keys without detaching. Type ~~? to send a literal ~?. Through an outer SSH connection with its default escape, use ~~? to reach upterm's status key, or connect with ssh -e none. upterm join's keys are unchanged. #662
  • session info, wait, stop, set and upterm attach accept a session ID as well as a name. session list prints a plain table instead of a full-screen view and gains -o json and --hide-client-ip. Session names and output formats complete in the shell. #656, #663
  • JSON output adds relay, access, permission and count-availability fields; session current reports more of the session's state, and upterm version -o json is new. Existing fields remain, and all JSON timestamps use UTC.
  • Session views say who can join and what guests may do. Host: becomes Relay: and Connected Clients: becomes Connected:. upterm attach gains --hide-client-ip; explicitly setting it to false shows addresses in CI too.
  • Errors print once in the terminal as upterm: …, without a usage block. Join waits print the cause once and redraw only the countdown. Plain SSH guests receive clearer refusal messages from updated relays, and every command's help documents its keys and exit statuses.

Upgrade and configuration fixes

  • upterm upgrade selects the correct archive on Linux and reports offline or failed downloads instead of panicking. It replaces the binary being run, respects Homebrew, Scoop, deb and rpm ownership, and names the package-manager command to use. Without a version argument it no longer installs a release older than the running build. If an older Linux binary hits the archive-selection bug while upgrading, install v0.39.0 through your package manager or from the release assets below. #651, #655
  • upterm config edit accepts editor arguments such as EDITOR="code --wait", checks keys and values after editing, and exits 1 when the file is invalid. Help, version and completion remain usable with a bad config. #654
  • --server ssh://HOST defaults to port 22. SSH addresses with no hostname are refused. Charset tracking now follows cursor saves and restores, preventing ordinary text from appearing as line-drawing characters on a later join. #666, #661

Exit-status changes for scripts

  • A stopped session, or one ended by a signal to its daemon, returns 1 to the foreground host, attached terminals and guests, even if the command handles SIGHUP and exits 0. A command that finishes on its own keeps its status. session wait still returns 0 for a stop. #658
  • Usage and configuration errors return 255 from attach and join, and 125 from session wait. Unknown commands and extra arguments that were previously ignored now fail; an unknown command with --help also exits 1.
  • At the host's acceptance prompt, Ctrl-C/SIGINT exits 130 and SIGTERM exits 143. Neither starts the session. With host --detach, success still means the session started; use session wait for its eventual result.

Deprecation: move per-run settings to command-line flags before v0.40

These environment variables and config keys still apply in v0.39.0, with a warning. Starting in v0.40, the affected commands will ignore them; pass the corresponding flag instead. #652

Environment variable / config key Affected commands Use instead
UPTERM_OUTPUT / output host, session info, session current -o / --output
UPTERM_NAME / name host --name
UPTERM_DETACH / detach host --detach
UPTERM_WAIT / wait join --wait
UPTERM_JOIN_TIMEOUT / join-timeout session set only --join-timeout

host --join-timeout keeps reading env/config. The new output flags on session list and version are command-line-only from the start.

Compatibility

Upgrade the host to get the rebuilt replay; guests can continue using plain SSH or an older upterm. New JSON fields are additive, and permission fields are omitted when an older daemon cannot report them. For Go callers, set Host.ClaimTimeout per instance; the package-level host.ClaimTimeout is deprecated.

Changelog

Don't miss a new upterm release

NewReleases is sending notifications on new releases.