agent-desktop logo agent-desktop v0.18.0
◑ theme ↗ github
AGPL-3.0 · open source macos · linux · windows Claude.ai subscription or API key v0.18.0 — electron + react

agent/desktop_

A desktop client for every LLM, built for agents. Plan mode, MCP, git panel, scheduler, voice, Jupyter — on your filesystem, or headless in a Docker sandbox.

01

the app / a real desktop window, not a terminal

real screenshots · click tabs to switch view
agent-desktop
Agent Desktop — Git panel with commit graph, branch list, and stash view
02

features / what's in the box

all free · all open
F.01 // core

claude agent sdk, wired to your filesystem

Built on the Claude Agent SDK. Plan mode renders proposed plans as markdown and requires explicit approval — rejection passes feedback back as context. AI settings cascade from Global → Folder → Conversation. Native SDK session resume sends only the last message, falls back on corruption.

F.02 // version control

git panel

Interactive Git visualizer in the right sidebar. Auto-refreshes after any Bash tool result that touches the repo. Hardened runGit spawn wrapper with timeout and env sanitization.

F.03 // time

scheduled tasks

Recurring agent runs on a cron interval, linkable to a specific conversation. Prompts tokenize {name} and {name:arg} variables — built-ins plus custom .ts resolvers with hot-reload. AI has its own MCP bridge to create, list, and cancel tasks.

F.04 // viewers

viewers · jupyter · openscad · monaco

Open anything and the app knows what to do. .ipynb renders with a live kernel and inline cell editing (Colab-style). OpenSCAD files render as a 3D preview via Three.js with STL export. Monaco, HTML sandbox, Markdown, Mermaid, SVG, base64 images — all native.

F.05 // context

knowledge base

Attach files and folders as context, per conversation. Read-only or read-write collection modes. 500KB cumulative size guard. @mention autocomplete with VS Code-style fuzzy matching.

F.06 // extensible

mcp · stdio / http / sse

Model Context Protocol, first-class. Connect stdio, HTTP, or SSE servers. Enable per conversation. Granular Setting Sources — user / project / local. Scheduler ships as a built-in MCP server.

F.07 // cosmetics

themes + font scale

Dark/light built-in + full CSS custom property editor. Import custom themes from ~/.agent-desktop/themes/. Folder heatmap auto-colors by conversation count. Per-folder color tinting via HSV picker. Font scale presets (80/100/125/150%) — everything including Monaco scales via rem.

F.08 // chat

message queue & fork

Queue messages while the AI is streaming — auto-send on response end, with drag-reorder, inline edit, delete. Right-click any message → Fork from here to branch the conversation. Slash commands: /compact, /clear. Multi-select with Ctrl/Shift-click.

F.09 // quick

quick chat · voice

Global overlay, one keybind from anywhere. Text or voice. Voice goes through local whisper.cpp — audio never leaves the machine. System volume auto-ducks during recording. Optional headless notifications-only mode.

F.10 // tts

text-to-speech

Responses read aloud via Piper (HTTP), edge-tts (CLI), or spd-say. Modes: full · summary · auto · off. Configurable summary model (Haiku / Sonnet / Opus). Per-stream audio ducking, per-conversation TTS settings via AI cascade.

03

four surfaces, one agent

same config · same memory · same files
[▣]

desktop GUI

Electron 33 + React 18 + Zustand + Tailwind. Sidebar with folders, drag & drop, heatmap, multi-select. Plan approval, live tool timeline, git panel, TTS. System tray with theme-aware icons. Auto-update via electron-updater.

AppImage · deb · dmg · exe · portable
[⌥⌘]

quick chat

Global overlay, one keybind away from anywhere. Text or voice — voice goes through local whisper.cpp, audio never leaves the machine. Resume-last-conversation or start fresh. Headless notifications-only mode available.

⌥⌘␣  · whisper.cpp · local
[◉]

headless web server

Runs on any Node 18+ machine — no Electron needed. HTTPS with auto-generated self-signed certs (or plain HTTP if OpenSSL is missing). Raspberry Pi, WSL, any headless box. Short URLs for LAN.

$ node index.js --server --port 3484
[◈]

discord bot

Forwards messages to any conversation. Slash commands: /set-conversation, /get-messages, /compact, /clear, more. Autocomplete for conversations and folders, user whitelist, auto-start on launch. Long responses auto-split across messages.

$ node index.js --discord
04

settings cascade / global → folder → conversation

