GitHub Docs

Task-first, conversation-driven desktop companion built with Tauri 2 and React/TypeScript. VibeDesk is not VibeCoder v2 — it’s the fast path: type a task, watch it happen. It shares all VibeCLI Rust crates and the VibeCoder design system, and owns only its own React tree plus a thin daemon bridge.

Interface

A three-column shell mirroring the Codex desktop UX:

  • Left — project / chat navigation
  • Center — conversation
  • Right — Environment inspector

All run controls live inline in the composer rather than in a separate toolbar.

Pricing and access

VibeDesk is bring-your-own-key against your own VibeCLI daemon: no subscription tier, no card required to start, and no token-metering markup on top of whatever your chosen provider already charges. Every LLM call goes straight to the provider you picked in the toolbar — there is no VibeCody-run relay in between to add its own usage fees.

Connectors

The Connectors marketplace (IntegrationsView) is a curated catalog of MCP servers a workspace can enable in one click — read/search connectors (filesystem, databases, web search), collaboration connectors (Slack, Gmail, Google Calendar), and design/observability connectors, each defined once in vibecli/vibecli-cli/src/connectors.rs as a ConnectorSpec:

pub struct ConnectorSpec {
    pub id: &'static str,           // kebab-case, unique
    pub title: &'static str,
    pub description: &'static str,
    pub category: &'static str,     // free text — presentation only
    pub runtime: Runtime,           // Builtin | Npx | Uvx
    pub command: &'static str,
    pub args: &'static [&'static str],
    pub credentials: &'static [CredentialField],
    pub docs_url: &'static str,
    pub requires_sandbox: bool,     // see Sandboxing below
}

A credential a connector needs (an API key, an OAuth client secret) is a CredentialField { env, label, help } — the panel prompts for it, and the value is encrypted into the workspace’s WorkspaceStore (workspace_secrets, keyed by connector:<id>:<ENV_NAME>), never the plaintext ProfileStore, never committed, never logged. Only the credential’s name is ever stored alongside the connector definition.

Contributing a connector: add an entry to the CATALOG array in connectors.rs pointing at a real, published MCP server (ideally an official one; if community-maintained, say so plainly in the description — see the gmail/google-calendar entries for the pattern of naming exact setup gotchas rather than presenting a simplified happy path). id must be kebab-case (validate_id); env var names must be [A-Z0-9_] (validate_env_name). Nothing here is verified to work by being listed — probe() is what actually launches it and reports Ok/Failed/TimedOut, so a new entry should be tested against a real environment before landing.

Sandboxing

Connector subprocesses launch through the OS-level sandbox by default (VIBECLI_MCP_SANDBOX, see docs/mcp.md for what it does and does not confine). A connector marked requires_sandbox: true — reserved for the Payments category — refuses to run at all if the sandbox can’t be set up, rather than silently falling back to an unconfined spawn; every other connector keeps the pre-2026-09-27 fallback behavior. The Connectors panel shows an “unsandboxed” badge next to a connector that is currently running without OS confinement.

Locked design decisions

  1. No Cmd+K, no inline completion. AI edits go through conversation + Review, or the existing ⌘. DiffCompleteModal surface — never a separate inline-edit path. Enforced by scripts/check-no-inline-edit.mjs.
  2. Worktree-native environments. Sandbox tiers are opt-in escalation, not the default.
  3. The VibeCLI daemon is the source of truth. VibeDesk talks to it over HTTP/SSE (vibedesk/src-tauri/src/commands.rs) and never re-implements agent logic itself.

Develop

cd vibedesk
npm install
npm run tauri:dev           # opens the VibeDesk window (needs `vibecli serve` running)
npm run lint:no-inline-edit # enforces the no-inline-edit rule
npm run build               # tsc + vite production build

Dev server runs on :1422 (VibeCoder uses 1420, VibeAIChat uses 1421). The Rust crate is vibedesk in the workspace — check it with cargo check -p vibedesk.

Relationship to the other desktop shells

VibeDesk, VibeCoder and VibeAIChat are three independent Tauri shells sharing the same Rust crates, the same design system, and the same daemon — but each keeps its own src-tauri/src/commands.rs and its own Tauri command handler list. A new Tauri command needed in VibeDesk must be registered there explicitly; it is not picked up automatically from VibeCoder.

VibeDesk has no mobile or watch counterpart — those clients speak HTTP to the daemon directly and have no Tauri IPC layer.