One engine, two apps
The features the terminal and desktop apps share, and the ones only one app has.
The terminal app (zidane) and the desktop app run the same chat engine and read the same sessions, sign-ins, settings and safelist, so you can switch between them in one project. For one app's controls and keys, see the terminal app or the desktop app.
With the daemon on (off by default, turn it on), the apps also share live state: a run started in one shows live in the other and keeps going when you close the window.
One engine#
createChatHost from zidane/chat is the chat engine both apps embed. It runs sessions, runs, the queue, approvals, MCP servers, models and their fallbacks, skills, todos, terminals and compaction. The engine lives in a host, the process that owns your sessions and runs. Each window connects to one host: its own process (default), the local daemon, or a zidane-server (the three hosts, server clients).
| Shared | What |
|---|---|
| Always, through files | Sessions (sessions.db), provider sign-ins, MCP sign-ins and servers, keybindings, saved hosts, the safelist, the agent settings in state.json |
| Live, only with the daemon | Running transcripts, approvals, the queue, todos, artifacts, terminals, drafts, presence (what the daemon shares) |
| Never | Each app's look and layout (terminal themes, desktop appearance) |
What each app has#
| Feature | Terminal | Desktop | Notes |
|---|---|---|---|
| Sessions: search, fork, favorite, delete, spaces, export, compact now | Yes | Yes | Sessions. Search in both apps also scans what sessions say. |
| Rename, archive | No (generate a title instead) | Yes | Both generate a title on demand |
| Transcript density, thinking, tool display | Yes | Yes | Per app, see display settings |
| Inline edit diffs | Yes | Yes | The terminal also has a compact diff mode |
| Diffs panel with review comments | No | Yes | |
| Artifacts | Rail and modal | Panel | |
| Files explorer, editor, language servers | No | Yes | |
| Integrated terminal | No (! shell mode instead) | Yes, needs the daemon | |
| Dev browser for you and the agent | No | Yes | |
| Approvals, file-edit hunks, safelist | Yes | Yes | See approvals |
Plans and questions (present_plan, ask_user) | Inline blocks | Inbox tab and cards | |
| Todos | Modal | Panel tab | |
| Command palette | CtrlShiftP | CmdK | One shared command list |
/ commands | /help, /refresh, /cache, /reload, files, extensions | /help, /refresh, /cache, files, extensions | See commands |
! shell mode | Yes | Yes | |
@ files, # chats and artifacts | Yes | Yes | |
| Keybindings | Same file. Settings lists the keys and opens the file. | Same file. Settings opens the file and has Reload. | |
| Model picker with a fallback chain | Yes | Yes | The host runs the fallback (providers) |
| Effort and model options | Yes | Yes | Thinking levels |
| Agent profiles | ShiftTab cycles | ShiftCmdI cycles | A switch keeps the prompt cache when the profile fits the session's agent (profiles) |
| MCP servers and sign-in | Yes, with pasted callback over SSH | Yes, with Test all and Rescan | MCP |
| Skills, extensions, plugins | Install, remove, create | Install, remove, create | Skills, extensions |
| Import from Claude Code | Yes | Yes | See below |
| Environments (local, sandbox, worktree, Docker, E2B, Daytona) | Yes | Yes | Execution contexts |
| Git bar and branch sync | No | Yes | |
| Themes | 10 built-in, plus extension themes | Mode, accent, fonts, motion | Separate systems |
| Plan usage panel | CtrlP | Modal and welcome screen | Plan usage |
| Context breakdown | CtrlShiftG | The context orb | |
| Remote hosts, machines, settings sync | Yes | Yes | Off by default |
| Daemon on or off, its status | Setting and footer dot | Setting and daemon menu | The daemon |
| Main session | CtrlShiftM | Yes | Needs the daemon |
| Who else is looking at a session | Yes | Yes | Needs the daemon |
| Attention signals | Terminal tab title icon | Status dots, Inbox badges, and OS notifications when on | |
| Attachments and image paste | Yes | Yes | Limits differ per app |
| Queue and steer | Yes | Yes | See queue and steer |
Write the prompt in $EDITOR | CtrlG | No | The desktop app has its own editor |
| Several windows | One window per process | Yes | |
| Extension panels and status lines | Panels, status line, banner | Panels, session statuses and composer badges | Extensions |
| Updates | zidane upgrade | Every 6 hours, updates both apps |
Sessions#
Both apps run session operations on the host, so a fork or edit in one shows in the other.
| You can | How it works |
|---|---|
| Resume the last session | Start from last session (on by default) opens it at launch |
| See sessions from every project | All projects (off by default, so the list shows only the current project) |
| Fork from a message | A new session with the turns up to that message |
| Edit or delete a turn | Rewrites the saved history from that turn |
| Favorite or archive a session | Archive is desktop only |
| Group sessions in spaces | Turn on Spaces. Each space keeps its own default model. |
| Export | Markdown or JSON |
| Title a session | On demand in both apps, or automatically with automatic titles |
| Compact now | Summarizes the history to free context. See compaction. |
| Run a Main session | One session that drives the others. See Main session. |
Where each control sits: terminal sessions, desktop sidebar.
Settings#
Both apps keep settings in one state.json on this computer (where). There are two kinds:
| Kind | Examples | With the daemon or a server |
|---|---|---|
| Agent settings | Tool approvals, sandbox, run limits, compaction, enabled skills, MCP servers and extensions | The host owns them. A change in one window applies to every window on that host. |
| Window settings | Theme, display settings, editor habits, spaces list, default model and effort, the daemon setting, Remote hosts | Stay with this computer, whatever the host |
When a session runs on a zidane-server, Settings edits that server's agent settings. Settings sync can copy your agent settings to a server. Every row, per app: terminal settings, desktop settings.
Display settings#
These window settings change how a transcript looks, never what the agent does. Desktop: Settings › Interface (Conversation and Tool activity). Terminal: Settings › UI › Transcript.
| Setting | Key | Default | Does |
|---|---|---|---|
| Transcript density | transcriptDensity | compact | compact folds each exchange's work into one row |
| Row icons | showRowIcons | on | An icon next to each message and step (desktop) |
| Tool calls display | toolCallDisplay | formatted | full shows the raw input, hidden hides tool calls |
| Thinking blocks | showThinking | on | Shows the agent's reasoning |
| Tool outputs | showToolResults | on | Shows the output under each tool call |
| Group tool calls | groupToolCalls | on | Folds each exchange's tool calls into one row |
| Hide subagent output | hideSubagentOutput | on | Folds subagent runs to their start and finish lines |
| Edit diffs | showEditDiffs | on | Shows file edits as diffs |
| Edit diff density | editDiffDisplay | full | compact shows one line per hunk (terminal) |
| Full shell output | showFullShellOutput | off | Shows every line of ! output, not the last 10 |
| Run receipt | showRunReceipt | on | Agent, model, time, cost and tokens after each run |
| Tool attachments | showToolAttachments | on | Gathers the images tool calls return under the Working block (desktop, compact density) |
| Cache notices | showCacheNotices | off | A row when the prompt cache expires or resets, or the provider drops earlier reasoning |
| Compaction summaries | showCompactionSummary | off | The summary text under the compaction line (terminal) |
| Smooth streaming | smoothStreaming | on | Reveals replies character by character |
| Diagrams | renderDiagrams | on | Draws Mermaid code blocks in replies as diagrams (desktop and web app; the terminal shows the code) |
How each app draws them: terminal chat, desktop transcript.
Queue and steer#
Settings › Composer › Messages during a run decides what happens to a message that you send while the agent works. Queuing (the default) keeps it in the queue until the run ends. Steering sends it into the run: the agent reads it after its current step. Images and files go with it either way. AltEnter sends one message the other way. A / command always waits in the queue. In the terminal app, CtrlEnter on a queued message steers it now. The setup wizard asks for this choice in its Conversation step.
The host owns the queue, so with the daemon every window shows the same queued messages. SDK side (steer, followUp): run control.
Commands and mentions#
| Type | Does |
|---|---|
/name | Runs a command: built-in, from an extension, or from a Markdown file. See commands. |
@path | Attaches a file or folder |
# | Points at another chat or an artifact, so the agent can read it |
!command | Runs a shell command yourself. The agent sees the output. |
The prompt keys for each app: terminal prompt, desktop composer.
Import from Claude Code#
When ~/.claude exists, both apps offer Import from Claude Code (terminal: an action row in the Agent tab of Settings. Desktop: a Settings action). You pick what to bring over: conversations (this project or every project), MCP servers, skills, and commands with subagents.
The import writes only to the session store and .zidane/ files. It never touches ~/.claude, and a second run skips what it already imported. It leaves out CLAUDE.md (zidane reads it in place, see rule files) and Claude Code permissions and hooks, which have no zidane equivalent.
To use another agent's configuration without copying it, turn on "Import configurations from other agents" (off by default). "Support Ruler configuration (.ruler)" (on by default) reads .ruler/ folders. What each adds: MCP, skills.