Pia stores its configuration in %APPDATA%\Pia\settings.json. Property names are camelCase, and enum values are written as their names ("Dark", "Parakeet").
To push settings to managed devices instead, use Enterprise Policy — it takes the same property names.
| Setting |
Type |
Default |
Description |
theme |
"System" | "Dark" | "Light" |
"System" |
UI theme |
uiLanguage |
"EN" | "DE" | "FR" |
"EN" |
Interface language |
targetLanguage |
"EN" | "DE" | "FR" |
unset |
Default output language for Optimize |
targetSpeechLanguage |
"Auto" | "EN" | "DE" | "FR" |
"Auto" |
Speech-recognition language |
| Setting |
Type |
Default |
Description |
launchAtStartup |
bool |
true |
Start Pia when you sign in to Windows |
startMinimized |
bool |
false |
Launch hidden in the system tray |
autoCaptureSelectedText |
bool |
true |
Paste the selected text in when a hotkey triggers Pia |
defaultWindowMode |
"Optimize" | "Assistant" |
"Optimize" |
Mode used by the New Window button |
autoUpdateEnabled |
bool |
true |
Allow auto-update on launch |
| Setting |
Type |
Default |
Description |
defaultOutputAction |
"CopyToClipboard" | "AutoType" | "PasteToPreviousWindow" |
"CopyToClipboard" |
What happens when Optimize finishes |
autoTypeDelayMs |
integer |
10 |
AutoType delay in milliseconds |
defaultTemplateId |
GUID |
unset |
Default optimization template |
| Setting |
Type |
Default |
Description |
sttBackend |
"Parakeet" | "Whisper" |
"Parakeet" |
Speech-to-text engine |
whisperModel |
"Tiny" | "Base" | "Small" | "Medium" | "Large" |
"Base" |
Whisper model size (ignored by Parakeet) |
ttsEnabled |
bool |
false |
Enable text-to-speech |
ttsVoiceModelKey |
string |
"en_US-lessac-medium" |
TTS voice identifier |
| Setting |
Type |
Default |
Description |
defaultProviderId |
GUID |
unset |
Provider used when no per-mode default applies |
useSameProviderForAllModes |
bool |
true |
Use one provider across Optimize and Assistant |
modeProviderDefaults |
object |
{} |
Window mode → provider GUID |
modePersonaDefaults |
object |
{} |
Window mode → persona GUID |
| Setting |
Type |
Default |
Description |
assistantFilesFolder |
string |
unset |
The only folder the assistant may touch. Empty ⇒ no file access |
assistantDefaultWorkingDirectory |
string |
"Playground" |
Subfolder new chats start in. Empty ⇒ the folder root |
assistantFileToolsEnabled |
bool |
true |
Allow reading and writing files in that folder |
assistantGitToolsEnabled |
bool |
true |
Allow git commands in that folder |
assistantSuggestionsEnabled |
bool |
false |
Show suggested prompts on an empty chat |
assistantAgentModeDefault |
bool |
false |
Start new chats with the lever on Agent (no UI) |
alwaysAllowedTools |
array |
[] |
Standing tool grants. Managed from the settings page |
| Setting |
Type |
Default |
Description |
chatHistoryRetentionDays |
integer |
180 |
Delete chats not opened for this many days (1–730). A favorite chat is exempt |
chatAutoTitleEnabled |
bool |
false |
Generate a short title per chat (costs an extra call) |
See the Agent Runs guide for what each limit means.
| Setting |
Type |
Default |
Description |
agentMaxSteps |
integer |
24 |
Maximum steps in an interactive run |
maxToolRoundsPerStep |
integer |
24 |
Maximum tool rounds within one step |
agentWallClockMinutes |
integer |
20 |
Time limit for an interactive run |
agentMaxReplans |
integer |
2 |
Re-plans allowed after a step fails |
agentPlanReasoningTurnEnabled |
bool |
false |
Add a tool-free thinking turn before planning |
agentRunAutoApproveBuiltInWrites |
bool |
false |
Skip approval for Pia’s own write tools in agent runs and voice mode |
agentPersonaRoster |
object |
{} |
Operating mode → persona GUIDs the planner may assign to steps |
scheduledMaxSteps |
integer |
24 |
Maximum steps in a background or scheduled run |
scheduledWallClockMinutes |
integer |
45 |
Time limit for a background or scheduled run |
scheduledMaxReplans |
integer |
2 |
Re-plans allowed in a background or scheduled run |
maxParallelBackgroundRuns |
integer |
2 |
Background runs at the same time; extras queue |
maxParallelRequestsPerProvider |
integer |
4 |
Concurrent requests Pia will make to one provider (no UI) |
| Setting |
Type |
Default |
Description |
meetingAttendeeDisplayName |
string |
unset |
Name shown to other participants. Empty ⇒ “‹your name›’s assistant” |
meetingTranscriptFolder |
string |
unset |
Folder the Save… dialog opens in |
meetingBrowserSelection |
"BundledChromium" | "SystemChrome" | "SystemEdge" | "SystemDefault" |
"BundledChromium" |
Which browser Pia drives |
meetingAttendeeShowBrowserWindow |
bool |
false |
Show the browser window instead of joining hidden |
enableMeetingDiarization |
bool |
true |
Split the transcript by speaker |
meetingSmartSpeakerDetection |
bool |
true |
Let Pia tune and correct speaker assignments itself |
speakerEmbeddingThreshold |
float |
0.50 |
Voice-matching sensitivity (smart detection off) |
meetingMaxSpeakers |
integer |
0 |
Cap on distinct speakers. 0 ⇒ no limit |
meetingMinSpeechSeconds |
float |
1.5 |
Speech needed before a speaker is identified |
meetingAttendeeRosterSnapshotMinutes |
integer |
2 |
How often the participant list is re-read (no UI) |
| Setting |
Type |
Default |
Description |
autoIngestSources |
bool |
true |
Compile documents dropped into the vault’s sources folder |
privacy.tokenizationEnabled |
bool |
true |
Replace personal data with tokens before sending text to a provider |
privacy.piiKeywords |
array |
[] |
Your own PII keywords |
| Setting |
Type |
Default |
Description |
syncEnabled |
bool |
false |
Enable Pia Cloud sync |
serverUrl |
string |
unset |
Server URL, for self-hosting |
trustSelfSignedCertificates |
bool |
false |
Accept self-signed TLS certificates |
settings.json also holds state that isn’t a preference: sign-in tokens, encryption key material and device IDs, sync timestamps and ETags, window position and size, unsent drafts, column widths, and schema-version markers. Leave these alone — editing them can sign you out or, in the case of the encryption keys, cut you off from your own data.