Skip to content

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

SharedWhat
Always, through filesSessions (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 daemonRunning transcripts, approvals, the queue, todos, artifacts, terminals, drafts, presence (what the daemon shares)
NeverEach app's look and layout (terminal themes, desktop appearance)

What each app has#

FeatureTerminalDesktopNotes
Sessions: search, fork, favorite, delete, spaces, export, compact nowYesYesSessions. Search in both apps also scans what sessions say.
Rename, archiveNo (generate a title instead)YesBoth generate a title on demand
Transcript density, thinking, tool displayYesYesPer app, see display settings
Inline edit diffsYesYesThe terminal also has a compact diff mode
Diffs panel with review commentsNoYes
ArtifactsRail and modalPanel
Files explorer, editor, language serversNoYes
Integrated terminalNo (! shell mode instead)Yes, needs the daemon
Dev browser for you and the agentNoYes
Approvals, file-edit hunks, safelistYesYesSee approvals
Plans and questions (present_plan, ask_user)Inline blocksInbox tab and cards
TodosModalPanel tab
Command paletteCtrlShiftPCmdKOne shared command list
/ commands/help, /refresh, /cache, /reload, files, extensions/help, /refresh, /cache, files, extensionsSee commands
! shell modeYesYes
@ files, # chats and artifactsYesYes
KeybindingsSame file. Settings lists the keys and opens the file.Same file. Settings opens the file and has Reload.
Model picker with a fallback chainYesYesThe host runs the fallback (providers)
Effort and model optionsYesYesThinking levels
Agent profilesShiftTab cyclesShiftCmdI cyclesA switch keeps the prompt cache when the profile fits the session's agent (profiles)
MCP servers and sign-inYes, with pasted callback over SSHYes, with Test all and RescanMCP
Skills, extensions, pluginsInstall, remove, createInstall, remove, createSkills, extensions
Import from Claude CodeYesYesSee below
Environments (local, sandbox, worktree, Docker, E2B, Daytona)YesYesExecution contexts
Git bar and branch syncNoYes
Themes10 built-in, plus extension themesMode, accent, fonts, motionSeparate systems
Plan usage panelCtrlPModal and welcome screenPlan usage
Context breakdownCtrlShiftGThe context orb
Remote hosts, machines, settings syncYesYesOff by default
Daemon on or off, its statusSetting and footer dotSetting and daemon menuThe daemon
Main sessionCtrlShiftMYesNeeds the daemon
Who else is looking at a sessionYesYesNeeds the daemon
Attention signalsTerminal tab title iconStatus dots, Inbox badges, and OS notifications when on
Attachments and image pasteYesYesLimits differ per app
Queue and steerYesYesSee queue and steer
Write the prompt in $EDITORCtrlGNoThe desktop app has its own editor
Several windowsOne window per processYes
Extension panels and status linesPanels, status line, bannerPanels, session statuses and composer badgesExtensions
Updateszidane upgradeEvery 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 canHow it works
Resume the last sessionStart from last session (on by default) opens it at launch
See sessions from every projectAll projects (off by default, so the list shows only the current project)
Fork from a messageA new session with the turns up to that message
Edit or delete a turnRewrites the saved history from that turn
Favorite or archive a sessionArchive is desktop only
Group sessions in spacesTurn on Spaces. Each space keeps its own default model.
ExportMarkdown or JSON
Title a sessionOn demand in both apps, or automatically with automatic titles
Compact nowSummarizes the history to free context. See compaction.
Run a Main sessionOne 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:

KindExamplesWith the daemon or a server
Agent settingsTool approvals, sandbox, run limits, compaction, enabled skills, MCP servers and extensionsThe host owns them. A change in one window applies to every window on that host.
Window settingsTheme, display settings, editor habits, spaces list, default model and effort, the daemon setting, Remote hostsStay 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.

SettingKeyDefaultDoes
Transcript densitytranscriptDensitycompactcompact folds each exchange's work into one row
Row iconsshowRowIconsonAn icon next to each message and step (desktop)
Tool calls displaytoolCallDisplayformattedfull shows the raw input, hidden hides tool calls
Thinking blocksshowThinkingonShows the agent's reasoning
Tool outputsshowToolResultsonShows the output under each tool call
Group tool callsgroupToolCallsonFolds each exchange's tool calls into one row
Hide subagent outputhideSubagentOutputonFolds subagent runs to their start and finish lines
Edit diffsshowEditDiffsonShows file edits as diffs
Edit diff densityeditDiffDisplayfullcompact shows one line per hunk (terminal)
Full shell outputshowFullShellOutputoffShows every line of ! output, not the last 10
Run receiptshowRunReceiptonAgent, model, time, cost and tokens after each run
Tool attachmentsshowToolAttachmentsonGathers the images tool calls return under the Working block (desktop, compact density)
Cache noticesshowCacheNoticesoffA row when the prompt cache expires or resets, or the provider drops earlier reasoning
Compaction summariesshowCompactionSummaryoffThe summary text under the compaction line (terminal)
Smooth streamingsmoothStreamingonReveals replies character by character
DiagramsrenderDiagramsonDraws 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#

TypeDoes
/nameRuns a command: built-in, from an extension, or from a Markdown file. See commands.
@pathAttaches a file or folder
#Points at another chat or an artifact, so the agent can read it
!commandRuns 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.