Skip to content

Chats

The chat list: status, grouping, sorting, filters, pins, labels, hover details, subagents, bulk actions, the chat menu.

Last updated

Hover a shortened chat title to read its full name in a tooltip.

The Chats tab lists Claude Code sessions and Codex threads from both apps in one list. Each row shows the app icon (with the chat's status on it), the chat title, the time since the last activity, and a dot when it's unread (white in dark mode, black in light). Titles of chats that need you or are unread are a little bolder.

How much a row shows is Density in Settings → Look (or ⌘K → "Density: …"):

DensityA row shows
Comfortableone line: the title, the status on the icon, the time on the right. Rest the pointer on a row for its details
Detailed (to start with)the title and a second line under it: what the chat is asking or doing, or its project or branch

While you search, rows that matched inside the conversation show the matching words on a second line at either density.

It also lists your cloud chats: Claude Code sessions running in Anthropic's cloud and Codex cloud tasks. See Cloud chats.

Status#

MarkMeaningSecond line (Detailed)
orange ? on the iconNeeds you: waiting for your answer or a permissionthe question it's asking
green dot on the iconWorkingwhat it's doing ("Bash · git push", "Edit · Store.swift")
dot on the rightUnread: finished or asked something since you last opened it–

Chats that need you always appear first, in a Needs you section.

Shell commands are shown only as the program and its subcommand (e.g. git push), never with arguments, which could contain passwords.

How the status is worked out#

Pairbar reads the status from files the apps already write; nothing is installed in Claude or Codex unless you turn on live status.

  • Claude, with live status on (Settings → Integrations, see Integrations): Claude tells Pairbar each prompt, tool call, permission request and stop as it happens, so the status and the tool it's running change at once. This comes first while nothing newer contradicts it: when Claude's record below or the conversation changes after the last event (a prompt you approved, a turn you interrupted), or a working chat has sent nothing for 10 minutes, the files decide again.

  • Claude, while its chat is running: Claude Code keeps a small record of each running session in ~/.claude/sessions, saying whether it's busy, idle, or waiting on you (a permission prompt, a question, a dialog). Pairbar trusts that record first. That's how a chat waiting for you to allow a shell command shows Needs you ("Bash · git push"), and how a long build that writes nothing for minutes stays Working.

  • Otherwise, the conversation itself: the last thing it did. A question or a plan to approve is Needs you at once. A quick tool that got no answer (an edit, a file read) counts as a permission prompt after about 12 seconds, a tool from an MCP server after about 20 (it may just be slow). Without Claude's record, a shell command or a subagent is never guessed to be a prompt, since they can run for minutes. A chat that stopped mid-turn and hasn't written anything for 5 minutes is no longer shown as Working.

  • Codex, with live status for Codex on (see Integrations): Codex tells Pairbar each prompt, command, approval request and stop, so a thread asking you to approve something shows Needs you at once (its transcript never says so). As for Claude, this comes first until the transcript is written after it.

  • Codex: from each thread's own transcript, wherever it is: a thread you resumed days later keeps writing the file of the day it started, and Pairbar finds it through Codex's database.

When they disagree, Needs you wins over Working, and Working over finished. The exception is Claude saying the chat is idle: then nothing runs and nothing is asked, whatever the conversation looks like.

A chat that needs you stays in Needs you until you answer it: with Claude's record, until the prompt is answered or the chat's Claude process ends (then nothing can be answered any more); without it (Codex, or an older Claude), for up to 7 days. Other chats drop their status 45 minutes after their last activity.

While a chat is working, its branch is the one it's on now: what Claude last recorded in the conversation, or the branch checked out in a Codex thread's own worktree. So a git checkout mid-chat moves it to the right task.

The focused chat's context#

When Claude or Codex shows a chat, Pairbar knows what it's about: its project, its branch or worktree, its PR and the task it belongs to. A small card at the top of the list says so, and offers what fits there: skills, agents, workflows and quick actions. It follows the chat the app shows (the one you click in Pairbar or in the app, and ⌃1–9), and changes in place as you switch chats: every row keeps one line, so the list under it doesn't jump. It makes way while you search.

The line (Settings → Chats & sidebar → Show the context as: Compact line, to start with):

  • the app, the project and the branch (without its claude/ or codex/ prefix; hover for all of it);
  • the task's first suggestion as a chip (Fix, Review, Finish, Archive): a click opens its plan, as on the task's row (see Suggestions);
  • the PR's number in GitHub's colours, with its checks (✓, ✕, 🕘): a click opens it;
  • an orange dot when another chat of the same task needs you, a gauge when a plan limit is low;
  • ⌄ unfolds the card (⌃ folds it back). Pairbar remembers which.

The card (Show the context as: Card) adds one line each:

RowShows
Taskthe task's name and what matters most about its PR (Checks failed, Review requested, Checks running or passed, or merged); for a chat on main (or no branch): "Not a task: Acme-Backend's main chats"
Skillsthe skills that fit here, best first (see below); as many as fit, then +N for the rest. Click one: Insert into a new message, Open in Skills
Agentsyour agents that fit this project. Click one: Run on this branch…, Open in Agents
Dothe quick actions that apply to this chat (below)
Nowwhat needs a look: a plan limit under 20 % ("Codex 12% left"), subagents running ("3 running": a click unfolds them under the chat and opens the newest one in the transcript reader), and each other chat of the task that needs you (a click opens it). "Nothing needs a look" otherwise

Turn it off with Settings → Chats & sidebar → Show context for the focused chat.

Skills for here#

Only skills the chat's app loads in the chat's folder are offered (see Where they come from), in this order:

  1. the project's own skills (its .claude/skills for Claude, .agents/skills for Codex);
  2. skills already used here: named by a workflow that runs in this project, or by an agent of this project;
  3. skills whose name or description shares a word with the chat's title or branch ("Fix login redirect" on claude/fix-login-1a2b: fix, login, redirect; short and common words, app names and the random ids tools add to branches don't count).

