Skip to main content
Everything runs on 127.0.0.1, transcripts stay in your own space, and secrets live only in the platform keychain.

Quick Start

1

Find your data

The engine reports its real location at GET /health as data_dir β€” the app’s Reveal in Finder uses that path, so it honours any override.
2

Export it

Use Export all β€” it copies your data to the clipboard.
3

Delete it

Delete all removes stored conversations; Reveal in Finder opens the folder.

Where Data Lives

The data directory is platform-specific and overridable with PRAISONAI_DESKTOP_HOME. Ask the engine for the true path: /health returns data_dir, which honours every override β€” so the copy data folder action reports the path the app actually uses.
An empty env var is treated as unset. PRAISONAI_DESKTOP_HOME="" or XDG_DATA_HOME="" no longer makes the Rust shell and the Python engine pick different directories β€” both fall back to the default.
Export writes to the clipboard, not a file. The webview sandbox blocks self-initiated downloads, so the app copies your data out instead. A failed Export now shows a That did not run: … toast and leaves the clipboard untouched, so a stale paste cannot masquerade as a backup β€” see Troubleshooting.

What Stays Local

The engine listens only on 127.0.0.1, refuses cross-origin browser requests it does not recognise, and cloud API keys are the sole path off-device.
Loopback binding alone is not enough β€” a page in the user’s own browser can reach 127.0.0.1 with a two-line fetch. The engine also refuses browser origins it does not recognise; see the Browser Origin Gate for the full allowed/refused table.
Secrets are never written to settings.json. The api_key is stored in the platform keychain and stripped before the file is saved.

Secrets

Secrets go to the platform store β€” the macOS keychain, Windows DPAPI, or the freedesktop secret service β€” with a plaintext file fallback for machines with no keyring.
PRAISONAI_DESKTOP_HOME isolates the data directory but not the system keyring, which is shared per user. Set PRAISONAI_KEYCHAIN_SERVICE too when you need a fully isolated profile.

Secret Store Guarantees

The secret store is durable and tightened, so a transient glitch can never quietly lose or leak a credential.

Environment & Overrides

Point the app at your own runtime, engine, or data folder with these variables.
OPENAI_API_KEY and OPENAI_API_BASE you set in your own shell survive the app closing. Only values the engine exported from settings are cleared on exit.

HTTP Endpoints

The engine speaks plain HTTP on 127.0.0.1. The routes the app relies on:
Mutating and reading routes require an allowed Origin header when the caller is a browser β€” a refused browser origin gets 403 with no CORS headers. Local processes (CLI, script, curl) with no Origin header keep working. See the Browser Origin Gate.

Accessibility

The interface is built for screen readers and keyboard use, and tests enforce each invariant.

UI Scaling

font_size drives a --ui-scale CSS variable and everything downstream is rem, so one change scales the whole interface.
A layout test fails on any dimensional pixel value over 3px, so rem-based scaling is a hard invariant β€” not a nice-to-have.

Best Practices

Transcripts are plain JSON you can read, diff, and back up. Copy chats/ to keep your history safe across app updates.Restoring: copy individual chats/<id>.json object files back into chats/. Do not drop the Export clipboard payload (a JSON array) into chats/ β€” the app surfaces it as an (unreadable) row and moves on, but the transcripts inside will not appear as chats. Split the array into per-conversation object files first, or re-import a copy of the original chats/ folder.
Set PRAISONAI_DESKTOP_HOME to point the app at a separate data directory β€” useful for testing or keeping profiles apart.
Point base_url at a local server so even the model runs on-device and no data leaves the machine.

Models & API Keys

How keys are kept in the keychain

Environment Variables

Every variable that changes where data and secrets live