Skip to content

Screens ​

Every frame below comes from the capture rig that backs the E2E test plan: the app runs with PI_DESKTOP_CAPTURE=1 against a throwaway data directory, drives itself through each surface, and writes the PNGs that scripts/publish-screenshots.py converts for this page. The screenshots therefore show the shipped shell rather than a mockup, including the empty states a fresh install starts from.

Session titles and transcripts come from the capture fixture, so the chrome is English while the sample conversation is Chinese. The 中文版本 shows the same surfaces with Chinese chrome.

Home and conversation ​

The home screen is the first surface a new install shows: a hero, the composer, and the sidebar with sessions grouped by project.

PI-Desktop home in the light theme

PI-Desktop home in the dark theme

The chat destination in the dark theme

A conversation streams into the transcript with a minimap rail on the right; hovering the rail magnifies the markers and previews the message under the cursor.

A conversation with the minimap rail

The minimap rail magnified under the cursor

The Composer's model × reasoning chip switches the model for the session. In the composer, / opens the command menu and @ opens the file reference menu.

The model and reasoning menu in the Composer

The slash command menu in the composer

The at-mention file menu in the composer

Work panels ​

An agent Write/Edit never opens the panel. The panel appears when the user opens it, or when a file, URL, browser-preview, or plan-approval artifact opens its tab. The frames below are the panels without an active workspace, which is the state a conversation starts in.

The review panel

The browser preview panel

The file browser panel

The work panel switcher menu

Destinations ​

Pull requests, the project archive, and scheduled tasks are full-page destinations reached from the sidebar.

The pull requests destination

The pull requests destination in the dark theme

The project archive

The project archive in the dark theme

Scheduled tasks

Notifications and toasts ​

The notification inbox keeps a durable record of finished work, permission requests, and update notices. Toasts cover the transient end of the same range.

The notification inbox in the light theme

The notification inbox in the dark theme

The notification popover in a narrow window

Success, warning, and error toasts in the light theme

Success, warning, and error toasts in the dark theme

⌘K opens one dialog over sessions, pages, settings rows, and commands. Choosing a settings hit navigates to the tab and flashes the row.

Global search with recent sessions

Global search matching sessions

Global search matching settings rows

Global search matching destination pages

A settings hit opened from search

Global search in the dark theme

Plugins ​

Installed plugins, the marketplace, and the package workflow live on the plugins destination.

Installed plugins

The plugin marketplace

The plugins page menu

The per-plugin row menu

The new plugin template dialog

Extensions ​

MCP servers, Skills, and Subagents are managed independently of plugins, each with global or project-scoped activation.

MCP servers

The activation scope selector

The MCP server editor

Skills

Subagents

Plugin-provided subagents

The subagent editor

Subagents in the dark theme

MCP servers in the dark theme

Settings ​

Settings is a full-page destination with a searchable tab rail.

Basics — language, theme, and appearance

Basics in the dark theme

Model configuration provider defaults

Extensions marketplace with the catalog source picker

Extensions marketplace with a custom catalog URL

Regenerating these frames ​

Build the renderer, make sure target/debug/pi-desktop-host-core exists, create /tmp/codex-screens, then run the app once per locale and publish each pass:

bash
pnpm --filter @pi-desktop/desktop build
mkdir -p /tmp/codex-screens

# English pass; append --lang=zh-CN for the Chinese pass.
cd apps/desktop && PI_DESKTOP_CAPTURE=1 PI_DESKTOP_DATA_DIR=$(mktemp -d) \
  ELECTRON_RENDERER_URL= ./node_modules/.bin/electron .

python3 scripts/publish-screenshots.py --source /tmp/codex-screens --locale en

The rig prints CAPTURE_DONE when the last scene is written.

Local-first · Model-agnostic · Plugin-powered. AIUO.NET