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
- No Cmd+K, no inline completion. AI edits go through conversation + Review, or the existing ⌘.
DiffCompleteModalsurface — never a separate inline-edit path. Enforced byscripts/check-no-inline-edit.mjs. - Worktree-native environments. Sandbox tiers are opt-in escalation, not the default.
- 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.