Skip to content
Editor

The editor, the terminal
and git, for every repo at once.

A native, GPU-drawn editor with language servers, split panes and diffs, next to real shells and a Git panel that commits across all of the branch's repos in one go.

myproject
feat-login
dev23%5h74%wk
WORKSPACES
main
Login page1
feat-login2 running
Checkout flow1
PROJ-101In ReviewCI failed
Invoice export1
PROJ-97Done
Changes (5)Remote (1)History
View Diff+61 -58Stage All
apion feat-login
Staged2
sessions_controller.rbapp/controllers+12 -1
sessions_controller_test.rbtest/controllers+38
Not staged1
development.rbconfig/environments+2
webon feat-login
Not staged2
Login.tsxsrc/pages+9 -3
LegacyForm.tsxsrc/components -54
feat-loginin 2 of 21 to push
Throttle repeated sign-in attempts
1 commit in api (2 files)Commit
Login.tsx
Branch diff
app/controllers/sessions_controller.rb+12 -2
1class SessionsController < ApplicationController1class SessionsController < ApplicationController
2 MAX_ATTEMPTS = 5
23
3 def create4 def create
4 user = User.find_by(email: params[:email])5 user = User.find_by(email: params[:email])
6
7 if throttled?(params[:email])
8 return render json: { error: "too many attempts" }, status: :too_many_requests
9 end
510
6 if user && user.authenticate(params[:password])11 if user&.authenticate(params[:password])
7 session[:user_id] = user.id12 session[:user_id] = user.id
8 remember(user)
9 end13 end
web - zsh
web % pnpm test
RUN v2.1.4 /workspace/web
x src/pages/Login.test.tsx > shows the throttle message
AssertionError: expected "Too many attempts" to be in the document
Test Files 1 failed | 11 passed
web %
11:23
Ruby
$17.25 today

Code editor

Tree-sitter highlighting, the language servers on your PATH, multiple cursors, project search and split panes. Main stays read-only: changes happen in branch workspaces.

[01]

Everything a right-click away

Go to definition, type definition and implementation, reveal the file in Finder or open a terminal there. Every item shows its key.

The editor
Login.tsx
1import { useState } from "react"
2import { signIn } from "../api/session"
3
4export function Login() {
5 const [email, setEmail] = useState("")
6 const [error, setError] = useState<string | null>(null)
7
8 async function submit(event: React.FormEvent) {
9 event.preventDefault()
10 const result = await signIn(email)
11 if (result.status === 429) setError("Too many attempts, try again in a minute")
12 }
Go to DefinitionF12
Go to DeclarationF12
Go to Type DefinitionF12
Go to ImplementationF12
CutX
CopyC
Copy and Trim
PasteV
Reveal in FinderR
Open in Terminal

Git, across every repo

The branch's changes in every repo, in one list. Stage, then one message makes one commit per repo. Push, pull and the pull request's checks sit on the Remote tab.

Changes (5)Remote (1)History
View Diff+61 -58Stage All
apion feat-login
Staged2
sessions_controller.rbapp/controllers+12 -1
sessions_controller_test.rbtest/controllers+38
Not staged1
development.rbconfig/environments+2
webon feat-login
Not staged2
Login.tsxsrc/pages+9 -3
LegacyForm.tsxsrc/components -54
feat-loginin 2 of 21 to push
Throttle repeated sign-in attempts
1 commit in api (2 files)Commit

Stage and commit together

Click a file to stage or unstage it; the footer says how many commits it will make.

app/controllers/sessions_controller.rb+12 -2
1class SessionsController < ApplicationController1class SessionsController < ApplicationController
2 MAX_ATTEMPTS = 5
23
3 def create4 def create
4 user = User.find_by(email: params[:email])5 user = User.find_by(email: params[:email])
6
7 if throttled?(params[:email])
8 return render json: { error: "too many attempts" }, status: :too_many_requests
9 end
510
6 if user && user.authenticate(params[:password])11 if user&.authenticate(params[:password])
7 session[:user_id] = user.id12 session[:user_id] = user.id
8 remember(user)
9 end13 end

Unified or split

The whole branch diff with every hunk open. Switch between unified and side-by-side with the two buttons; the choice is kept for every diff.

Terminal

Real shells in the workspace, in panes with tabs. Each one runs in a holder that keeps going when the app restarts, and reattaches.

[01]

Hand output to the agent

Select a failing test's output and right-click: Add Selection to Agent puts it in the main agent's prompt, Ask Agent about Selection starts a side agent on it.

Asking from anywhere
web - zsh
web % pnpm test
RUN v2.1.4 /workspace/web
x src/pages/Login.test.tsx > shows the throttle message
AssertionError: expected "Too many attempts" to be in the document
Test Files 1 failed | 11 passed
web %
CopyC
PasteV
Select AllA
ClearK
Add Selection to Agent
Ask Agent about Selection
Close Terminal Tab

Pull requests and Jira

Each workspace shows its pull request's state and its ticket's status. The pull request opens in a tab with its checks, reviewers and conversation; the ticket with its description and comments.

WORKSPACES
main
Login page1
feat-login2 running
Checkout flow1
PROJ-101In ReviewCI failed
Invoice export1
PROJ-97Done

On every workspace row

Checks pending, changes requested, CI failed or a conflict, and the ticket's status, without opening anything.

Straight from GitHub's API and your local worktrees: no gh CLI needed. Jira needs a site, an email and an API token in Settings.

Nothing else to install

Pull requests and tickets in the docs.