A native window for cornercase, the terminal multiplexer for running coding agents in parallel, on macOS, Linux and Windows. It is drawn on the GPU with GPUI, the UI framework behind the Zed editor, and aims to do everything cornercase's own window does, with the look and feel of a native app.
It is only a window: cornercase's server keeps owning the shells, agents and worktrees, and this app drives it through the cornercase command line. Both windows show the same session, and closing either one stops nothing.
Download · Website · usecornercase.dev · cornercase · Discord
- Terminal. Every pane sits on a floating card: drag the gap between cards to resize, select with the mouse, click a web address to open it in your browser or the Browser panel (Settings › Links), ⌘-click links and paths to open them in their default app, drop files to paste them, and drag a pane by its handle onto another to move it. A pane scrolled up says
↓ n more, and a click on it goes back to the bottom. A message that a script or another agent sends while you are typing to a pane waits for you: the pane's card says who sent it, with buttons to send it now, which submits what you have typed with it, or to let it wait its turn. Tabs that do not fit in the bar scroll with‹›or the wheel, and the one you are on stays in view. A project or workspace with nothing open says so, with buttons to start an agent, open a shell or reopen its closed agents. - Sidebar. Groups, projects, workspaces and agents, with each agent's status, model, account and context, and each workspace's pull request with how its checks went: click it, or press ⌘P, for every check with its link, its stack and Ask agent. Merge check, in a workspace's menu, says whether it would merge cleanly into its base and which files would conflict, and hands them to its agent; with Settings › Worktrees › shared files on,
⇄marks workspaces and files that another workspace changes too. View context, in a tab's or an agent's menu, shows what fills that agent's context: memory files, MCP servers, skills and the tools that took the most, without typing into the agent or spending tokens. A tab saysOpus 5.5 · compactedafter its conversation was compacted, and with Settings › UI › memory on, the memory its panes use. The rail counts the changed files on Changes' icon and puts a dot on TODO's while items wait. Drag to reorder, in any layout of cornercase's Settings → UI, whose switches for the model, context, counts, TODO dot and inactive panes the window follows too. Open in… takes a project, a workspace or a pane's folder to your file manager, VS Code, Cursor, Zed or Sublime Text. Import VS Code workspace…, in the Projects+or a group's menu, turns a.code-workspacefile into a group of projects, and Run setup, in a worktree's menu, runs its project's setup again to retry after a fix. - Previews. Rest the pointer on a path a program printed and the file shows beside it: code at its lines, images, PDFs and documents (Quick Look on macOS, the desktop's thumbnailers on Linux, File Explorer's thumbnails on Windows), and videos and sounds that play on macOS. A click opens it in the Files panel. Rest it on a web address and the page shows, drawn by the Browser panel's Chrome: a local dev server's at once, others when you ask.
- Docked panels. Changes (the workspace's diff, to filter by path, stage, discard and review), Files (tree, viewer and search), TODO, Recap (below), a Browser and, in a workspace that runs a flow, Flow: its plan lit up where the work stands, its team and their messages, beside the agents at work; the files of its run open in Files, and ‹ Flow goes back. In a diff or an open file, click, drag or ⇧-click to select lines or characters, then ask the agent about them, copy them or open them there; ⌘F finds in the open file. Long lines wrap, or a button cuts them. The tree shows git's letter for what changed, an open file marks its added and changed lines and where lines went (a click on the mark shows the old ones), and a button gives the file the terminal's room until you press it again or Esc.
- Recap. An agent sums up what your agents did, in every project: where things stand now and what waits on you, yesterday for the daily (the last day you worked with agents, so on Monday it is Friday), or the last 7 days. Every conversation and pull request it names is a link: to the agent's pane, or to the pull request on the web. Settings › Agents › Recap chooses the agent, its model and the language.
- A browser beside the agent. A real Chrome on the workspace's dev servers, with device sizes and the console. Pick an element or take a screenshot and hand it to the agent.
- Accounts. Once an agent has more than one login, each pane says which it runs on, and its card or menu switches it: the agent restarts on the other account in the same conversation, after its turn if it is busy. Wherever an agent starts (an issue, the Agent button, the Queue, a flow, one per agent of its team) a dropdown chooses its account, on the one in use unless you pick another.
- The rest of cornercase. Search, Issues, Queue, Flows, Usage, Accounts, Machines, Processes, Ports, Worktrees, Plugins, Settings and the guided tours, each one shortcut away. Search finds settings too, after your projects, workspaces and tabs: choose one and Settings opens on its row, with nothing changed. Settings pairs a phone: a code to scan opens this computer's cornercase in its browser or links a Telegram or Discord bot, and a Discord forum's server is picked there. The Queue starts an agent later, or again and again as a routine: pause it, resume it, start it now, and see its last runs, each in a fresh worktree from the up-to-date default branch. A flow, a team of agents, starts from its sheet, from an issue or from a project's
+, and opens its workspace with the Flow panel beside it (View flow in the workspace's menu opens it later); from an issue, its task comes filled in with the issue's, ready to add to. Edit one in its sheet: prompts of several lines, stages that move up and down with their loops kept right, its plan redrawn as you go. Plugins add their entries to the menus of projects, workspaces, tabs and panes, and their buttons to the rail: a button acts on what this window shows, its popup opens here, and what a plugin keeps running beside a window runs beside this one, its state on the plugin's card. - Tidying up. Processes closes a pane, Ports stops the ones you tick or all of a workspace's, a project's menu opens its Worktrees and its settings (setup, teardown and the folders Free builds deletes), the Worktrees sheet removes any worktree on disk, a closed project's and a leftover's too, and its branch if you ask, after saying what would be lost, Settings imports only the sections you tick, and the rail's Help has the docs, the bug report and the tours.
- Other machines. Connect the window to cornercase on another machine over your own
ssh; it reconnects by itself when the link drops. Or stay here and list the computers your agents can run on in the Machines sheet: it shows each one's link, live, and adds, edits, retries, updates and removes them. Their workspaces sit in your sidebar under the project they share with you, tagged with the machine, with their agents' status, model and context, dimmed with when they were last seen while the link is down. With the agents section on, their agents are listed there too, under whoever started them, and fold on the machine. Rename, close or remove a worktree there from the row, and their agents' notices reach you here. A click shows that tab, live, in this window: its splits, its colours, your keys and pastes, the wheel, selecting and copying to this computer, dragging its dividers, its other tabs in the bar. Typing costs one process, as here. If the link drops, its last frame stays dimmed with a card saying so and counting down to the next try, nothing you type is sent or kept, and it comes back by itself, following the workspace if the server there restarted. An issue's Start, Start a flow and New workspace have a Run on row: pick a machine and the window asks it for its accounts, agents, trackers and flows, offers a login tab when an agent is missing or logged out, clones the project there if it has no clone (the address is yours to edit, and the git-ignored files you tick, such as.env, go with it), starts the work on that machine and shows its tab here at once, even while its agent asks to trust the folder. A project needs a git remote to run elsewhere. Changes and Files read the machine's workspace you picked, tabs, filter, diff, tree, search and viewer as here, without staging or discarding there: while the machine is down they keep what they show and say they are reconnecting. The Usage sheet reads this computer, one machine or all of them: stats add up, and an account logged in on two machines shows once. - Notifications. Agent notices as toasts and desktop notifications, with sounds and the bell.
You need cornercase 0.13.19 or newer. The window finds it on the PATH, in your login shell's PATH or where its installers put it, and says so, with the way to install it, when it is missing.
The macOS download is signed and notarized by Apple. The Windows and Linux ones are not signed yet, so those systems ask before they run the app the first time. The latest release lists them all, with the notes of what changed; each file has a .sha256 beside it, and sha256.sum holds them all.
- macOS 12 or later, Apple silicon or Intel: cornercase-gpui-universal-apple-darwin.dmg. Open it and drag cornercase to Applications. The first time you open it, macOS asks whether to open an app downloaded from the internet.
- Windows 10 or 11 (x64): cornercase-gpui-x86_64-pc-windows-msvc.zip. Unzip it, for example into
%LOCALAPPDATA%\Programs\cornercase, and runcornercase-gpui.exe; no Visual C++ runtime is needed. SmartScreen warns about an unknown publisher: More info › Run anyway. Windows 11's Smart App Control blocks unsigned programs outright, with no way to allow just this one, until it is signed (#24). To start it from the Start menu, make the shortcut below withTargetPathwhere you unzipped it. - Linux x86_64 (built on Ubuntu 22.04, so it needs its glibc 2.35 or a newer one): cornercase-gpui-x86_64-unknown-linux-gnu.tar.gz. It needs a Vulkan driver and the runtime libraries; on Debian and Ubuntu,
sudo apt install libxkbcommon-x11-0 libfreetype6 libfontconfig1 libwayland-client0 libvulkan1 mesa-vulkan-drivers. Extract it, theninstall -Dm755 cornercase-gpui ~/.local/bin/cornercase-gpuiand the desktop entry and icon as below, with that path. Packages are tracked in #25.
To check a download: shasum -a 256 -c <file>.sha256 on macOS, sha256sum -c <file>.sha256 on Linux, or Get-FileHash -Algorithm SHA256 <file> on Windows, compared with the .sha256. Every download carries the licences of the code and the icons in it (THIRD-PARTY-NOTICES.txt lists the crates).
A downloaded build asks GitHub for the latest release when it starts and every hour, and shows ↑ window X.Y.Z in the status bar when a newer one is out; the dialog lists what changed. On Windows and Linux, Install downloads the release, checks its checksum and replaces the program; Restart window then opens it again on the same tab; the terminals and agents keep running, since cornercase's server owns them. This needs a folder the window can write. On macOS it downloads the DMG, and a build from source shows the cargo install line to copy. Turn the check off with cornercase's check_updates setting. cornercase-gpui --version prints the version; on Windows the program has no console, so pipe it: cornercase-gpui --version | Out-String.
You need:
- macOS with the Xcode Command Line Tools (
xcode-select --install), Linux (X11 or Wayland) with a Vulkan driver and the libraries below, or Windows 10 or 11 (x64) with Visual Studio's Build Tools and their "Desktop development with C++" workload (the MSVC compiler and the Windows SDK) - rustup, which installs the pinned Rust version on the first build
On Linux, install a C compiler, pkg-config and these libraries first. On Debian and Ubuntu:
sudo apt install build-essential pkg-config libxkbcommon-x11-dev libfreetype-dev libfontconfig-dev libwayland-dev mesa-vulkan-driversOther distributions name them alike: xkbcommon with its X11 part, FreeType, Fontconfig and Wayland's client library, plus the Vulkan loader and your GPU's Vulkan driver.
git clone https://github.com/usecornercase/cornercase-gpui.git
cd cornercase-gpui
cargo install --locked --path .The first build takes a couple of minutes, and puts cornercase-gpui in ~/.cargo/bin. On Linux, to start it from your desktop's app menu as well:
mkdir -p ~/.local/share/applications
sed "s|^Exec=.*|Exec=\"$HOME/.cargo/bin/cornercase-gpui\"|" assets/linux/cornercase-gpui.desktop > ~/.local/share/applications/cornercase-gpui.desktop
install -Dm644 assets/linux/cornercase-gpui.svg ~/.local/share/icons/hicolor/scalable/apps/cornercase-gpui.svgAn app started from the menu sees your session's PATH, not your shell's: the window asks your login shell for it, and looks where cornercase's installers put it. If it still cannot find cornercase, it says so and lets you choose the file.
On Windows, run the same three lines in PowerShell after installing cornercase (powershell -ExecutionPolicy Bypass -c "irm https://usecornercase.dev/install.ps1 | iex"); the build puts cornercase-gpui.exe in %USERPROFILE%\.cargo\bin. A release build compiles gpui's shaders with fxc.exe from the Windows SDK, which the Build Tools install; if it is not found, set GPUI_FXC_PATH to it. To start it from the Start menu as well:
$link = (New-Object -ComObject WScript.Shell).CreateShortcut("$env:APPDATA\Microsoft\Windows\Start Menu\Programs\cornercase.lnk")
$link.TargetPath = "$env:USERPROFILE\.cargo\bin\cornercase-gpui.exe"
$link.Save()The Browser panel runs Chrome, Chromium or Brave if one is installed, else Microsoft Edge, which every Windows has. Opening files and File Explorer go through Windows' shell; desktop notifications show as "cornercase" in Settings › System › Notifications; a sound file of your own must be a WAV; and videos and sounds in a preview play only on macOS.
cornercase-gpui # opens on what cornercase's window shows
cornercase-gpui --tab 6 # or on a tab, workspace or project id (see `cornercase status`)
cornercase-gpui --remote devbox # or on another machine's server, over sshIt starts cornercase's server if none runs. --remote takes a host from ~/.ssh/config or user@host and runs cornercase there through your own ssh, so your config, keys, agent and jump hosts apply. It never asks for a password: use a key or an agent. Add --remote-command '~/bin/cornercase' when cornercase is not on that machine's PATH. From a checkout, cargo run --release -- takes the same flags.
These environment variables change its defaults:
| Variable | What it sets | Default |
|---|---|---|
CORNERCASE_BIN |
The cornercase binary to drive |
found on the PATH, in the login shell's PATH or in the installers' folders |
CORNERCASE_GPUI_FONT_SIZE |
The terminal's font size (Menlo on macOS; on Linux the first monospace font installed of DejaVu Sans Mono, Noto Sans Mono and the like; Cascadia Mono, else Consolas, on Windows) | 13 |
CORNERCASE_GPUI_OPACITY |
The opacity of the terminal's background; 1 makes it opaque |
0.65 |
CORNERCASE_GPUI_CHROME |
The browser the Browser panel runs, headless (on Windows, set it for good with setx) |
Chrome, Chromium, Edge or Brave; on Windows Edge comes last |
CORNERCASE_GPUI_BROWSER_PROFILE |
Where that browser keeps its profile | ~/Library/Application Support/cornercase-gpui/browser; on Linux ~/.local/share/cornercase-gpui/browser, or ~/snap/chromium/common/cornercase-gpui-browser for a snap; on Windows %LOCALAPPDATA%\cornercase-gpui\browser |
Every key goes to the program in the active pane, except ⌘ shortcuts. ⌘/ lists them in the app.
| Keys | |
|---|---|
| Tabs | ⌘T new · ⇧⌘W close · ⌘1…9 go to one (⌘9 the last) · ⇧⌘[ ⇧⌘] previous, next |
| Panes | ⌘D split right · ⇧⌘D split down · ⌘[ ⌘] previous, next · ⌘W close what is on top, else the pane |
| Getting around | ⌘J ⇧⌘J next, previous workspace · ⌘Y ⇧⌘Y next, previous project · ⌘B the agent that needs you · ⌘R mark for review, or as reviewed |
| Projects | ⌘O open a project · ⌘N new workspace · ⌘G start an agent · ⌘P the workspace's pull request · ⇧⌘P go to a file · ⇧⌘K connect to another server |
| Panels | ⇧⌘C Changes · ⇧⌘E Files · ⇧⌘L TODO · ⇧⌘H Recap · ⇧⌘B Browser · ⇧⌘F Flow (in a flow's workspace) |
| Sheets | ⌘F Search · ⌘I Issues · ⇧⌘S Queue · ⇧⌘G Flows · ⌘U Usage · ⇧⌘A Accounts · ⇧⌘N Machines · ⇧⌘M Processes · ⇧⌘O Ports · ⇧⌘T Worktrees · ⇧⌘X Plugins · ⌘, Settings |
| Terminal | ⌘C copy · ⌘V paste (an image as a file the agent can open) · ⌘+ ⌘- ⌘0 text size |
| In Files and Changes | While one has the focus: ⌘C copy what is selected · in Files' viewer, ⌘F find in the file (↩ next, ⇧↩ previous) |
| In the Browser | ⌘L address · ⌘R reload · ⌘[ ⌘] back, forward · ⌘C ⌘X ⌘V on the page; every other key goes to the page |
| Window | ⌘H hide · ⌥⌘H hide the others · ⌘M minimise · ⌃⌘F full screen · ⌘Q quit |
The key that opens a panel or sheet also closes it. Esc closes the menu, dialog or sheet on top, or gives the keys back to the terminal. Text goes through macOS's input method, so dead keys and ⌥ characters (@ on a Spanish keyboard) reach the program.
On Linux, ⌘ is Ctrl+Shift and ⇧⌘ is Ctrl+Alt+Shift, as in Linux terminals: ⌘T is Ctrl+Shift+T, ⇧⌘C is Ctrl+Alt+Shift+C, ⌘C ⌘V are Ctrl+Shift+C Ctrl+Shift+V, and a symbol is the key where it sits on a US keyboard (⌘+ is Ctrl+Shift+=). The exceptions: ⌘1…9 is Alt+1…9, Usage is Ctrl+Alt+Shift+U (IBus takes Ctrl+Shift+U), a page in the Browser also takes Chrome's keys (Ctrl+C Ctrl+X Ctrl+V, Ctrl+L, Ctrl+R or F5, Alt+← Alt+→), the window's keys are Ctrl+Shift+Q quit, F11 full screen and Ctrl+Shift+M minimise, and ⌘-click is Ctrl+click. Selecting text puts it in the primary selection and a middle click pastes it (Shift+middle click where a program takes the mouse), while Ctrl+Shift+C and Ctrl+Shift+V keep to the clipboard. AltGr characters reach the program, and Ctrl+Shift+/ lists every key as Linux spells it.
On Windows the keys are Linux's, as Windows Terminal's own are Ctrl+Shift: ⌘T is Ctrl+Shift+T, ⇧⌘C is Ctrl+Alt+Shift+C, ⌘1…9 is Alt+1…9, Usage is Ctrl+Alt+Shift+U, the Browser takes Chrome's keys, and ⌘-click is Ctrl+click. The window's keys are Windows' own: Alt+F4 quits, F11 is full screen and Ctrl+Shift+M minimises; the title bar moves, snaps and maximises the window as any other's. There is no primary selection: a finished selection is copied as on a Mac. AltGr characters reach the program, also on layouts where Windows reports AltGr as Ctrl+Alt, and Ctrl+Shift+/ lists every key as Windows spells it.
The window never speaks cornercase's socket protocol. It follows cornercase view for the session and cornercase surface for what the panes show, types through cornercase input --follow, and does everything else with cornercase commands and their --json: the contract cornercase documents for programs that draw it (#345). On another machine, every command runs as cornercase --remote DESTINATION ….
When cornercase lacks something a feature needs, the gap is filed upstream instead of worked around, and the window names the issue the feature waits on. The two exceptions are by design: the Files panel reads the disk itself, and the Browser panel runs a headless Chrome and its ssh tunnels. The decisions behind each area, and why, are in design/, indexed by DESIGN.md.
Bug reports, ideas and pull requests are welcome: CONTRIBUTING.md explains how to build, run and check a change. Ask questions on Discord, and report vulnerabilities privately, as SECURITY.md explains. The rules for every change, for people and coding agents alike, are in AGENTS.md.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Some parts come from other projects and keep their licences:
- The text field (
src/ui/text_field.rsandsrc/ui/text_field/element.rs) is adapted from gpui 0.2.2'sexamples/input.rs, copyright Zed Industries, under Apache-2.0 (LICENSE-GPUI). - The icons in
assets/icons/are Lucide's, under ISC (assets/icons/LICENSE), with thinner strokes and two of them filled; thestatus-*andwindow-*icons are this project's own. - The file-type icons in
assets/file-icons/are glyphs of Seti UI and Nerd Fonts, under MIT (assets/file-icons/LICENSE). - The website in
site/is set in Archivo and JetBrains Mono, under the SIL Open Font License, which the site's npm packages carry.
