ConcordDownload

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.

panel-drag-judderResize handle oscillates against its own translationworking
YouToday at 14:02
E

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.

Claude CodeToday at 14:02claude-opus-5
ReadViews/PanelResize.swift118 lines0.3s
GrepviewportResized6 matches0.4s

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.

Views/PanelResize.swift+4 2
@@ -38,9 +38,11 @@ struct ResizeHandle
3838 private var drag: some Gesture {
39 DragGesture(minimumDistance: 0)
40 .onChanged { width += $0.translation.width }
39+ // Local space moves with the edge being
40+ // dragged: the translation fights itself.
41+ DragGesture(coordinateSpace: .global)
42+ .onChanged { width = base + travel($0) }
4143 .onEnded { _ in base = width }
EditViews/PanelResize.swiftedited1.1s
Runswift build -c releaseexit 011.8s

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.

Why global and not local space?4 replies12m
Claude Opus 5Auto-accept edits74.3k / 1.0M

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.

EditViews/PanelResize.swiftrunning

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.

EditViews/PanelResize.swiftedited1.1s
Claude Code needs a decision

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.

Send answerAnswer in my own wordspick one

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.

panel-drag-judderResize handle oscillates against its own translation
Claude CodeToday at 14:02claude-opus-5

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.

EditViews/PanelResize.swiftedited1.1s
Message #panel-drag-judder, or # another session
Claude Opus 5Auto-accept edits74.3k / 1.0M

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.

gpt-5.2-codexAsk on writes12.1k / 400k

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.

ThreadChanges1Context

Views1

MPanelResize.swift+42
+42in 1 fileRevert allCommit

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.

Run a command, jump to a session…esc

Commands

New sessionIn concord, on main⌘N
Search everywhereEvery transcript on disk⇧⌘F
Toggle inspectorThreads, changes and context⌥⌘B

Sessions

review-uncommittedCodex · concord · needs you
panel-drag-judderClaude Code · concord · working
sse-reconnect-backoffopencode · concord · 3h ago

Projects

atlas-apiperf/pool · 9 changed⌘2
navigate run7 results

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.

Runswift test --filter Transcriptrunning
Message #panel-drag-judder, or # another session
Claude Opus 5Auto-accept edits72.0k / 200k

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.

0.6s

to open a 36 MB session with 9,000 rows.

0.5s

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.