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
macOS and Linux, arm64 and amd64 · Read the guide
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.
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.
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.
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.
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 k | move |
| gg / G | top / bottom |
| / | find a project |
| esc | clear |
Act
| enter | open the row |
| s | shell |
| a | agent |
| r | run the plan |
| x / X | kill / kill the tree |
View
| space / - | fold one / all |
| . | all ↔ running |
| ctrlo | back to the list |
| ? | keys |
| q | quit |
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.
~/.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.