Titan app icon: a spectrum infinity sign

Titan

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.

A personal project · macOS 26+ · Apple Silicon · signed and notarized · send feedback

Titan with a Claude Code session as a feed beside a shell, tabs across the top

-- see it work

Recorded in Titan, nothing staged: real Claude Code and pi sessions on a small timer app. Pick one, or let them play through.

-- why a terminal built around agents

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.

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.

Know which session needs you

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.

Sessions outlive the window

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.

-- bring your agent

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.

⌘N · New Claude Session
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.

Claude Code as a conversation

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.

Claude paneclaude in a shellpi, 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 TUIits own TUI
Keeps the Mac awake while it works●●–

-- the claude pane

⌘N starts a Claude Code session in a folder you pick, drawn as a conversation with an input box of its own.

Send while it works

↩ sends at once, and Claude takes the message in at the running turn's next step. ⌥↩ queues it for when the turn ends instead.

Run what it suggests

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.

See what changed

/diff and /git open a side pane with every file changed since the session started, plus git status, recent commits and stashes.

Every path is a link

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.

Pages and diagrams, live

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.

A worktree each

⇧⌘N starts a session in a git worktree of its own, so two sessions can work on one repository without stepping on each other.

Model, effort, context

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.

@ and /

@ fuzzy-finds files to mention. / lists the commands and skills installed for that session, with their descriptions.

Attach anything

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.

A Claude session in Titan: a reply set as Markdown, tool steps folded into one line, and a permission card asking to run a command
Replies set for reading, steps folded, permissions inline
Titan's side pane listing the files a Claude session changed, with their diffs
/diff: everything the session changed

-- titan actions

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.

    zsh · titan do
    
              

    Needs remote-control = true in the config, except titan browser. titan actions lists every action, titan panes what's open.

    -- agents keep to their panes

    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.

    remote-control =
    π pi~/code/pomodoro · the agent

    Click a pane to have pi type into it.

    Its own browser, and only that

    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.

    Known by where it started

    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 log of what it did

    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.

    -- set it up

    1. Install an agent. Claude Code for Claude panes, and pi or any other agent you like for shells. Without one, shells work as usual.
    2. Open the config with ⌘,. It's ~/.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.
    3. Save. Titan applies changes within a second, and a line it can't read shows in a bar with its line number.
    start from
    Look
    Claude pane
    Agents
    Extras
    ~/.config/titan/config
    
              

    Same syntax as Ghostty's: key = value, one per line. Anything you leave out keeps its default.

    -- keys

    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.

    -- and a real terminal

    libghostty inside

    The same VT core as Ghostty, drawn with Metal. Improvements upstream arrive as a rebuild, not a rewrite.

    Tabs and splits

    ⌘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.

    Recipes

    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.

    Images in the shell

    The Kitty graphics protocol: kitty icat, yazi and ranger previews, chafa, image.nvim. titan diagram draws a Mermaid file right in the shell.

    What's still running

    A dev server an agent backgrounded, a nohup from a pane you closed: Running in Background finds them, with their ports, and stops them.

    More than one Claude account

    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's Show All Tabs view: every tab as a tile with its panes
    ⌘E shows every tab and its panes

    -- faq

    Can I use pi or Codex instead of Claude?
    Yes. Run them in a Titan shell. They drive Titan with the 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.
    Can agents type into my shells?
    Not without asking. They can use the panes they open themselves and the ones you grant; for any other shell, Titan asks you first, and you can allow it once or for that pane. It's all off until you set remote-control = true.
    Why only macOS?
    Titan is a native Mac app: SwiftUI and AppKit for the window, Metal for drawing, Liquid Glass from macOS 26. Its terminal core, libghostty, runs elsewhere, but everything around it is written for the Mac. There are no plans for Linux or Windows.
    Can I download it?
    Yes: the latest release is a disk image, signed with a Developer ID and notarized by Apple. Open it and drag Titan to Applications. It needs macOS 26 (Tahoe) on Apple Silicon, and Claude Code for its Claude panes. Titan checks for updates once a day and installs them from the tab bar.
    Where do I send feedback?
    Titan is a personal project and I'd like to hear what you think. Open an issue on the releases repo: what works, what doesn't, what you'd want next.
    Does it need an API key?
    No. Titan runs the Claude Code that's installed, so sessions use the account it's signed in with and count against that plan as usual. pi and other agents use whatever they're set up with.
    Does it change how Claude Code behaves?
    Barely. It's the same CLI with your settings, skills and MCP servers. Titan adds a short note to the system prompt so Claude knows that pages show up in the feed, how to write paths that link, and, when you turn it on, that it can open panes.
    Where are my conversations?
    Where Claude Code keeps them, in ~/.claude/projects. Titan reads them for its history list and to resume sessions, and they work in the plain claude TUI as well.