scrn

A terminal UI for working on projects at the command line. Every project, what's running in it, and shells that outlive the window.

curl -fsSL https://raw.githubusercontent.com/w0zro/scrn/main/install.sh | sh

What it does

The command line, kept in order

One window shows every project and everything running in it. The keys act on whatever the cursor is on.

Shells outlive windows

Shells live in a daemon, not in your window. Close the window and come back later — everything is still running, transcript included.

Every project, one list

scrn scans your project roots and lists each repository with the processes running in it. Monorepo sub-projects and folders of sibling repos get rows of their own.

Projects say what they need

A .scrn file, a Procfile, or package.json scripts name the processes a project runs. r starts the ones that are missing.

A real terminal

The pane is a terminal emulator. Alternate screen, mouse, window title and progress all pass through — vim and less behave, and scrollback reaches back 10,000 lines.

Agents at a glance

a starts Claude in a project. A turning marker means it is working; a still one means it is waiting on you.

Kills you can trust

x kills a process, X its tree, and on a repository row everything running in it. Always confirmed first, and the row stays until the exit is actually observed.

How it holds together

Windows are clients. A daemon owns the shells.

Nothing to install as a service, nothing to launch by hand — the daemon is the same binary, started by the first window that needs it.

window window closed unix socket scrnd owns the ptys npm run dev claude zsh — api
Starts itselfThe first window starts the daemon — it's the same binary. Empty and unwatched for a minute, it quits.
Any number of windowsWindows attach over the socket and watch the same shells. A shell is sized for the smallest window watching it.
Upgrades in placeR swaps the running daemon for the newly installed binary by exec. Pids, ptys and transcripts carry across.

Plans

Working on it means the same processes every time

A project can write them down — Procfile format, a name and a command per line. Without a .scrn, scrn reads the Procfile itself, or the dev / start script in package.json.

r starts the entries that aren't running. scrn never restarts anything by itself: a dead server shows as dead, and you start it again.

.scrn

dev:   npm run dev
api:   go run ./cmd/api
agent: claude

Keys

A grammar, not a list

New keys are derived, not memorized. Three rules cover the whole set.

1

Lowercase is a verb

s shell, a agent, r run, x kill. Uppercase widens the same verb: X takes the tree, R replaces the daemon.

2

The row scopes it

The key acts on what the cursor is on. x on a process kills it; on a repository, everything running there. enter opens whatever the row is.

3

One letter, one action

A letter means the same thing everywhere it appears. In the filter the verbs ride under ctrl: ctrlr run, ctrla agent — on the match, without leaving the search.

Move

j kmove
gg / Gtop / bottom
/find a project
escclear

Act

enteropen the row
sshell
aagent
rrun the plan
x / Xkill / kill the tree

View

space / -fold one / all
.all ↔ running
ctrloback to the list
?keys
qquit

Configuration

One file, all optional

Where your projects live, how much transcript to keep, how wide the navigator is, which directories the scan should never enter. Every field has a default; scrn works before the file exists.

Every option, in the guide →

~/.config/scrn/config.json

{
  "projectsDirs": ["~/projects", "~/work/mono"],
  "scrollback": 50000,
  "navWidth": 34,
  "skipDirs": ["bazel-out", "dist"]
}

Install

One command

curl -fsSL https://raw.githubusercontent.com/w0zro/scrn/main/install.sh | sh

Fetches the build for this machine, checks it against the release checksums, and puts it in ~/.local/bin. SCRN_INSTALL_DIR changes the destination; SCRN_VERSION pins a release.

Or with Go:

go install github.com/w0zro/scrn@latest

Builds are published for macOS and Linux, on arm64 and amd64. On Linux, scrn reads the process list through lsof — install it. Then read the guide.