At most six, ties by name. It's plain word matching done on your Mac: nothing is sent to a model. Hover a skill for why it's there ("Acme-Backend's own skill", "Used by “Nightly”", "Matches login").

Insert into a new message opens the composer for a new chat in the same app and folder, with the skill asked for the app's way: "Use the backend-release skill to " for Claude, "$backend-release " for Codex. You finish the sentence and press Send.

Agents for here#

Your agents that belong to the project (in its .claude/agents, or set to it with repo: in dock.yaml), or that use a skill that fits here; at most four, the project's own first (reviewers first when there's a PR). Agents are Claude's, so none show without the Claude app.

Run on this branch… opens a plan: the composer for a new Claude chat with that agent in the chat's folder, its first command filled in with the PR's link (or the branch and folder). Open composer opens it; nothing is sent until you press Send there.

Quick actions#

ActionWhen it's offeredWhat it does
Second opinion from Codex (or Claude)a chat on your Mac in a task (a branch or worktree, not main), and the other app installedthe Tasks review plan: Codex starts reading the branch at once, read-only; Claude opens with the prompt typed in. Only after Approve
Hand off to Codex (or Claude)a chat on your Mac, and the other app installedthe handoff: the composer for the other app, with the conversation attached
Forka chat on your Macthe fork's composer
Open with “…” in basketthe task has a chat on your Mac in the other appopens that chat, then this one, and docks them side by side in the basket
Run a workflow here (▷)a workflow runs in this project (its folder is this repository)a menu of them; each opens a plan, and Run now runs it as the Workflows tab's Run now does (it uses your plan limits, and its run shows in Workflows)
Copy branch or PR linkthe chat has a branch, or its task a PRa menu: Copy branch, Copy PR link

A plan opens above the search field in any grouping, the same sheet as Tasks: Approve (⌘↩) or Decline, then what it did.

In ⌘K, the same actions come first, as "For this chat: …".

