roam + tty

Leave the machine.
Keep the agent running.

AI coding sessions belong on the machine that can stay on.

Run romty on a powerful workstation at home or at the office. Connect through Tailscale and SSH, start an agent, disconnect, and return from anywhere to the same terminal session with its output intact.

$ brew install opspresso/tap/romty Source on GitHub
A travel laptop reconnecting through a private mesh to an always-on workstation where AI coding agents continue running
your laptop Tailscale → SSH → romty always-on machine

One session. More than one place.

The compute stays put. You don't have to.

Your laptop is only the way in. The agent, shell, working tree, and romty daemon stay together on the remote machine, so closing SSH does not interrupt the work.

  1. ConnectReach your private machine with Tailscale and SSH.
  2. RunStart romty and your coding agents beside the source tree.
  3. ReturnReconnect later and reopen the same live terminal tabs.

Tailscale is optional transport, not a romty dependency. romty stays local to the remote host and listens only on a Unix socket owned by your user.

ssh — home-workstation — romty
romty
▾ personal
- dotfiles
(main)
- notes
(main*)
▾ opspresso
- agent-studio
(main) ↓1
▎ - romty
▎ (main*) ↑1
- toast-app
(main)
- vibemon-app
(main)
1 2 3 +
━━━─────────
╭─ Codex ─────────────────────────────────────────────────────╮
  Update the homepage demo to match the current romty UI.     
╰──────────────────────────────────────────────────────────────╯

• Explored
  └ Read pages/index.html, internal/ui/ui.go

• Edited pages/index.html +64 -29
  └ Synced workspace rows, tabs, agent phases, and shortcuts

• Ran go test ./...
  └ ok  github.com/opspresso/romty/internal/ui

 Working  rebuilding the live preview

 
Ctrl+/ navigation
F1 help F2 add root F3 config F4 quit F5 refresh F6 scrollback F7 focus

Built for the way a terminal is actually used

Long-running shells, several projects at once, and output you want to scroll back through and copy — without giving up the things your terminal already does well.

Sessions outlive the TUI

A detached daemon owns every shell PTY. Closing romty, or the terminal hosting it, leaves the processes running; reopening reattaches and replays what you missed.

Projects as a tree

Point romty at a root directory and it lists the root and its direct children as workspaces. Both can host terminal tabs, each starting in its own directory.

Scrollback you can select

10,000 lines per terminal, opened full width so a plain click-drag copies terminal output and nothing else — type or paste to return directly to the live terminal.

Function keys that survive IME

F1 through F7 drive the whole interface, while F8 and F9 protect destructive workspace actions. Physical key reporting keeps them working in any keyboard input mode, so a Korean or Japanese IME never swallows a shortcut mid-session.

Scroll from the live screen

The wheel enters terminal history without a mode switch, while typing returns to the live shell without dropping the first key. A full-screen application scrolls itself, and a terminal without alternate scroll can keep the wheel in history too.

Adapts to your terminal

Colors follow the terminal's own light or dark background, code diffs are syntax highlighted, and the layout reflows with the window. One binary, no configuration required to start.

Install

macOS or Linux. Building from source needs Go 1.25 or later.

Homebrew

$ brew install opspresso/tap/romty

Go

$ go install github.com/opspresso/romty/cmd/romty@latest

From source

$ git clone https://github.com/opspresso/romty
$ cd romty
$ go build -o build/romty ./cmd/romty

Run romty and the daemon starts on its own. Press F2, walk to a project directory with and , and press Enter to add it. To shut every session down from outside the TUI, run romty stop.

Shortcut map

F1 through F7 work from either pane and with regular modals open. Alternatives shown beside them are contextual, and file view assigns its own actions to F5 and F6. Destructive actions ask first.

Global

F1?Open Help
F2Add a root
F3,Open Config
F4Ctrl+CClose the TUI and leave sessions running
F5Refresh workspaces and Git state, or reload file view
F6Ctrl+Shift+\Enter or leave scrollback
F7Ctrl+/Toggle pane focus

Workspace

F8Delete the selected workspace or forget the selected root
F9Stop the daemon and every running shell
iOpen About
TabFocus the terminal

Switch

Ctrl+Shift+TCreate and open a terminal tab
Ctrl+Shift+GOpen Git actions for the contextual workspace
Ctrl+Shift+FToggle changed files and Git diff
Ctrl+Shift+←/→Switch terminal tab
Ctrl+Shift+↑/↓Switch to a workspace with a running terminal

Move

↑/↓k/jMove one item or line
←/→h/lSelect a tab, or open a picker child or parent
PgUp/PgDnCtrl+B/FMove one page
Home/Endg/GMove to the first or last item or line
Shift+PgUp/PgDnEnter scrollback or move one page
WheelScroll Help, history, a file diff, or the terminal

File diff

F6Toggle inline and split layouts; the last layout is remembered
Ctrl+↑/↓Move through the diff one line at a time

Context

EnterOpen, run, return, submit, or confirm in the workspace, picker, Git views, and prompts
EscClose a modal or file view, cancel a prompt, or leave scrollback
/Type a path in the root picker
BackspaceErase a path character
←/→[/]Resize the workspace pane in Config
mToggle the scrollback mouse in Config

Everything else goes to the shell, including Ctrl+, pasted text, and the function keys a full-screen program binds above F7 — htop keeps its F9. See the interface guide for scope and mode details.

How it works

romty TUI
   ├─ workspace tree
   └─ terminal tabs and VT renderer
            │
       Unix socket
            │
   romty daemon
        ├─ state store
        └─ PTY sessions
             └─ shell process

The TUI talks to a detached daemon over a Unix socket owned by your user. The daemon holds the PTYs and up to 8 MiB of output per session, so the client is free to come and go.

Reattaching replays that recording through the client's VT emulator, preceded by the terminal modes the shell had set — bracketed paste among them, so a multi-line paste still arrives as one paste after hours of output.

New shells inherit the environment and $SHELL of the romty that asked for them, not the daemon's, which may have started days earlier.