A feed, not a screen scrape
Replies, tool calls and their output arrive as messages. Titan sets replies as Markdown for reading, folds tool output until you open it, and never scrapes text off a screen.
An AI-native terminal for macOS.
Shells, Claude Code sessions and agents like pi, side by side in tabs and splits,
with a browser they can drive and actions you can script.
Built on libghostty, the terminal core behind Ghostty.
Recorded in Titan, nothing staged: real Claude Code and pi sessions on a small timer app. Pick one, or let them play through.
Claude Code's TUI takes over a whole terminal: its own transcript, its own input box, its own spinners. Run three of them and you're flipping through tabs to find the one that's waiting on you. Titan runs Claude Code in its structured stream mode instead, so a session is a pane like any other, and Titan knows what each one is doing.
Replies, tool calls and their output arrive as messages. Titan sets replies as Markdown for reading, folds tool output until you open it, and never scrapes text off a screen.
Tabs show whether their sessions are working, done or waiting on you. ⌘J jumps to the one that's waiting; hover a tab to see what each session is doing.
Shells and Claude sessions run in titan-ptyd, a small daemon, so quitting or updating Titan doesn't stop them. Reopen it and they're where you left them.
Use Titan's own Claude pane, the claude CLI you already know, or another coding agent such as pi or Codex.
Each one runs in a pane, can open panes and drive the browser beside it, and stays out of the panes that aren't its own.
you Start the dev server and check the page ▸ Ran 2 commands ▸ titan_do new_split direction=right command="npm run dev" ▸ browser_navigate localhost:4173 · browser_click "Break" The page loads and Break sets the timer to 05:00. The dev server is still running in a pane on the right.
The same claude you have installed, with your settings, CLAUDE.md, skills and MCP servers, drawn as a feed with its own composer, model picker and context ring. Titan gives it its browser and pane tools as an MCP server, mcp__titan__*.
Uses your Claude Code login. There's no API key to paste into Titan.
pomodoro ❯ claude ╭──────────────────────────────────────╮ │ ✻ Welcome to Claude Code │ ╰──────────────────────────────────────╯ mcp: titan · browser_*, titan_do, titan_panes > open the timer in the browser beside me
claudeIn a Titan shell, claude starts with Titan's hooks and tools added for that run only, never written to your settings: the tab shows when it's working or waiting, the Mac stays awake while it works, and it gets the browser and titan_do tools.
With several Claude accounts, the folder picks the account, or claude --account Work does.
pomodoro ❯ pi Start the dev server beside you with titan, open it in the titan browser and click Break. $ titan do new_split direction=right command="npm run dev" $ titan browser navigate url=http://localhost:4173/ $ titan browser click ref=e3 Done.
pi needs no plugin and no MCP setup. In a Titan shell it runs titan do, titan panes and titan browser with its bash tool, and finds them from titan actions. Its status shows on the tab from the escapes pi already sends.
Titan knows pi when it sees it, even renamed to pi by node, and keeps it to the panes it opened.
pomodoro ❯ codex $ titan actions new_split direction=right|down [command=CMD] [folder=DIR] read_pane pane=ID [lines=N] titan browser <tool>: navigate, snapshot, click, type…
Any agent that can run a shell command can drive Titan the same way. Titan recognises Codex, OpenCode, Gemini, Aider, Amp, Goose, Crush and Cursor's agent by their process, or by AI_AGENT in their environment, and gives them the same pane limits as Claude.
| Claude pane | claude in a shell | pi, Codex & others | |
|---|---|---|---|
| Status on the tab, ⌘J to the waiting one | ● | ● | ● from the escapes it sends |
| Opens panes, reads them back | ● titan_do | ● titan_do | ● titan do |
| Drives the browser beside it | ● browser_* | ● browser_* | ● titan browser |
| Kept to its own panes | ● | ● | ● |
Replies set as Markdown, /diff, pages in the feed | ● | its own TUI | its own TUI |
| Keeps the Mac awake while it works | ● | ● | – |
⌘N starts a Claude Code session in a folder you pick, drawn as a conversation with an input box of its own.
↩ sends at once, and Claude takes the message in at the running turn's next step. ⌥↩ queues it for when the turn ends instead.
Shell code blocks in a reply get Run, Run in a shell and Copy. Output streams in under the block. Nothing runs without the click.
/diff and /git open a side pane with every file changed since the session started, plus git status, recent commits and stashes.
File paths and URLs in the feed are clickable. A file opens beside the pane at its line, in a built-in viewer or your $EDITOR.
HTML and SVG files Claude writes show up in the conversation as live pages. A mermaid block is drawn as a diagram, in the theme's colours.
⇧⌘N starts a session in a git worktree of its own, so two sessions can work on one repository without stepping on each other.
A model picker, an effort slider and a ring for how full the context window is. Permission modes run from asking every time to YOLO.
@ fuzzy-finds files to mention. / lists the commands and skills installed for that session, with their descriptions.
Paste or drop images and files into a conversation, or drop them on a tab: a Claude session attaches them, a shell types their paths.
/diff: everything the session changed
Every command in Titan is a named action. Bind it to a key, run it from a shell with titan do, or let an agent run it.
Pick an action to see each way to call it, and what Titan answers.
Needs remote-control = true in the config, except titan browser. titan actions lists every action, titan panes what's open.
An agent can use the panes it opened and the ones you grant it. For any other shell, Titan asks you first, so an agent that was talked into it can't type into your ssh session or a shell with sudo still warm. Try it: pick a mode, then have pi type into each pane.
Click a pane to have pi type into it.
An agent drives the browser pane beside the pane it runs in, not another conversation's. Agents' browser panes keep cookies apart from yours, so an agent never browses signed in as you.
Titan reads which pane an agent belongs to from the agent's own process, not from what a request claims, so pointing TITAN_PANE at another pane gains nothing.
A pane an agent types into or reads shows a badge for a moment, and Show Remote Control Log lists the last 200 requests: who, what, which pane, and what you said.
~/.config/titan/config, every setting written out and commented on first launch. Titan reads your Ghostty config first, so your font and theme carry over.Same syntax as Ghostty's: key = value, one per line. Anything you leave out keeps its default.
The defaults. Every one can be rebound, removed or turned into a sequence with keybind, and the menus show the new key as soon as you save.
The same VT core as Ghostty, drawn with Metal. Improvements upstream arrive as a rebuild, not a rewrite.
⌘D and ⇧⌘D split, ⇧⌘↩ expands a pane, and a grip shows on the divider as you drag it. Drag panes onto tabs, tabs out into windows.
Saved setups of shells and a browser in the config. They ask for what they need, a branch or a port, then open everything beside the pane you're in.
The Kitty graphics protocol: kitty icat, yazi and ranger previews, chafa, image.nvim. titan diagram draws a Mermaid file right in the shell.
A dev server an agent backgrounded, a nohup from a pane you closed: Running in Background finds them, with their ports, and stops them.
Map folders to Claude accounts and each session opens under the right one, its history kept apart. Continue a session under the other account in one click.
titan command (titan do, titan panes, titan browser), and Titan keeps them to their own panes as it does Claude. The Claude pane itself is for Claude Code.remote-control = true.~/.claude/projects. Titan reads them for its history list and to resume sessions, and they work in the plain claude TUI as well.