How it's worked out#

The card reads what Pairbar already has: the chat list, the task's other chats, the PR lookup the Tasks view makes (gh), your Skill Library, agents and workflows. It's worked out in the background when the chat changes (or something it reads does) and kept for the last 40 chats, so switching back is instant. It reads no new files and sends nothing.

Row badges#

  • PR icon, colour-coded like GitHub: open, draft, merged, closed. Click it to open the PR.
  • Subagents chip (👥 3): subagents running inside this chat. See Subagents.
  • Label dots: your labels.
  • 📌 pinned, ⟳ being checked in on, 👁‍🗨 hidden (when showing hidden chats).
  • ☁︎ on the app icon: a cloud chat.

Grouping, sorting, filtering#

The bar under the search field wraps its controls onto another line when the sidebar is narrow. App names and the current label stay visible; the grouping menu remains at the right.

  • All · Claude · Codex filters by app. Each app chip also shows its state:

    • dimmed with an orange ⏻ when the app isn't running (click ⏻ to open it);
    • Get Codex ↓ when it isn't installed.

    Grouped by Tasks, these chips make way for the Tasks view's own filter bar (stage, apps, project, sort), which filters whole tasks.

  • Group by: project, tasks (the chats on one branch or worktree, by where the work stands), app, status, date, label, or none.

  • Sort by: most recent, name, or status (needs you first).

  • Label filter, when you use labels.

  • Show hidden chats. This includes Claude’s one-time workflow planning and editing helpers, which Pairbar hides automatically. Choose Unhide to restore one.

  • Expand or collapse all groups.

A collapsed group still shows its most urgent chats as a coloured count with text, such as 3 need you or 2 working. Group names wrap in full; below 280 points the total and activity move beneath the name. The project’s New chat action stays at the right of that summary, and appears on hover or when VoiceOver is enabled. Groups show their first rows, with Show all for the rest.

While the pointer is over the list, rows don't jump around. New order is applied when the pointer leaves.

Opening a chat#

Click a row to open the chat in its app. ⌃1–9 opens the first nine chats on screen.

The chat menu#

Click ⋯ on a row, right-click it, or Control-click it. Menus can extend beyond a narrow sidebar so submenu actions stay readable. With VoiceOver, ⋯ stays visible. While the menu is open, single keys work as shortcuts; arrow keys navigate submenus and Esc closes them.

