roam + tty

romty

Your shells keep running. The TUI doesn't have to.

A terminal workspace manager for macOS and Linux. Close the window, reboot your editor, come back tomorrow — a detached daemon owns the PTYs, so the sessions are still there with their output intact.

$ brew install opspresso/tap/romty Source on GitHub
romty
romty
▾ nalbam
— dockpad
— dotfiles
— note
— romty
— resume
▾ opspresso
— agent-studio
— homebrew-tap
— toast
▸ 1   +
romty (main)  go test ./...
ok  github.com/opspresso/romty/internal/daemon   11.6s
ok  github.com/opspresso/romty/internal/ui        5.8s

romty (main)  
F1help F2add root F3config F4quit F5refresh F6scrollback F7focus

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 — no workspace tree dragged along with it.

Function keys that survive IME

F1 through F9 drive the whole interface and work in any keyboard input mode, so a Korean or Japanese IME never swallows a shortcut mid-session.

The mouse stays yours

romty leaves mouse tracking off, so your terminal's own selection and copy keep working over it. Applications that want the mouse can have it, per configuration.

Adapts to your terminal

Colors follow the terminal's own light or dark background, 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, type a project directory, and press Enter. To shut every session down from outside the TUI, run romty stop.

Every key, in one row

F1 through F7 work from either pane and with a modal open. The rest belong to the workspace pane, so a shell keeps the keys it binds, and the two actions that cannot be undone ask first.

F1?Open help
F2aAdd a root directory
F3,Open config
F4qQuit romty
F5rRefresh the tree
F6sEnter or leave scrollback
F7Switch between the panes
F8dForget the selected root (workspace pane)
F9tStop the daemon and every shell (workspace pane)
Move between workspaces
Move between terminal tabs
ShiftPgUpScroll back a page at once

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. Ctrl+\ also leaves the terminal pane, and Tab enters it from the workspace tree.

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.