# Wortel: A native macOS terminal your agents can live in. > A zero-config macOS terminal on Ghostty’s real engine. Named sessions instead of tabs, a worktree per agent, and shells that keep running when you quit. Source: https://wortel.sh Download: https://updates.wortel.sh/Wortel-latest.zip Requires: macOS 14 Sonoma or later Price: free --- ## A terminal you never have to arrange One window. A sidebar of names. Several agents, none of them in each other’s way. Wortel is a fully native macOS terminal built on Ghostty’s engine: Swift and AppKit, no web view. Open it and the work is where you left it, every session still named and still in its own directory. No tabs to count, no panes to tile. Point it at a repository and each agent gets its own branch and its own files, with the diff of what they did beside them. None of it stops when you quit. Free, signed and notarized, for macOS 14 Sonoma or later. Wortel is Dutch for root. ## Ghostty’s engine, exactly as it ships The terminal inside Wortel is Ghostty. Not a port of it. Not inspired by it. Wortel embeds libghostty, so the VT parser, the Metal renderer and the glyph atlas are upstream’s, unmodified. Its own code is only the shell around them. Which is why there is no plugin API and no theme gallery. Fonts, colours and keybinds live in a read-only file inside the app, and your ~/.config/ghostty is never read. ## Sessions, not tabs A tab is a number you have to remember. A session is a name you chose. Name a session and it keeps the name. Put a slash in it and everything before the slash becomes a section, so twelve shells across four projects read as four groups. Names, directories and selection come back on launch. Switching costs a single frame, because every surface stays alive inside the window. ## A coding agent in every session Hand one repository to Claude Code, another to Codex, a third to Aider, and the terminal stops being the hard part. Knowing which one needs you becomes the hard part. Wortel reads that off the screen. Output that keeps moving is an agent working; a screen gone still is one waiting on you. Where an agent announces itself Wortel takes its word for it, and where it says nothing, which is most of them, Wortel still knows. The sidebar marks what is working and what is waiting, a notification arrives when a background agent goes quiet, and ⌘⌥] jumps to the next one waiting. Anything still running when you quit is picked back up on the next launch. It ships no per-agent integrations on purpose: a terminal that adapts to six agents by name is a terminal that is wrong about the seventh. A bundled wortel command sits on every session’s PATH instead, so anything that can run a command can drive the app. ## Your repository, in the same window An inspector beside the terminal, with three panes: Changes, History and Files. Changes is the working tree file by file, with syntax-highlighted diffs and somewhere to write the commit. History is the commit list with its branch graph. Files is the project as a tree: drag a row into the terminal and the escaped path lands at your prompt. Double-click a file in any of the three, or ⌘-click a path in the terminal, and it opens in a window of its own: source, the diff, rendered Markdown, and Quick Look for everything that is not text. ## Several agents, one repository Two agents in one checkout is two agents editing the same files. A worktree each, and the problem stops existing. Open a session on a branch and Wortel checks it out in its own directory, with its own files, sharing the repository’s history, objects and remotes. It costs a directory rather than a clone. So five agents work on five branches, none of them changing the ground under another mid-task, and each one’s inspector shows only its own work. The worktrees live outside the repository, where they cannot be committed by accident. ## Quit the app, keep the work Your shells are not the app’s children. They run under a small process beside it, so closing the window stops being a decision about the work. An agent that was thinking when you quit is still thinking when you come back, and the session reattaches to the shell it already had, scrollback included. A crash is the same story. This is on by default and there is nothing to switch on. ## Nothing to configure, on purpose Wortel’s entire configuration is one read-only file inside the app. There is no settings window, and there is no dotfile. This is the feature. A terminal you can spend an afternoon tuning is a terminal you will. Wortel chooses the font, the theme, the keybinds and the scrollback once, and treats them as finished. Font size is the one thing you can change. ## Reference: The command, the shortcuts, and the parts that are worth knowing exactly. Source: https://wortel.sh/docs ### The wortel command Bundled inside the app and on every session’s PATH, with no installer and no admin prompt. It speaks to the running app over a socket. | Command | What it does | | --- | --- | | wortel open | Opens a preview window for a file | | wortel new --branch | A session, in its own worktree | | wortel new --branch --from | Forks the new branch from something else | | wortel rename | Renames the session it was run in | | wortel notify | This session wants you | This is how Wortel avoids shipping an integration per agent. An agent that just wrote a file opens a preview of it. A hook you wrote names the session after the ticket you are on. A build that finishes raises attention. ### Keyboard shortcuts | Action | Shortcut | | --- | --- | | New session | ⌘N or ⌘T | | New section | ⌘⇧N | | Rename session | ⌘R | | Close session | ⌘W | | Previous / next session | ⌘⇧[ ⌘⇧] or ⌘⌥↑ ⌘⌥↓ | | Jump to session by position | ⌘1 … ⌘9 | | Jump to the next waiting session | ⌘⌥] | | Show source control | ⌘⌥G | | Show files | ⌘⌥E | | Toggle sidebar | ⌘⌥S | | Focus the source-control list | ⌘⌥L | | Find, in a preview window | ⌘F | | Increase / decrease / reset font size | ⌘+ / ⌘− / ⌘0 | | Select all (⌘A clears the input line) | ⌘⇧A | ### How the agent detection works Where an agent announces itself, with OSC 9;4 progress, OSC 133 command marks or a spinner in the title, Wortel uses that. None of it is required: the fallback is the screen itself, so an agent that emits nothing is still read correctly, including one that does not exist yet. Nothing is written into any agent’s configuration to make this work, and detection only runs on sessions you are not currently looking at. A notification never arrives for the session in front of you. ### What a worktree session does The session takes the branch’s name, and a branch that already has a worktree opens the one it has instead of failing. Its row carries a small branch mark, because the name alone cannot tell you: a session named for its branch otherwise reads as an ordinary shell that happens to be called the same thing, and which one you are looking at decided where your last commit went. A new branch forks from the repository’s default branch, not from wherever you happen to be standing. Opening one from inside another agent’s worktree would otherwise fork that agent’s half-finished branch, which is a thing you find out about later. Both the dialog and the command let you pick something else to fork from. ### The parts underneath The process holding your shells knows nothing about terminals, git or rendering. It forks what it is told to fork and keeps reading when nobody is attached, which is what makes it small enough to trust with outliving everything else. Switching sessions costs a single frame because every surface stays alive inside the window. Only the one you had selected starts before the first frame; the rest warm up behind it. The inspector belongs to the session, because a shell in your home directory never wants it and one inside a repository always does. Cost tracks the window on screen, never the size of the repository: a collapsed node_modules is one row and no work at all. ## Frequently asked questions ### What is Wortel? Wortel is a fully native macOS terminal emulator built on Ghostty’s engine. It replaces tabs and splits with a sidebar of named, persistent sessions, gives each coding agent its own git worktree so several can work one repository at once, keeps those shells running after you quit the app, and ships with no configuration to maintain. A git panel, a file tree and agent activity detection are built in. ### Is Wortel free? Yes. Wortel is a free download for macOS 14 or later, and updates itself through Sparkle. ### What does “Wortel” mean? Wortel is Dutch for root: the root of a plant, and the root shell you work in. ### What are the system requirements? macOS 14 Sonoma or later. Wortel is a signed and notarized native application; the download is roughly 17 MB. ### How is Wortel different from Ghostty? Wortel runs Ghostty’s engine, so terminal behaviour, throughput and latency are the same. The difference is the app around it: Ghostty gives you tabs, splits and a large configuration file, while Wortel gives you one window, a sidebar of named sessions that persist across restarts, a git worktree per session, shells that keep running after the app quits, a built-in git and files inspector, coding-agent activity detection, and no configuration at all. ### Does Wortel have tabs or split panes? No, and that is intentional. One window holds a sidebar of named sessions; switching between them is instant, so the arranging a tab bar or a split layout exists to support is not needed. Requests for tabs, splits and the command palette are declined by the app rather than partially implemented. ### Do my sessions keep running if I quit Wortel? Yes. Shells run under a small keeper process outside the app rather than as its children, so quitting Wortel, or Wortel crashing, does not stop them. An agent that was working when you quit is still working when you launch again, and the session reattaches to the shell it already had, with the output from while you were gone. This is on by default and there is nothing to switch on. ### Does Wortel read my existing shell configuration? Your shell configuration (.zshrc, .bashrc, fish config) is yours and runs normally. It is only Wortel’s own terminal configuration that is fixed and bundled; the user-level Ghostty config file is deliberately not loaded. ### How is Wortel different from herdr, tmux or Zellij? Those are multiplexers: a background server plus a client that runs inside whatever terminal you already supply. Wortel is the terminal, and it holds sessions the same way, under a process outside the app, so quitting Wortel does not stop them. What it adds is the part a multiplexer has no window for: a git panel with diffs, history and a branch graph, a project file tree, preview windows, and a worktree per session, all beside the shell rather than in another tool. ### Does Wortel work with Claude Code, Codex and Aider? Yes. They run as ordinary shell commands in any session, with no per-agent setup and no changes to their configuration files. Beyond that, Wortel marks in the sidebar which agents are working and which are waiting, notifies you when a background agent goes quiet, jumps to the next waiting session with ⌘⌥], gives each one its own worktree so they can share a repository, keeps them running when the app is closed, and resumes agents that were still running when you last quit. ### Can I configure Wortel’s fonts, colours and keybinds? Only font size, which is adjustable per session with ⌘+ and ⌘−. Everything else is fixed: the whole configuration is a read-only file inside the app bundle, and your ~/.config/ghostty is never read. Zero configuration is the design goal, not a missing feature. ### Can I run several coding agents on one repository at once? Yes, and that is what git worktrees are for here. Opening a session on a branch checks that branch out in its own directory with its own files, sharing the repository’s history, objects and remotes, so it costs a directory rather than a clone. Each agent then edits its own files on its own branch, nothing changes the ground under a running agent, and each session’s git panel shows only that worktree’s work. A branch that already has a worktree opens the one it has, a new one forks from the repository’s default branch rather than from whichever worktree you opened it in, and the sidebar marks which rows are worktrees. ### How is Wortel different from Conductor, Emdash or Superset? Those are agent manager apps: a window holding worktrees, diffs and a review queue, with a terminal as a detail inside it. Wortel is the terminal, and the worktrees and diffs are in it. The practical difference is what happens when you quit. Wortel’s shells run under a separate process, so an agent mid-task keeps working whether or not the app is open, and everything you type is a real terminal on Ghostty’s engine rather than a box in a form. ### How does Wortel know when a coding agent is waiting for me? By watching what the session draws. A screen that keeps changing means the agent is still working; a screen that has held still past a threshold means it is waiting on you. Precise signals (OSC 9;4 progress, OSC 133 command marks, a title spinner) are used where an agent emits them, but none are required, so the rule covers Claude Code, Codex, Aider and agents that do not exist yet. Nothing is written into any agent’s configuration to make this work, and detection only runs on sessions you are not currently looking at. ### Can I control Wortel from the command line or from an agent? Yes. A wortel command ships inside the app bundle and is on the PATH of every session, with no installer and no admin prompt. It speaks to the running app over a socket: wortel open opens a preview window for a file, wortel new --branch opens a session in its own worktree, wortel rename renames the session it was run in, and wortel notify raises attention on it. That is how Wortel avoids shipping a separate integration per agent: anything that can run a command can drive it, including your own hooks and scripts. ### How is Wortel different from iTerm2, Warp, Kitty or Alacritty? Wortel has no settings UI, no plugin system, no AI chat box, no tabs and no splits. What it has instead is built around running coding agents: named shells that survive a restart and switch in one frame, a git worktree per session so several agents can work one repository at once, shells that keep running after you quit the app, a git and files inspector beside the terminal, and detection of which background agent has stopped and is waiting on you. ## Compare, app by app Pick any two, or more if your screen has room. Every answer was read off that product’s own site, docs or repository. ### What kind of tool it is The category each one belongs to, before any feature is counted, and whether the shell is the product or a panel inside it. | Question | Wortel | Ghostty | iTerm2 | Warp | cmux | Conductor | Emdash | Superset | herdr | tmux | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | What kind of thing is it | A terminal, with the review tools in it | A terminal emulator | A terminal emulator | A terminal with an agent built in | A terminal arranged for agents | An app that runs agents for you | An app that runs agents for you | An app that runs agents, with a terminal in it | A server your terminal attaches to | A multiplexer inside your terminal | | A real terminal you type in | yes: Ghostty’s engine, unmodified | yes: The whole point | yes: The whole point | yes: A Rust, GPU rendered client | yes: Ghostty’s engine too | partial: One per task, inside the app | partial: It runs CLI agents, in the app | yes: Built in, with tabs and splits | partial: Inside the terminal you supply | partial: Inside the terminal you supply | | Fully native macOS | yes: Swift, AppKit, SwiftUI, Metal | yes: Swift and AppKit on macOS | yes: Objective-C and AppKit | partial: Rust and GPU, drawn rather than AppKit | yes: Swift and AppKit | A Mac app; the stack is not published | no: Cross-platform desktop app | no: Electron | no: A terminal user interface | no: A terminal user interface | ### Several agents at once What happens when there are four of them: whether they edit the same files, which one is waiting on you, and what survives you quitting. | Question | Wortel | Ghostty | iTerm2 | Warp | cmux | Conductor | Emdash | Superset | herdr | tmux | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | The work survives the window closing | yes: Shells run under a keeper process | no: The shell is a child of the app | no: The shell is a child of the app | no: The shell is a child of the app | no: The shell is a child of the app | Not published | Not published | partial: Sessions survive a restart; processes not stated | yes: The server owns the shells | yes: The server owns the shells | | A git worktree per agent | yes: A session opens on a branch | no: You run git yourself | no: You run git yourself | no: You run git yourself | no: You run git yourself | yes: A workspace and a branch per task | yes: Its core idea | yes: Its core idea | no: Pairs with a tool that does | no: You run git yourself | | Knows which agent is waiting on you | yes: Read off the terminal stream | no: A bell, at best | no: A bell, at best | yes: Agent notifications, on by default | yes: Rings, badges, a notification panel | Not published | Not published | yes: Indicators, chimes and a Dock badge | yes: Working, blocked or idle, per pane | no: Nothing reads the pane | | Works without touching your agent’s config | yes: Nothing is installed into any agent | yes: Nothing to install | yes: Nothing to install | partial: Codex needs a line in its own config | no: Writes hooks into each agent | Not published | yes: Detects the CLIs you have installed | Not published | partial: Prefers hooks, works without them | yes: Nothing to install | ### Reviewing and driving them What it takes to see what an agent did, to let it act on the app itself, and to keep the whole thing running. | Question | Wortel | Ghostty | iTerm2 | Warp | cmux | Conductor | Emdash | Superset | herdr | tmux | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | Diffs and history in the same window | yes: Changes, History, Files and previews | no: Another app | no: Another app | no: Another app | partial: Branch and PR status, not diffs | yes: Review the diff, open a PR, merge | yes: Diffs, pull requests and CI checks | yes: Inspect, comment on and edit the changes | no: No window to put it in | no: No window to put it in | | Agents can drive it themselves | yes: A bundled wortel command, over a socket | partial: Some CLI actions, no session API | yes: A Python API and AppleScript | Agent APIs; session control not published | yes: A CLI and a socket API | yes: A Conductor API | Not published | yes: A superset binary and a TypeScript SDK | yes: The CLI is the API | yes: send-keys, and a full command set | | Nothing to configure | yes: None. One read-only file in the bundle | no: A config file, often a large one | no: A large settings window | no: Settings, themes and agent profiles | no: Reads your Ghostty config | Not published | partial: Detects your CLIs; providers to set up | partial: An optional .superset/config.json | no: Config, plugins and keybinds | no: A .tmux.conf | These tools ship weekly and this page does not, so check anything that decides it for you. Where a product does not publish an answer the cell says "not published" rather than guessing: that is not a polite way of saying no. Corrections are welcome, and anything wrong here is a mistake rather than a position. ## At a glance | | | | --- | --- | | Platform | macOS 14 Sonoma or later | | Engine | libghostty: Ghostty’s VT parser, Metal renderer and glyph atlas | | Built with | Swift, AppKit and SwiftUI, fully native | | Sessions | Held by a keeper process: they outlive the app | | Repositories | A git worktree per session, on its own branch | | Scripting | A bundled wortel command, no installer | | Price | Free | | Updates | Sparkle, signed and notarized | | Configuration | None: read-only and bundled | --- © Giel Cobben. Wortel is Dutch for "root".