Skip to main content
Every setting is one entry in a single registry, so rows, defaults, per-field reset, search, and restart notices all derive from the same list.

Quick Start

1

Open settings

Press ⌘, to open the settings window.
2

Search for a field

Use the built-in search box — it matches labels, descriptions, and keywords, and never returns a row that is currently hidden.
3

Reset a single field

Each row has a per-field reset back to its default.

How It Works

On save, the engine clears its cached agents, so the next turn picks up your new settings immediately.
Secrets never reach settings.json and never leave the process in cleartext. The api_key is stored in the OS keychain and stripped before the file is written. Every settings response — GET /settings and POST /settings — returns the value masked as bullets, including a write that only changed an unrelated field like theme. An empty key comes back as "", not bullets, so the UI can tell “set” from “unset”. Redaction is driven by an internal SECRET_KEYS list, so future secrets are covered automatically.
A rejected settings write shows a Could not save that setting. toast and does not mutate CFG or re-render the row, so the visible state always matches what the engine persisted — see Troubleshooting.
The registry is generated. Don’t hand-edit frontend/src/settings-registry.js; edit the source and run tools/sync-registry.mjs. This keeps the settings list in sync between the frontend and the engine.

General

Models

Clearing Base URL now clears only what the app exported. The provider-specific variable and OPENAI_API_BASE are both unset together, and shell-exported credentials outside the app are preserved.
These values are forwarded into agent.start(..., max_tokens=..., top_p=..., reasoning_effort=...) — but only when you picked a real level. reasoning_effort="off" is not forwarded (same rule as temperature / top_p, which are only sent when changed from their defaults), so the provider’s own default reasoning behaviour is preserved. Since MervinPraison/PraisonAI#4725 the sampling values also take effect on streaming chats — previously the streaming path ignored them. See Streaming → Sampling knobs.
The api_key validator requires at least 20 characters before it will save. A shorter value looks like a typo — the engine refuses to export anything shorter, so without this the field would store the typo, echo it back masked as if set, and every turn would fail as though no key existed. Leave it blank to use the environment.

Chat

Appearance

font_size drives a --ui-scale CSS variable, and every fixed dimension is rem, so changing it scales the whole interface — messages, sidebar, settings, and composer — not just the chat.

Safety

Since MervinPraison/PraisonAI#4730, smart is meaningful — previously it fell through to the same prompt as ask. See Approvals & Safety for behaviour.

Data

Action rows, not stored values:
Action rows now surface failures via a That did not run: … toast instead of failing silently, so a down engine can no longer let Export fake a backup — see Troubleshooting.
See Data & Privacy for where data lives.

Integrations

Stored MCP entries in the Desktop app do not yet reach the agent. The engine does not launch them, so the model cannot use them. For MCP tools that work today, use the SDK path in MCP Overview.
See MCP Servers for what the panel stores.

About

See Troubleshooting for the update check behaviour.

Gating Behaviour

Some rows appear only when another setting has the right value: Fields marked Requires restart (base_url, api_key, launch_at_login, framework) say so on the row itself.

Tray & Shortcuts

The tray menu shows keyboard accelerators only where the modifier exists. Off macOS, Tauri maps Cmd to the Super key, which would render as Windows+, and Windows+Q — and Windows+Q is reserved by the OS. So on Windows and Linux the tray still exists, but no accelerators are shown. The template menubar glyph is macOS-only, and on Linux the menu opens on left click regardless.

Best Practices

The search box derives from the registry and respects visibility rules, so it never surfaces a hidden row. Type a keyword like “proxy” or “secret” to jump straight to a field.
Per-field reset restores a single setting to its default without touching the rest — safer than a full reset.
base_url and api_key are marked “requires restart”. Relaunch the app after changing them so the engine picks up the new endpoint or key. If the engine is mid-restart when you change one of these rows, the write can be rejected — you’ll see Could not save that setting. and the previous value stays on screen, so try again once the pill reads engine :PORT. See Troubleshooting.

Models & API Keys

Model pill, sampling, and keychain storage

Data & Privacy

Where settings and secrets live