> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bepurple.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Settings

> Every preference p0 exposes, where it lives in the UI.

Settings live in the Settings dialog, organized into the tabs below. The Debug tab is only rendered in development builds (`IS_DEV`). The Subscription tab is admin-only, except when the team's subscription is `trialing`, `canceled`, `past_due`, or absent — then non-admins can open it too.

## Account

| Setting         | Default                        | What it does                                                                                                                              |
| --------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Full Name       | Current user name              | Display name on your account. Trimmed; 255 characters or fewer.                                                                           |
| Email           | —                              | Read-only. Shown for reference.                                                                                                           |
| Profile picture | —                              | Upload an image (crop dialog) or remove the existing one.                                                                                 |
| Beta updates    | Off (`latest` channel)         | Switches the auto-updater to the `beta` channel. Confirmation dialogs appear when enabling and when disabling while running a beta build. |
| Usage analytics | On (`analyticsOptOut = false`) | Shares anonymous usage data and crash reports. Activity stats cloud-sync is separate and stays on when this is off.                       |
| Sign Out        | —                              | Calls `desktopApi.logout()` on this device.                                                                                               |

The Account tab also renders the Activity Dashboard between the profile card and Beta updates, and shows the app version (with `Beta` badge when applicable) and the bundled Claude Code version under the profile card.

The Anthropic API key field used to live on this tab. It moved to **AI & Model** (see below) — `agents-profile-tab.tsx` keeps a marker comment where the section used to render.

## Appearance

| Setting         | Default                                          | What it does                                                                                             |
| --------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
| Interface theme | System preference (`selectedFullThemeId = null`) | Pick a VS Code theme to apply to the whole UI, or follow system light/dark.                              |
| Light           | `purple-light`                                   | Theme used when the system is in light mode. Only visible when Interface theme is **System preference**. |
| Dark            | `purple-minimal`                                 | Theme used when the system is in dark mode. Only visible when Interface theme is **System preference**.  |

Themes come from `BUILTIN_THEMES` and apply by injecting CSS variables generated from the theme's color map.

## Notifications

| Setting               | Default          | What it does                                                                                                                                                  |
| --------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Desktop notifications | On               | Show native notifications when an agent needs your attention or completes a task.                                                                             |
| Notification sound    | `System default` | Sound to play with desktop notifications. The picker lists sounds returned by `desktopApi.listNotificationSounds()`; non-default sounds get a preview button. |
| Sound notifications   | On               | Play a sound when an agent completes work in a background session.                                                                                            |

## Integrations

Two cards: **Linear** and **Jira Cloud**.

**Linear** connects via a personal API key (must start with `lin_api_`). Once connected, two write-back settings appear:

| Setting                           | Default                              | What it does                                                                                                                                                  |
| --------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Update ticket on build completion | On (`linearWriteBackEnabled = true`) | Post a summary comment and update the Linear ticket status when a build finishes.                                                                             |
| Target status                     | First available state type           | Workflow state type to move the ticket to. Options come from Linear's workflow states for the first team; falls back to `completed` / `started` / `canceled`. |

**Jira Cloud** connects via site URL (e.g. `yourcompany.atlassian.net`), email, and an API token from `id.atlassian.com/manage-profile/security/api-tokens`. No write-back settings.

## Git Provider

| Setting  | Default                                  | What it does                                                                                                                   |
| -------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| Provider | `github` (seeded by the DB on first run) | Pick **GitHub** or **GitLab**. Determines which CLI and authentication is used for browsing repos, opening PRs/MRs, and so on. |
| Hostname | Blank (uses `github.com` / `gitlab.com`) | Optional self-hosted hostname. Toggle **Using a self-hosted instance?** to reveal the input.                                   |

The first-run default comes from `src/main/lib/db/index.ts`, which inserts a `gitProvider = 'github'` row in `user_settings` if none exists.

## AI & Model

Three sections in one tab: provider, authentication, model.

**Provider.** Two options: **Claude Code** (Anthropic) and **Codex** (OpenAI, marked `Preview`). Changing the provider only affects new sessions; active sessions keep theirs.

**Authentication** is per-provider with two modes:

| Mode                  | What it does                                                                                                                                                |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Subscription          | Sign in via the provider's CLI (`claude login` or `codex login`). The tab shows the current subscription status and warns if the CLI is missing.            |
| API key (pay per use) | Paste a key (`sk-ant-…` for Claude, `sk-…` for Codex). Saving a Claude key overrides an active subscription; usage is billed to the provider's API account. |

**Model** (scoped to the selected provider). Sources of truth: `CLAUDE_MODELS` and `CODEX_MODELS` in `features/agents/constants/models.ts`.

Claude default: `opus-4-7-1m` ("Opus 4.7 (1M context)"). Other Claude options: Opus 4.7, Opus 4.6 (1M context), Opus 4.6, Sonnet.

