pi-desktop
A free, open source Electron GUI for the Pi and oh-my-pi coding agents. Chat, edit files, run a terminal, and review diffs in one window. Linux, macOS, and Windows.
Install / Use
npx skills add FaqFirebase/pi-desktopInstalls into whichever agent you are using.
Other
Other agent config
Quality Score
Category
AI & Machine LearningSupported Platforms
Skill content
View source on GitHubPi Desktop
A desktop GUI for the Pi coding agent. Chat, manage projects, browse files, run commands, and install packages in one window.

Still in alpha, so expect rough edges.
What it does
- Streaming chat with thinking blocks, tool use, and rich rendering: bundled fonts and color emoji, inline SVG preview, and clickable file links that open a preview pane. Consecutive tool calls fold into collapsible groups. File reads show as line-numbered, syntax-highlighted code and edits as diffs
- Find within a conversation (
Ctrl/Cmd+F); streaming follows new output only while you're at the bottom, with a jump-to-bottom control - Composer file mentions (type
@to insert a path reference for Pi to read) andUp/Downto recall prompts sent in the current session - Home dashboard with usage stats: messages, tokens, active-day streaks, peak hour, and a per-model breakdown
- Multi-Agent Council Planning, where Pi, Claude, and Codex plan together and reach consensus before Pi builds (opt-in)
- Command palette (
Ctrl/Cmd+Kor/) for skills, prompt templates, and built-in commands - Skills browser, session fork/branch tree, and one-click context compaction
- Session naming (read from Pi) with inline rename, and a themed in-app confirmation for delete
- Custom models & providers editor in Settings, which edits
~/.pi/agent/models.json - Multiple workspaces, each with its own Pi process and sessions
- Review rail (toggleable) with permissions, approvals, changed files, and session status
- Custom permission rules: allow/deny glob rules per Pi tool that refine the permission modes, with per-workspace rule files, import/export, and live edits that apply without restarting Pi
- File tree, code/image/PDF/HTML preview panes, code editor (CodeMirror 6 with syntax highlighting), diff viewer, file search
- Terminal with ANSI colors
- Package browser connected to pi.dev/packages, with instant local search
- Session tags, model switching, live-preview settings, themes (7 built-ins plus System, and custom themes you can create in-app, import, export, or install from a URL)
Review rail
The right-side Review rail keeps safety and working-tree state visible while you chat with Pi. Toggle it from the chat toolbar (hidden by default, so it doesn't compete for space with file/image previews).
Changed files use readable status badges:
| Badge | Meaning |
|-------|---------|
| NEW | Untracked new file |
| MOD | Existing tracked file was modified |
| DEL | Tracked file was deleted |
| ADD | New file staged in git |
| STG | Modified file staged in git |
| REN | File was renamed |
Permissions
Four base modes control what Pi may do, selectable from the Review rail or Settings → Behavior:
| Mode | Behavior | |------|----------| | Plan / Read-only | Only read/search/list tools are enabled; edits and shell commands are blocked | | Ask before edits | Pi asks before file edits and shell commands | | Ask before commands | Pi asks before shell commands | | Trusted | All tools enabled |
Custom permission rules refine the modes with allow/deny rules per Pi tool, edited in Settings → Behavior → Permission rules:
- A rule is an action (
allow/deny), a tool name (bash,edit,write,read, … or*for any), and an optional glob pattern matched against the tool's input: the shell command forbash, the file path for file tools.*is the only wildcard. - Precedence: deny beats allow, and allow beats the mode default. Deny rules are enforced in every mode; a
deny * *.env*rule holds even in Trusted. Allow rules skip the confirmation prompt in the ask modes. - Rule edits apply to the next tool call without restarting Pi.
- Rules come in two scopes. The Global | This workspace tabs edit either your global rules or the active workspace's
.pi-desktop/permission-rules.json. A workspace file is gated by workspace trust: once you trust the workspace it fully replaces the global list while you work there. Until then (the default for a repo you just opened) only its deny rules apply, layered on top of your global rules, and its allow rules are ignored, so a cloned repo can tighten your permissions but never loosen them. Opening a workspace whose file contains allow rules prompts you to trust it; you can also Trust/Revoke from the This workspace tab. Import/Export moves rule lists as JSON files, and the workspace file can be hand-edited or committed with a repo. The app picks up changes live. - One honest caveat: rules match raw strings, with no path canonicalization or command parsing. Treat them as a guardrail against accidents rather than a security sandbox, and keep even a trusted workspace's allow rules narrow.
Example rules:
{ "action": "allow", "tool": "bash", "match": "npm test*" }
{ "action": "deny", "tool": "bash", "match": "rm -rf *" }
{ "action": "deny", "tool": "*", "match": "*.env*" }
Custom themes
Pi Desktop ships 7 built-in themes (Dark, Light, Nord, Gruvbox, Breeze Dark, Breeze Light, Breeze Claudius) plus System, and you can create your own from Settings → Appearance.
To build one in the app, click Create theme to fork the currently active theme, or Edit theme to keep editing one you already created. Pick 7 seed colors (app background, surface, text, accent, success, warning, error) and a dark or light kind; every other color in the app is derived from those seeds. Changes preview live across the whole window as you edit. Two disclosures cover finer control:
- Advanced lets you override any of the ~30 derived tokens individually (borders, hovers, scrollbars, and so on) instead of accepting the automatic derivation.
- Syntax colors overrides the code-highlighting colors (keywords, strings, comments, etc.) used by the code editor and diff viewer.
Themes you create are listed alongside the built-ins in the Theme dropdown. Rename one by editing its name in the editor, duplicate one by selecting it and clicking Create theme (which forks whatever is active), and delete one with the Delete button that appears next to the dropdown whenever a custom theme is selected.
To share a theme, use Import and Export to move it as a .json file, or paste an https:// URL into Install from URL to fetch and install one directly (HTTP is rejected, and downloads are size-capped).
A theme file uses the pi-theme/v1 format: JSON with a $schema, a name, a kind ("dark" or "light"), and 7 seeds. That's enough for a complete, valid theme; everything else is derived automatically via CSS color-mix():
{
"$schema": "pi-theme/v1",
"name": "My Theme",
"kind": "dark",
"seeds": {
"app": "#0a0a0a",
"surface": "#171717",
"text": "#f5f5f5",
"accent": "#2563eb",
"success": "#34d399",
"warning": "#facc15",
"error": "#f87171"
}
}
Two optional top-level objects let you pin exact values instead of relying on derivation: overrides (any derived token, e.g. border, scrollbar, accent-hover) and syntax (code-highlighting colors, e.g. keyword, string, comment). Omit both and the theme still renders correctly from the 7 seeds alone.
User theme files live in the app's user-data directory under themes/ (on Linux, ~/.config/pi-desktop/themes/).
There's also a community gallery at pi-desktop-themes: copy any theme's raw URL into Install from URL, or submit your own with a pull request.
Multi-Agent Council Planning
Pi, Claude, and Codex each produce an initial plan, share and converge, and Pi presents the agreed consensus plan before anything is built. All members plan read-only; Pi is the only agent that edits files.
The feature is off by default. Enable it in Settings → "Multi-Agent Council Planning"; a confirmation dialog warns that it increases token and credit usage, since each request runs multiple agents.
The app auto-detects each member's CLI cross-platform, and only detected agents can be enabled (per-agent checkboxes). At least two members must be available or a run is refused. Pi always merges the plans into the final consensus, even when it isn't checked as a planner.
Every member plans read-only: Claude runs with --permission-mode plan, Codex with --sandbox read-only, and Pi with write tools excluded. They produce plans but never modify files. Only Pi implements the approved result.
During the consulting phase, each member streams its plan live in its own card with an elapsed timer.
There are two consensus modes:
- One debate round (default): each member sees the others' plans and revises once, then Pi merges. You watch them converge.
- Arbiter merge: faster and cheaper. Pi synthesizes the initial plans directly with no debate round.
A per-member timeout (10 to 600 seconds, default 240) bounds each member. A member that times out or errors is dropped, and the run proceeds as long as at least one plan was produced.
To use it, type your request with the feature enabled and click Plan with Council in the composer. Review each member's plan and Pi's merged consensus plan. If you want changes, type feedback in Request changes to the plan… and Pi revises the consensus; repeat as needed. When you're happy, click Implement this and Pi builds it. The panel collapses once a plan is ready so the output stays readable.
Getting started
You need Pi installed first:
npm install -g @earendil-works/pi-coding-agent
On Linux, grab the AppImage from Releases:
chmod +x Pi-Desktop-linux-x64.AppImage
./Pi-Desktop-linux-x64.AppImage
macOS
Download the .dmg (Apple Silicon / arm64) from Releases, open it, and drag Pi Desktop to Applications.
Builds are not yet signed or notarized. Because the download is unsigned, macOS quarantines it, and on first launch Gatekeeper shows this dialog (this is macOS's message, not our advice):
Pi Desktop is damaged and can't be opened. You should move it to the Trash.
Do not move it to the Trash. The app is not damaged; this is just how Gatekeeper phrases its block on any unsigned app. macOS offers no "Open Anyway" button for this particular dialog, so clear the quarantine flag in Terminal instead:
xattr -dr com.apple.quarantine "/Applications/Pi Desktop.app"
Then open the app normally. You only need to do this once.
If macOS instead says the app "cannot be opened because Apple cannot check it for malicious software," you can allow it without Terminal: open System Settings → Privacy & Security, scroll to the Security section, and click Open Anyway next to the Pi Desktop notice, then confirm with Touch ID / your password.
If you'd rather skip the unsigned-app warnings entirely, build from source. A build you compile yourself runs locally without Gatekeeper blocking it, so there is no signing prompt and no quarantine flag to clear. See Build it yourself → Linux / macOS below.
Windows
Download from Releases: the installer (…-win-x64-setup.exe, recommended) or the portable …-win-x64.exe. Builds are unsigned, so SmartScreen may warn; choose More info → Run anyway. If file edits or saves fail, see the Controlled Folder Access note below. Windows is community-tested; please open a bug report if you hit an issue.
Keyboard shortcuts
| Shortcut | What it does |
|----------|-------------|
| Enter | Send message |
| Shift+Enter | New line |
| Up/Down | Recall previous prompts |
| @ | Mention a worksp
Truncated for display — read the full file on GitHub.
Related Skills
caveman
107.1k🪨 why use many token when few token do trick. Viral skill + proxy for coding agents that cuts 65% of tokens by talking like a caveman.
claude-mem
94.4kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
Understand-Anything
83.5kGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
headroom
73.4kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