ItemKeyWhat it does
Open in ›OClaude/Codex, Finder, your editors and terminals, the chat's pull requests
Pin / UnpinPkeeps it in a Pinned section at the top (drag pinned chats to reorder)
Mark as unread / readU
Rename…RCodex chats: renamed in Codex itself. Claude chats: a name shown in Pairbar only, plus how to rename it in Claude (see Renaming)
Send message…Msee Working across chats
Check in every… / Manage check-in…Ksee Workflows → Check-ins
Copy linkCa claude:// or codex:// link to the chat
Continue ›F, Hfork from latest, fork from a message, hand off to the other app
Agents ›ask one of your agents about this chat (each agent's commands, or Just start); turn it into an agent; teach an agent from it; All agents
Labels ›toggle labels, or New label…
SelectSstart selecting chats for bulk actions
More ›show subagents, copy path, Copy branch, Copy ID
ArchiveACodex only: moves it to Codex's archive (you can unarchive it in Codex)
Hide / UnhideDhides it from Pairbar only; undo with "Show hidden chats"

A cloud chat's menu is shorter: Open in Claude (Claude cloud sessions, when the Claude app is installed), Open in browser, Pin, Mark as unread / read, Rename… (in Pairbar only: the title lives on the service), Copy link (the claude.ai or chatgpt.com page), Labels, Select and Hide. Marking read and selecting use the same Pairbar metadata as local chats. The rest needs the chat's files on your Mac.

Renaming#

In Rename… and New label…, the save button stays disabled while the field is empty or contains only spaces. Cancel leaves the chat unchanged.

What Rename… changes depends on the app, and the dialog says which before you confirm:

ChatWhat happens
Codex (on your Mac)"Renames it in Codex too.": Codex's own title changes, through your codex command-line tool (its app server's thread/name/set, the same request the Codex app makes). Codex stores it, so it shows in codex resume and in the Codex app, which picks it up the next time it reloads its chat list (at the latest when you reopen it). Pairbar says Renamed in Codex.
Codex, when that can't be donean older codex without an app server, no codex installed, or Codex refusing (the reason is under Details): the name is kept in Pairbar only, and the notice says so
Claude (on your Mac)"Shown in Pairbar only; Claude keeps its own title.": Claude has no way for another app to rename its chats. A card explains how to do it in Claude (open the chat with Open in Claude, then in Claude's sidebar hover over it, click ⋯ or right-click it, and choose Rename)
Cloud chats (both apps)a name in Pairbar only; the title on claude.ai or chatgpt.com doesn't change

A name kept in Pairbar shows in the list and search; the hover card adds "Renamed in Pairbar · Claude calls it “…”" with the app's own title. Settings → About & advanced → Reset Pairbar… forgets these names. A Codex chat renamed in Codex drops any name Pairbar kept for it.

Pins, unread marks, labels and hiding are Pairbar's own and never change the apps: neither app offers another app a way to pin or mark its chats. (Codex chats you pinned in Codex show as pinned in Pairbar too.) Archive on a Codex chat moves the thread into Codex's own archive; Claude chats can only be archived in Claude. If Codex still holds a chat open for writing, Pairbar shows Archive this chat in Codex with Open in Codex. Archive it there, or close it there and retry in Pairbar. A batch reports how many chats were archived and retains each failure.

Details on hover#

Hover previews open only while the pointer is over the visible chat window. Notes, menus and other windows covering a row prevent its delayed preview from opening.

Rest the pointer on a chat for a moment and a card shows:

  • the question or current action;
  • the search match;
  • project and branch, with commits ahead and behind;
  • size of the diff against the default branch, and uncommitted changes;
  • the PR number, state, checks passed or failing, and review decision;
  • subagents, labels, and the last activity;
  • for a chat renamed in Pairbar only, the app's own title.

It never appears while a menu is open, and can be turned off in Settings.

Cloud chats#

Chats that run on Anthropic's or OpenAI's servers instead of your Mac appear in the list with a ☁︎ on their app icon, grouped with your local chats of the same repo (or under Cloud when they have none).

Claude Code cloud sessionsCodex cloud tasks
Where Pairbar finds themthe Claude app's own cache of its Code sessions list, on your Mac (read-only)codex cloud list, through your own codex and its login
When the list updateswhen the Claude app updates its cache (it does while it's open), within a few secondsat most every 5 minutes, and only while the sidebar is showing
StatusNeeds you (waiting for your answer, for up to a day), Working (while the app's copy is recent), finishedWorking (pending), waiting for you (ready to apply), finished (applied)
Clicking opensthe session in the Claude app (claude://code/session_…); the claude.ai page without the appthe task's page on chatgpt.com

Limits:

  • A cloud session shows only after the Claude app has loaded its Code sessions list at least once (open Code in the Claude app), and it's as current as the app's copy. Sessions you run through Remote Control are your Mac's own chats and are listed once, as local chats.
  • There's no transcript on your Mac, so no question text, current action, conversation search, subagents, handoff, fork, follow-up or check-in for cloud chats, and no alert when one needs you.
  • If the app's cache can't be read (a newer format, a file mid-write), cloud sessions are simply left out; local chats are unaffected.

Subagents#

Claude Code subagents (the Task tool) and Codex's spawned threads appear under their chat, tied to it by a thin line from its icon:

  • Chip: the 👥 chip shows how many are working now. Click it, or choose Show subagents from the menu.
  • Summary: chips for how many are running (green), needs you, failed (red), stopped and done, and the tokens the subagents used (hover it for their share of the chat's).
  • Rows: each shows a dot for how it's going, its job, its type, how long it has been running ("56s", "5h") or how long it took, and a second line: what it's doing now, the first line of its answer when it's done, or why it failed. Hover a row to see its model.
  • Order: running first, then failed and stopped, then done, newest first. A subagent that started its own subagents has them indented under it.
  • Done ones fold behind Show N done (and Hide N done); Pairbar remembers this for each chat.
  • Outcomes: Done is a finished answer; Failed is an error (with the reason, such as an API error or an unknown agent type), including a call that failed before the subagent started; Stopped is one you interrupted, or one cut off when its chat stopped.
  • Background subagents (started with Claude's "run in background") show as running until they report back.
  • Questions: a subagent that's waiting for you makes its parent chat show Needs you.
  • Codex subagents open in their own thread when clicked.

Hover card#

Rest the pointer on a subagent (with "Details when the pointer rests on a chat" on) for a small card: its status, model and time, the tokens it used and its share of the chat's, how many tool calls it made, and what it's doing or found. Open transcript opens the reader; Copy result copies its whole answer.

The transcript reader#

Click a subagent (or choose Open transcript from its menu or hover card) to read it in a panel beside the sidebar. It opens at the result for a done subagent, follows along for a running one, and at the top otherwise. Drag its edges to resize it; it keeps the size.

  • Header: the title, a status chip, type, model, how long it ran (counting while it runs), tokens (in, out, cache) and when it started, with Show in chat, Copy result and Copy all (the whole transcript as Markdown).
  • Brief: the task it was given, folded to three lines (Show more). Long paths are shortened (~ for your home folder, the middle cut out); hover the brief for them in full.
  • Steps: one line per tool call with an icon: "Read · Sources/…/Activity.swift", "Bash · swift test …", "WebFetch · code.claude.com/docs/…", "Edit · ChatStatus.swift (+24 −3)". Click one (or select it with ↑↓ and press ↩) to open its output or diff, the first lines until Show full. Reads in a row fold into "Read N files"; what the subagent said between steps reads as text; a step that started its own subagent opens to that subagent's steps.
  • Result: its final answer, set apart at the bottom, with Copy.
  • Live: while it runs, new steps scroll into view and the step it's on shimmers. Scroll up and it stops following; Jump to latest brings you back.
  • Search: ⌘F searches the brief, the steps, their output and the result; ↩ or the arrows go to the next or previous match.
  • Esc closes the search, then the reader.

The reader only reads the subagent's transcript on your Mac. Commands show as their program and subcommand ("npm test …"), links as their site and path, never their query.

Show in chat opens the chat that started the subagent in Claude (the app's links can't point at a message, so the chat opens where it is). Copy result is also in each subagent's menu, with Reveal transcript in Finder.

Alerts#

With Subagent finished or failed on (Settings → Notifications, off to start with), Pairbar shows a banner when a subagent finishes or fails while you're in another app, following the Claude chats and Codex chats switches. See Settings.

Labels#

Your own tags ("review", "blocked", "today"…), set from the chat menu or the bulk bar. Group by label, or filter to one label from the view menu or ⌘K. Workflow runs in Codex get a "workflow" label automatically.

Selecting several chats#

⇧-click a chat (or Select in its menu) to start selecting. After that, a plain click adds or removes a chat, and ⇧-click selects a range. A bar at the bottom offers Pin, Read, Unread, Label, Hide, Archive (Codex chats) and Done. The selection count and Done share a header, with the selection hint below; actions wrap to fit a narrow sidebar.

Empty list#

When no chats match an app or label filter, No chats match your filters offers Clear filters, which resets the app and label filters. A list containing only pinned chats still counts as nonempty.

With no coding chats yet, the list explains that regular Claude chats stay in Claude's own sidebar (hold ⌥ to see them) and offers Start a chat.

Action messages in narrow sidebars keep their full headline visible. Actions such as Undo and Details wrap below it instead of squeezing the message text.