Every shell, laid out your way.

Split a shell into panes, drag them into a tiling, tear them out into windows of their own, browse the files beside them, review diffs and quit knowing everything will be there when you return.

From one shell to a whole workspace.

Splits, tabs and every shell at a glance.

Split right with ⌘D or down with ⇧⌘D, or ⌘-drag a pane to tile it beside another or swap the two. Keep your shells in a sidebar or a tab bar, and see at a glance which are running, how far along they are, and whether they passed or failed.

Search shells
Turm
web2
turm.sh
turm.sh
Downloads
turm.shgit:(main)(0.01s)
ls app
apple-icon.png icon.png favicon.ico layout.tsx globals.css page.tsx
turm.shgit:(main)(0.02s)
pnpm dev
▲ Next.js 16.3.7 - Local: http://localhost:3000
turm.shmain
turm.shgit:(main)(0.01s)
git branch --show-current
main
turm.shgit:(main)(0.02s)
git log --oneline -1
9487830 Initial commit from Create Next App
turm.shmain

⌘T to run, jump or search.

Run a command in a new shell, open a folder shortcut, or type ? to search every shell by title, folder, branch and past commands. Pick a past command and Turm takes you to its shell with the block highlighted.

Turmgit:(main)39 • +1056 -220(0.01s)
git branch --show-current
main
Turmgit:(main)39 • +1056 -220(0.05s)
git status
On branch main
Turmmain39•+1056-220
Run a command, @folder, !shortcut, or ? to search shells
New shell~/Developer/Turm
@docs~/Developer/Turm/docs
@site~/Developer/turm.sh
!devpnpm dev
git status
git log --oneline -3

Drag to tile.

Drop a shell from the sidebar beside a pane, along the grid's edge, or onto a pane to swap them. Drag a pane back to the sidebar to make it a shell of its own.

Search shells
web
api
Downloads
webgit:(main)(0.4s)
pnpm dev
Ready on :3000
web

Tear off into a window.

Drag a shell or pane out of the window to open it in a new one, or into another Turm window. Whatever it is running keeps going.

webgit:(main)(0.4s)
pnpm dev
Ready on :3000
web
apigit:(main)running
cargo run
Listening on :8080

History that stays with its pane.

Each pane keeps its own command history, so ↑ recalls what you ran there, not in the pane beside it.

webgit:(main)(0.8s)
pnpm build
Compiled successfully
webmain
apigit:(main)(0.8s)
cargo test
test result: ok. 12 passed
apimain

Browse, open and edit files beside the shell.

Choose Show Files from the folder chip and a tree of that folder opens beside the shell. It follows the shell as you change folder, filters as you type and can show hidden files.

Double-click a file to open it in a pane. Python, JavaScript and TypeScript, Swift, Go, shell and JSON are highlighted, images and video are previewed, and Save writes the file back. Over SSH the same tree lists the server, and the files you open and save are the server's. Rows rename, copy a local, full or scp path, and show in Finder or move to the Trash.

~/Code/api
Filter
api
routes
users.py
health.py
models
main.py
pyproject.toml
README.md
users.py
1from fastapi import APIRouter
2
3router = APIRouter()
4
5@router.get("/users")
6async def list_users(limit: int = 50):
7 # Newest first
8 return await db.users.recent(limit)
EditedSave

Review the diff, then commit and push.

The changes chip opens a menu to view the working diff or the staged one, file by file, and to open either in a pane of its own. Large files show their first part, and binary files say so.

From the same menu, commit with a message, commit and push in one step, or push and pull. The branch chip adds New Branch, which creates a branch from the current commit and switches to it.

Search shells
api
apigit:(main)3 • +24 -6(0.2s)
pytest -q
12 passed in 1.4s
apimain3•+24-6
±View Diff
View Staged Diff
Open in Pane
Commit...
Commit & Push...
Push
Pull
api/routes/users.py+9-2
@@ -18,6 +18,9 @@ async def list_users
# Newest first
- return await db.users.all()
+ rows = await db.users.recent(limit)
+ return [row.public() for row in rows]
api/models/user.py+11-3
tests/test_users.py+4-1

Quit, and pick up where you left off.

Turm reopens your windows, tabs, splits and tear-offs where they were, with each shell back in its folder, its finished commands as blocks and its own command history. Open diff and file panes and the file sidebar return too.

Programs that were running are not restarted. An SSH shell comes back pointing at its host and waits for you to reconnect, and a folder that no longer exists opens its nearest parent with a note saying so. It is on by default, and a switch in Settings turns it off.

The saved files are in Application Support, readable only by you and kept out of backups. They can contain command output, so Clear Saved Workspace removes them.

Search shells
web2
api
prod
webgit:(main)(6.2s)
pnpm build
Compiled successfully
webgit:(main)(0.3s)
git status -sb
## main...origin/main
Restore windowsReopen windows, folders and finished commands. The files are in Application Support and can contain command output.
Saved workspaceRemove the stored windows and command output from this Mac.
Clear Saved Workspace

The small things that add up.

Even out panes.

Double-click a divider or press ⌃⌘= to give every pane an equal share. A split shell can be named as a whole.

webgit:(main)(0.4s)
pnpm dev
Ready on :3000
apigit:(main)(2.1s)
cargo test
test result: ok. 12 passed
docsgit:(main)(0.02s)
git status
On branch main

Logos of what is running.

The sidebar and tab bar show the logo of the program running in each shell, even a tool started through node or python.

webapinotes
webapinotesscratch

Copies you can watch and cancel.

Drop files from Finder onto a folder in the file sidebar and each one gets a progress bar, a speed and a cancel button. Dropping into a folder on an SSH shell uploads it over the connection you already have open.

dataset.zip
412 MB of 640 MB · 38 MB/s
screenshots
21 MB of 118 MB · 12 MB/s
notes.md
Done

Keyboard first.

Splitting, moving between panes and shells, evening out and the sidebar all have keys.

Spotlight
⌘T
New Shell
⌥⌘T
Split Right
⌘D
Split Down
⇧⌘D
Even Out Panes
⌃⌘=
Next / Previous Pane
⌘] / ⌘[
Next / Previous Shell
⇧⌘] / ⇧⌘[
Show or Hide Sidebar
⌃⌘S
Close Pane
⌘W

Keep exploring.