Crook
v0.1.6 — notarized macOS build, plugin icons and previews in the Store

A terminal whose unit of work is an agent, not a tab.

A tab is one agent’s workspace: its transcript, its directory, its state.The panel lists what is being worked on. A dot on each row says how it is going.

$curl -fsSL https://raw.githubusercontent.com/theguriev/crook/main/script/install | sh

macOS and Linux. Windows is a .zip on the releases page. MIT.

tab
One agent, its transcript and its branch
status
Written by the agent itself, over the terminal it already has
output
A list of commands, each with everything it printed
plugins
Sandboxed .wasm that must ask before it reaches anything
crook --agent running · needs-input · failed · idle

The agent reports its own status.

The program in the pane writes one escape sequence to its own terminal and exits. No socket, no pane id: the terminal it has is the pane. That is why it works from a hook, over ssh and inside a container, and why every other terminal drops it unread.

  • crook --agent-hooks claude prints the hooks that make Claude Code say all of it by itself.
  • A row waiting on you is washed amber. The header counts them, and cmd+j goes to the next one.
  • The window title carries the count, so a switcher tells three Crooks apart and says which one stopped for you.
The tab panel: four agent sessions with a coloured status dot and the branch each is on, two of them folded into a group
runningneeds inputfailedidle

The panel as Crook renders it: one row per agent, the branch under the title, two related tabs folded into a group.

Drawn, not captured: the header chip, three rows, and the hook lines behind them.

blocks · one command, its output, a boundary

Output is a list of commands, not one scrolling screen.

Each command is a block holding its prompt, the line that was run and everything it printed. A failed one gets a red wash; the one still running gets the stripe.

  • Hover copies exactly that command and its output. No neighbour’s text, no trailing blank rows.
  • Ten thousand commands survive a clear, a resize and the emulator’s own history evicting anything.
  • Blocks are what find, the palette and the markdown plugin work on.
Three finished commands, each in its own block with a rule between them, the last one showing the copy and menu controls under the pointer
Three finished commands. The pointer over the third brings up copy and menu in its corner; the open block under the prompt carries the accent stripe.
cmd-f · ctrl-shift-f off macOS

Find searches every block at once.

Every finished command and the open one, counted in the bar. The current match is in the accent, the rest in amber. It is a search and not a filter, so the lines between the hits stay where they are.

The find bar over a pane, reading tab, counting three matches and highlighting them in the output
“tab”, 1 of 3, highlighted where the matches are.
cmd-k · > commands · @ tabs · # settings · ? keys

One box for everything that has a name.

Commands, open tabs and every settings row, each kind under its own heading when there is more than one kind of answer. A command row prints its chord; a tab row says where it is working; a settings row opens its page with the row on screen.

  • A sigil narrows the list to one kind, and tab walks between them.
  • ? answers “what is bound to what” from the same box.
The command palette reading rec: two commands, one tab with its directory, and five settings rows naming the page each lives on
“rec”: commands, one tab with the directory it is working in, and settings rows that name their page.
plugins · sandboxed .wasm · installing is not allowing

A plugin describes what it wants drawn. The host paints it.

A module runs in an interpreter with no filesystem, no network and no clock of its own. It names a badge, a meter, a chip, a panel; Crook draws them in the theme, so a plugin names no colour and no pixel. Anything from the machine it has to ask for, in sentences, and the card is where they are answered.

  • The Store fetches one static index.json. No account, no machine id, nothing about what you have installed.
  • Every artifact in the registry is built from source by CI and hashed. Previews live inside the module.
  • crook --dev-plugin . runs the one you are writing straight out of target/, and again on every build.
The Plugins page: the Pirate's card with the two things it asks to be allowed, an Allow button beside them, and the pictures it carries under What it looks like
The Pirate's card: two sentences it asks for, one button, and the pictures it carries inside its module.

What the pirate draws in the header: the host’s own artwork by name, and one number it asked permission to read.

and underneath · a real shell in every pane

The parts a terminal has to get right anyway.

A real pty, a real emulator

xterm-compatible: colour, bold, italic, underline, strikeout, the alternate screen, ten thousand lines of scrollback, SIGWINCH on resize.

Panes and splits

cmd+d and cmd+shift+d. A shell that exits closes its pane, its tab, and with the last tab the window.

Tabs that name themselves

OSC 0, 2 and 7: what you called it, else what the agent calls its work, else what it is running, else the directory it sits in.

The header is the title bar

No strip of system chrome. Drag its empty space to move the window; macOS keeps its traffic lights exactly where every Mac app has them.

Groups and worktrees

A worktree opened from a tab folds the two into a group with a count. Drag a row in, past the edge to take it out.

Pictures that are the same everywhere

--snapshot renders one frame of the real view tree to a PNG. Every screenshot on this page was made that way.

install · one binary, nothing else on the machine

Get Crook

The script reads the latest release, checks the archive against the SHA256SUMS published beside it, and puts the binary in ~/.local/bin.

macOS

Apple Silicon and Intel · one universal .app

Signed, notarized and stapled. Opens on a double click with no dialog and no network. Drag it to Applications.

Download the .dmg

Linux

x86_64 · frameless under Wayland and X11

The install script, or the .tar.gz with the bare binary from the releases page.

$curl -fsSL https://raw.githubusercontent.com/theguriev/crook/main/script/install | sh

Windows

x86_64 · .zip

The frameless window and shell integration are built for it and not yet run on it. The architecture notes say what was checked instead.

Download the .zip

Building it yourself is cargo build --release with a stable Rust toolchain and no build scripts. script/run starts it from the checkout; --snapshot draws a frame to a PNG without opening a window.