Skip to content

Terminal persistence

nodeterm’s terminals don’t die when you close the app. Quit and relaunch, and every terminal is exactly where you left it — running processes included. This page explains how, and what does and doesn’t survive a reboot.

Each terminal runs inside a persistent tmux session named nt-<node-id>. nodeterm runs tmux on its own socket with its own generated config, so your ~/.tmux.conf is never touched and never interferes. Because the tmux server outlives the app, sessions keep running even when no terminal is attached to them.

tmux owns the mouse — scrolling, selection, and the alternate screen are all its job, and this is deliberate:

  • The wheel scrolls tmux’s own history, not the emulator’s buffer.
  • A drag selects and copies via tmux copy-mode. tmux emits the selection as OSC 52, which nodeterm writes to your system clipboard — the one copy path on every platform, and it works over SSH too (no pbcopy needed).
  • To select with the emulator instead — for example inside an app that grabs the mouse, like vim or htop — hold Option (mac) or Shift (Linux/Windows) while dragging.

To copy an emulator selection, use Cmd+C (mac), or Ctrl+Shift+C / Ctrl+Insert (Linux/Windows). Plain Ctrl+C is never intercepted — it still sends an interrupt.

Quitting nodeterm detaches the terminal clients but leaves the tmux sessions running. On relaunch each terminal reattaches to its live session — a warm reattach — and tmux redraws the current screen. Running processes are untouched; you pick up mid-command.

A machine reboot kills the tmux server, so the nt-<node-id> sessions are gone — you can’t keep a live OS process across a reboot. nodeterm cold-restores instead:

  • Scrollback — nodeterm keeps a byte-capped snapshot (256 KB per terminal) of each session’s recent output. On a cold start it replays that snapshot into the terminal, with a “session restored” separator so you can see where the restore begins.
  • Resumable agents — if the node was running an agent, nodeterm relaunches the CLI with its saved session id: claude --resume, codex resume, gemini --resume, opencode --session. The agent picks up its conversation instead of starting cold.