closer wins · inherit by default
tier 01 · global
defaults
Baseline for every new conversation. Your sensible defaults.
modelsonnet-4.5
max turnsunlimited
personaneutral · precise
toolsfs · web · shell
permissions~/ · ask
contextlast 20 msgs
tier 02 · folder
/work
Overrides for anything filed here. Everything else inherits.
modelopus-4.7
max turnsunlimited (inh.)
personaformal · cites sources
tools+ calendar · + linear
permissions~/work · auto
context20 (inh.)
tier 03 · conversation
thursday plan
The closest layer. Wins over everything above it.
modelopus-4.7 (inh.)
max turns12
personaformal (inh.)
tools+ scad · + sched
permissionswork (inh.)
contextfull thread
the persona one system prompt, cascaded

Configure your agent's personality however you want — one editable system prompt. It inherits down the cascade, so you can change it on a single folder and that folder speaks differently.

You are terse. No filler, no "certainly", no "I'd be happy to". Never use "really", "just", "very", "basically". If a paragraph can be a sentence, it is. If the answer is "no", say "no" and stop.
global default override at any folder override in a single conversation
05

bring your own frontend / the GUI is optional

headless core · typed HTTP + WS api

The whole app is a headless daemon with a GUI bolted on — and you can unbolt it.

The shipped desktop window, the web view, the Discord bot — they are all clients of the same local server. Swap any of them. Write your own in whatever language you like. The core keeps your conversations, folders, macros, scheduler, permissions, and agent state.

  • Typed REST + websockets — openapi spec included
  • Plugin API — add a tool in ~40 lines of JS
  • Theme tokens exported — match the official UI
  • Same daemon, any client — desktop, neovim, a rotary phone
client.ts tool.plugin.js api.yaml GET :3484/v1
// your own UI. 18 lines. no SDK.
const ad = new WebSocket("ws://localhost:3484/v1/stream");

ad.onopen = () => ad.send(JSON.stringify({
  type: "message",
  folder: "/cad",             // persona + model inherit
  text:   "render that bracket again with a 4mm fillet",
  tools:  ["scad.preview", "fs.write"]
}));

ad.onmessage = (e) => {
  const m = JSON.parse(e.data);
  if (m.type === "token")   print(m.delta);
  if (m.type === "tool")    renderCard(m);
  if (m.type === "done")    finalize(m.cost);
};
core agent-desktopheadless daemon · conversations · folders · macros · scheduler · permissions required
api REST + WebSocketstream tokens, tool calls, scheduler events, presence required
frontend shipped desktop GUIthe one you see on this page. electron-ish. themeable. optional
frontend shipped web clientsame ui, served on :3484 optional
frontend shipped discord botyour agent, in your server, same memory optional
frontend ← your clientneovim plugin · raycast · iOS shortcut · a literal rotary phone · whatever built by you
06

extend it, actually

hooks · scheduler · mcp

hooks.json //intercept

Hooks fire at defined points of the Claude Agent SDK loop. UserPromptSubmit hook output is rendered as a markdown system-message block and persists across sessions. Per-backend hook isolation.

UserPromptSubmit // runs before each message — renders markdownsh
PreToolUse // runs before any tool — can deny / rewritesh
PostToolUse // runs after — log output, mirror diffssh
SubagentStop // spawned subagent finishes its turnsh
Stop // main agent finishes a turn · auto-retry on SDK errorssh

scheduler //cron

Cron-scheduled prompts with a real variable resolver. Variables resolve in parallel, per-variable timeout, passthrough-on-error. Tasks can target a specific conversation. The AI can create, list, and cancel schedules through a built-in MCP bridge.

0 9 * * 1-5 morning-briefweekdays · {date} {last_commit} ● ON
*/30 * * * * watch-logevery 30 min · {file_contents:~/logs/err.log} ● ON
0 17 * * 5 weekly-recapfridays 17:00 · {previous_output} chained ● ON
@oneshot review-bracketone-shot · created by the AI via MCP ○ IDLE
07

two runners, one agent

swap per conversation · same memory, same files

The agent backend is swappable. Default to the official Claude Agent SDK, or switch to the experimental PI Coding Agent backend — per conversation, per folder, or globally.

A runner is the piece that drives the agent loop — it owns the tool calls, the context window, and the conversation with Claude. Agent-desktop ships with two backends. Same files, same hooks, same scheduler, same MCP servers — only the loop driving them changes.