Codex default: `gpt-5.4` ("GPT-5.4"). Other Codex options: GPT-5.4 Mini, GPT-5.3 Codex, GPT-5.3 Codex Spark, GPT-5.2.

## Team Members

Renders `TeamMembersPage` from `features/team-members`. Controls on the page:

* **Team Name** — inline edit (admin only). Max 255 characters, saved via `teamMembers.updateName`.
* **Member filters** — search by name or email, role filter (all / admin / member), sortable by name, email, role, or join date. Paginated 25 per page.
* **Member rows** — per-member actions: change role (admin only), remove member (admin only, opens confirmation dialog).
* **Invite teammate** — opens the Invite modal for email invites (admin only).
* **Pending Invitations** — separate list of outstanding invites (admin only).

## Subscription

Renders `SubscriptionSettingsTab` from `features/billing`. Admin-only except for `trialing`, `canceled`, `past_due`, or unset subscription states. Controls:

* **Plan info card** — shows the current plan name (Pro, Individual, Team, Enterprise) and a status badge (Trial / Active / Past Due / Paused / Canceled / Seats Exceeded). Trial end date appears when applicable. A plan-specific subtitle sits underneath (for example, "1 session every 5 hours" for Pro).
* **Team name and seat count** — for team / enterprise plans.
* **Manage Subscription** — admin only. Opens the Stripe billing portal (`billing.createPortalSession`) in your default browser.
* **Plan picker dialog** — opens for pro / individual / trialing plans so you can switch plans without leaving the app.

## Plugins

Browse and install workspace plugins via the `PluginBrowser` component; clicking a plugin opens the `PluginDetailDialog`. Scoped to the currently selected workspace. No table of toggles — this tab is a browser, not a preferences panel.

## Skills

Manages Claude Code skills via the `SkillManager` component. Scoped to the current workspace. No table of toggles.

## Code Review

| Setting                       | Default | What it does                                                                                           |
| ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------ |
| Open files in external editor | Off     | When on, clicking a changed file opens it in your external editor instead of the built-in diff viewer. |

This tab has exactly one toggle.

## Storage

No preferences — this is a worktree-management view. It shows total disk used. Worktrees are grouped into three sections.

* **Active Sessions.**
* **Archived Sessions.**
* **Orphaned Worktrees.**

Each group lazy-loads its rows when expanded. Per-row and select-all checkboxes feed a bulk **Delete** button with a confirmation dialog. A warning banner appears above 10 GB total.

## MCP Servers

Renders `McpManagerTab` from `features/mcp-manager`: a header, status tiles, an installed-servers section, an **Add custom** callout, and a browse section. Each installed server row shows status (Connected / Failed / Needs auth / Connecting / Installed), name, description, version, and tool count. Per-row actions vary by state:

* **View tools / Hide tools** — expand the row to list every tool the server exposes.
* **Fix** — appears on **Failed** or **Needs auth** rows; opens the edit dialog so you can repair config or sign in.
* **Edit** — only for custom servers. Opens the same edit dialog.
* **Remove** — for non-protected servers; deletes the row.
* **Protected** rows (e.g. `purple-status`, `playwright`) show a shield icon and cannot be removed.

## Remote Control

Off by default (`syncEnabled = false`). The enrollment card explains what gets synced and offers a single **Turn on Remote Control** button. Once enabled:

| Setting          | Default              | What it does                                                                                                  |
| ---------------- | -------------------- | ------------------------------------------------------------------------------------------------------------- |
| Pairing QR / URL | —                    | QR code and copyable URL pointing at `${webUrl}/app/remote`. Scan it from your phone to pair.                 |
| Device name      | Current device label | Visible on your phone. Max 255 characters. Saved on blur.                                                     |
| Remote Control   | On (once enrolled)   | Master switch. Turning off stops snapshot pushes and command polling immediately.                             |
| Status           | —                    | Live readout: connection state, last heartbeat (`Xs/Xm/Xh ago`), and sessions-synced count. Polled every 5 s. |

Per the source: only session titles, device label, connection status, and the last 5 messages of each session are synced. Full chat history, tool calls, file contents, terminal output, and worktree paths stay on this device.

## Debug

Dev-only tab (`IS_DEV`). Sections:

* **System Info** — version, platform/arch, dev mode flag, protocol-handler registration status, `userData` path (copyable).
* **Database** — row counts for projects, chats, sub-chats.
* **Developer Tools** — React Scan toggle (loads `react-scan` from a CDN, persisted in `localStorage`).
* **Quick Actions** — Open userData, DevTools, Reload, Copy Info.
* **Toast Testing** — buttons that fire each toast variant.

Additional destructive mutations (`debug.clearChats`, `debug.clearAllData`, `debug.logout`) are wired up but not enumerated here — see `agents-debug-tab.tsx`.
