The divider judders while I drag the right panel edge. Read PanelResize.swift and the transcript controller before you change anything, and tell me the cause first.
Built for Claude Code, Codex and opencode
Your coding agents, in one window.
A macOS app for managing Claude Code, Codex and opencode sessions in one Discord-style window. Projects in a rail, sessions as channels, and diffs, shell output and approvals in the transcript.
The handle measures its drag with the default local translation, and it is a child of the edge it is dragging. Every frame the translation is partly cancelled by the effect of the frame before it, so the divider oscillates around the pointer. Measuring in .global removes the feedback.
@@ -38,9 +38,11 @@ struct ResizeHandle3838private var drag: some Gesture {39− DragGesture(minimumDistance: 0)40− .onChanged { width += $0.translation.width }39+ // Local space moves with the edge being40+ // dragged: the translation fights itself.41+ DragGesture(coordinateSpace: .global)42+ .onChanged { width = base + travel($0) }4143.onEnded { _ in base = width }
Fixed and built. Row reframing was the second half of it, so I also froze the measured row width for the length of a drag and let it settle 90 ms after the pointer stops.
Three harnesses, one seam
Concord speaks each agent’s own protocol.
Each harness is driven over its own interface. Approvals, models, slash commands and cost come through as that harness reports them.
Claude Code
Uses the claude command already installed. Permission prompts appear as cards in the transcript and are answered there.
Codex
Uses the codex command already installed. Threads, approvals and /review work the same way they do in the terminal.
opencode
Uses the opencode command already installed. One local server per project, with every session streamed live.
Reading
Diffs, code and shell output, each with its own renderer.
Diffs render with both line-number gutters and word-level highlights. Code blocks are syntax-highlighted. Shell commands show their exit status above their output.
Every block is a real text view. Select across a diff and copy it.
Approvals
Permission requests are answered in the transcript.
A request to run a command or write outside the working tree arrives as a card where the agent is working. Allow it once, deny it, or allow it for the rest of the session.
Session grants are written in the harness’s own format: a permission rule for Claude Code, an accepted-for-session approval for Codex.
Run the release build now to confirm the jitter is gone?
Yes, run it
swift build -c release && ./run.sh release — takes about 40s.
Later
Leave the build for a separate pass and keep working on the rows.
Live
Terminal sessions appear in the sidebar as they run.
Concord watches the directories the CLIs write to. A session started in a terminal appears within half a second and streams as the file grows.
A dot on each row shows whether the session is working, waiting on you, or done.
Threads
Branch a thread from any turn.
Hover a turn and branch it. The thread opens in place with the session history up to that point, so a side question does not need re-briefing and does not clutter the main conversation.
The parent turn shows a reply count, threads are listed under the session in the sidebar, and each thread has its own draft.
The handle measures its drag in local space, and it is a child of the edge it is dragging. Measuring in .global removes the feedback.
References
Reference another session with #.
A session can be referenced from the composer. Its transcript is exported to markdown and the path is passed to the agent, so Codex can read what Claude Code did.
During a turn
What the window shows while the agent is working.
The agent reads files, asks questions and uses context while it works. Each of those has its own panel or row.
Changed files
Changed files, diffs and commits in one panel.
Every file the session touched, grouped by directory, with a bar sized against the busiest file. Open a row for its diff. Revert one file or all of them.
Commit from the footer with a message. The panel clears when the commit lands.
Views1
Command palette
One field for every session, project and command.
The palette searches sessions, threads, projects and commands together, ranked by what you used last. A second mode searches the text of every transcript on disk.
Commands
Sessions
Projects
Context
Context usage under the composer, and /compact.
A meter shows how much of the context window is in use. It turns amber past 60% and red past 85%.
Typing /compact asks the harness to summarise the conversation so far. The meter drops back.
Speed
Sessions open in under a second at any length.
A day of Claude Code can leave a session file tens of megabytes long. Concord opens it in under a second and stays responsive however long it gets.
to open a 36 MB session with 9,000 rows.
for a session started in the terminal to appear in the sidebar.
More
Also in the window.
Command palette
One search across sessions, projects, commands and the text of every transcript.
Slash commands
The commands each harness supports, including your own command files, skills and plugins.
Model picker
Change the model or reasoning effort mid-session. The list is whatever the CLI reports.
File and session mentions
Mention a file from the project tree or another session, and the agent gets the path or the transcript.
Image drops
Drop or paste screenshots and files into the composer to send them with the message.
Changed files
A panel listing every file the session changed, with diffs, revert, and commit.
Permission modes
Ask on writes, accept edits, or full access. Set per session, with a default per harness.
Inbox
One list of every session that finished or is waiting on you, across all projects. Also a dock badge and a macOS notification.
Keyboard first
Every action has a shortcut: switching sessions and projects, approving, rejecting, threads and panels.
Questions
Before you download.
Does Concord replace the CLIs?
No, it drives them. Concord launches claude, codex and opencode from your PATH and talks to each over the interface it already exposes. Whatever you have installed, configured and authenticated is what runs.
Can I keep working in the terminal?
Yes, and the two stay in sync. Concord watches the directories the CLIs write their sessions to, so a run you start in a terminal appears in the sidebar and streams as it grows. You can pick it up in the window and reply from there.
What happens to a run if I quit the app?
A session the app started ends with the app, the same as closing a terminal. Everything already written stays on disk, so reopening Concord brings the transcript back and you can resume the session from where it stopped.
Which models can I use?
Whichever your harness offers. The model picker is populated from what each CLI reports rather than a list baked into the app, so new models appear as soon as the tool knows about them.
Can I run more than one agent on the same project?
Yes. Sessions are per project, not per tool, so Claude Code and Codex can work in the same repository at once and both appear under it in the sidebar. The changes panel shows what each of them touched.
What does it cost?
Concord is free while it is in beta. You pay whatever your agent already costs you, billed by the tool you gave your keys to.
Put every agent in the same window.
Point Concord at a project. The sessions already on disk appear in the sidebar.