# 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](https://zidane.si/docs/tui.md) or the [desktop app](https://zidane.si/docs/desktop.md).

With the [daemon](https://zidane.si/docs/daemon.md) on (off by default, [turn it on](https://zidane.si/docs/daemon.md#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](https://zidane.si/docs/daemon.md#how-a-window-runs-agents), [server clients](https://zidane.si/docs/server-clients.md)).

| Shared | What |
| - | - |
| Always, through [files](https://zidane.si/docs/files.md) | 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](https://zidane.si/docs/daemon.md#what-it-shares)) |
| Never | Each app's look and layout ([terminal themes](https://zidane.si/docs/tui-themes.md), [desktop appearance](https://zidane.si/docs/desktop-appearance.md)) |

## What each app has

| Feature | Terminal | Desktop | Notes |
| - | - | - | - |
| Sessions: search, fork, favorite, delete, spaces, export, compact now | Yes | Yes | [Sessions](#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](#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](https://zidane.si/docs/approvals.md) |
| Plans and questions (`present_plan`, `ask_user`) | Inline blocks | Inbox tab and cards | |
| Todos | Modal | Panel tab | |
| Command palette | `Ctrl`+`Shift`+`P` | `Cmd`+`K` | One shared command list |
| `/` commands | `/help`, `/refresh`, `/cache`, `/reload`, files, extensions | `/help`, `/refresh`, `/cache`, files, extensions | See [commands](https://zidane.si/docs/extensions.md#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](https://zidane.si/docs/providers.md#model-fallback)) |
| Effort and model options | Yes | Yes | [Thinking levels](https://zidane.si/docs/agents.md#thinking) |
| Agent profiles | `Shift`+`Tab` cycles | `Shift`+`Cmd`+`I` cycles | A switch keeps the prompt cache when the profile fits the session's agent ([profiles](https://zidane.si/docs/extensions.md#agent-profiles)) |
| MCP servers and sign-in | Yes, with pasted callback over SSH | Yes, with Test all and Rescan | [MCP](https://zidane.si/docs/mcp.md) |
| Skills, extensions, plugins | Install, remove, create | Install, remove, create | [Skills](https://zidane.si/docs/skills.md), [extensions](https://zidane.si/docs/extensions.md) |
| Import from Claude Code | Yes | Yes | See [below](#import-from-claude-code) |
| Environments (local, sandbox, worktree, Docker, E2B, Daytona) | Yes | Yes | [Execution contexts](https://zidane.si/docs/execution-contexts.md) |
| Git bar and branch sync | No | Yes | |
| Themes | 10 built-in, plus extension themes | Mode, accent, fonts, motion | Separate systems |
| Plan usage panel | `Ctrl`+`P` | Modal and welcome screen | [Plan usage](https://zidane.si/docs/providers.md#plan-usage) |
| Context breakdown | `Ctrl`+`Shift`+`G` | 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](https://zidane.si/docs/daemon.md) |
| Main session | `Ctrl`+`Shift`+`M` | 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](#queue-and-steer) |
| Write the prompt in `$EDITOR` | `Ctrl`+`G` | 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](https://zidane.si/docs/extensions.md) |
| 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](https://zidane.si/docs/decisions.md#automatic-session-titles) |
| Compact now | Summarizes the history to free context. See [compaction](https://zidane.si/docs/sessions.md#compaction). |
| Run a Main session | One session that drives the others. See [Main session](https://zidane.si/docs/daemon.md#main-session). |

Where each control sits: [terminal sessions](https://zidane.si/docs/tui-sessions.md), [desktop sidebar](https://zidane.si/docs/desktop-sidebar.md).

## Settings

Both apps keep settings in one `state.json` on this computer ([where](https://zidane.si/docs/files.md#config-and-data-files)). 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](https://zidane.si/docs/server-clients.md#settings-sync) can copy your agent settings to a server. Every row, per app: [terminal settings](https://zidane.si/docs/tui-settings.md), [desktop settings](https://zidane.si/docs/desktop-settings.md).

## 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](https://zidane.si/docs/tui-chat.md), [desktop transcript](https://zidane.si/docs/desktop-transcript.md).

## 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. `Alt`+`Enter` sends one message the other way. A `/` command always waits in the queue. In the terminal app, `Ctrl`+`Enter` 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](https://zidane.si/docs/agents.md#run-control).

## Commands and mentions

| Type | Does |
| - | - |
| `/name` | Runs a command: built-in, from an extension, or from a Markdown file. See [commands](https://zidane.si/docs/extensions.md#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](https://zidane.si/docs/tui-prompt.md), [desktop composer](https://zidane.si/docs/desktop-composer.md).

## 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](https://zidane.si/docs/files.md#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](https://zidane.si/docs/mcp.md), [skills](https://zidane.si/docs/skills.md).