runner 01 · official first party
claude-agent-sdk@anthropic-ai/claude-agent-sdk
Anthropic's official agent loop. Polished, fast, stable. The brain behind Claude Code. Sign in with OAuth via claude login, or paste an ANTHROPIC_API_KEY with an optional custom base URL. This is the default runner — the app is designed around it.
modelsClaude · sonnet 4.5 / haiku 4.5 / opus · dynamic list
authOAuth via claude login · or ANTHROPIC_API_KEY
licenseMIT · maintained by Anthropic
toolsfull MCP ecosystem ·  hooks · plan mode · subagents · skills
sessionnative resume · last-message-only continuity
best foreverything — this is the default
runner 02 · alternative experimental
pi-coding-agentexperimental · @mariozechner/pi-coding-agent
The PI Coding Agent SDK as an alternative backend. Selectable per-conversation, per-folder, or globally. Smaller surface, different ergonomics — useful for experimenting with a non-Claude-Agent-SDK loop. Not yet fully integration-tested — expect rough edges.
backsPI Coding Agent SDK · per-conversation toggle
authANTHROPIC_API_KEY · no Claude login required
licenseAGPL-3.0 · shipped as a runtime dep
toolspi extensions · pi-subagents tested
runsspawned per turn · status: experimental
best fortinkering · testing an alternative agent loop
 
claude-agent-sdk
pi
model
Claude · sonnet 4.5 / haiku 4.5 / opus — dynamic list from /v1/models
Claude via PI Coding Agent SDK
auth
OAuth (claude login) or ANTHROPIC_API_KEY
ANTHROPIC_API_KEY · auth check bypassed
tools & extensions
full MCP (stdio/http/sse) · hooks · plan mode · subagents · skills
pi extensions · pi-subagents is the tested add-on
status
stable · the default · every feature wired around it
experimental · not fully integration-tested
selection scope
default backend
switch per conversation · per folder · or globally
hook isolation
Claude-side hooks active
per-backend isolation · hooks run independently
08

mcp servers / any tool, any protocol

stdio · http · enable per conversation
scheduler-server
built-in · create, list, cancel tasks
stdio · bundled
jupyter bridge
built-in · local kernel execution
bundled
stdio servers
launch any MCP binary
stdio
http servers
point at a URL
http
sse servers
streaming endpoint
sse
per-conversation
enable a subset per chat
toggle
per-skill toggle
enable/disable individually
toggle
setting sources
user · project · local · granular
control
CWD whitelist
per-entry read / readwrite
control
allowed tools
configurable permission modes
control
filesystem · shell
via Claude Agent SDK tools
sdk
web fetch
via Claude Agent SDK tools
sdk
09

themes / real CSS files, real editor

dark + light built-in · drop a .css · ask the agent

A theme is a CSS file with --color-* tokens.

The app ships with dark and light. Drop any additional .css into ~/.agent-desktop/themes/ — the app picks it up without a restart.

  • CSS custom property editor — tweak tokens live from Settings, save as a new theme
  • Auto day/night — switch between two configured themes at sunrise/sunset
  • Folder heatmap + per-folder tinting — via color-mix() on the active theme
  • Font scale — 80% / 100% / 125% / 150% via --font-scale, Monaco included
  • Ask Claude to write one — give a vibe, get a CSS file
default-dark.css default-light.css ~/.agent-desktop/themes/
/* Agent Desktop — Default Dark Theme */
:root {
  --color-bg:            #1a1a2e;
  --color-surface:       #16213e;
  --color-deep:          #0f3460;
  --color-primary:       #e94560;
  --color-accent:        #533483;
  --color-text:          #eaeaea;
  --color-text-muted:    #a0a0a0;
  --color-success:       #00d26a;
  --color-warning:       #ffc107;
  --color-error:         #ff4757;
  --color-tool:          #00bcd4;
  /* optional overrides */
  --font-family:        "JetBrains Mono", monospace;
  --font-scale:         1;
}
popular drops in ~/.agent-desktop/themes/
default-dark default-light catppuccin-mocha catppuccin-latte matrix matrix-monokai monokai neo-brutalist neon-nights + your own
10

install / grab a release, open the app

no telemetry · no account · no build
releases — agent-desktop
# grab the latest build — no clone, no build step
 
# pick your platform
macOS  · Agent-Desktop-*.dmg  (Apple Silicon)
Windows · Agent-Desktop-Setup-*.exe  (NSIS + portable)
Linux  · Agent-Desktop-*.AppImage  or agent-desktop_*.deb
 
# first launch — sign in with your Claude.ai account, or paste an API key
no CLI, no node, no telemetry