Configuration
Provider, model, voice, hotkey, privacy, diagnostics, and persisted defaults for FlowLens.
Runtime storage model
FlowLens has two layers of configuration:
| Layer | Purpose | Storage |
|---|---|---|
| Non-secret preferences | hotkey, mode, provider base URL, model, voice ID, mic, overlay position, privacy, updates | app.getPath('userData')/config.json |
| Secrets | provider API key and ElevenLabs API key | encrypted app.getPath('userData')/secrets.json |
| Legacy migration | older development config | one-time copy from ~/.flowlens/config.json |
In tests and lower-level config helpers, the legacy path can still be used directly. In the running Electron app, runtime-config.ts routes config through userData.
Reference shape
{
"hotkey": "CommandOrControl+Shift+Space",
"defaultMode": "error-explainer",
"firstRunComplete": false,
"provider": "openai",
"providerKey": "openai",
"providerProtocol": "auto",
"providerBaseUrl": "https://api.openai.com/v1",
"model": "gpt-4o-mini",
"apiKeys": {},
"tts": {
"model": "eleven_flash_v2_5",
"voiceId": "JBFqnCBsd6RMkjVDRZzb"
},
"audio": {
"inputDeviceId": null
},
"overlay": {
"position": { "mode": "bottom-right" }
},
"launchAtLogin": false,
"updates": {
"channel": "stable",
"autoDownload": false
},
"privacy": {
"confirmBeforeScreenshot": false,
"voicePlaybackEnabled": true
},
"diagnostics": {
"loggingEnabled": true
}
}Field guide
| Field | Purpose | Default |
|---|---|---|
provider | Adapter family. Current implementation uses the OpenAI-compatible adapter. | openai |
providerKey | Secret-store key for the active provider credential. | openai |
providerProtocol | Wire protocol for compatible endpoints. auto lets FlowLens pick from known provider presets. | auto |
providerBaseUrl | Base URL for the OpenAI-compatible API. | https://api.openai.com/v1 |
model | Model passed to /chat/completions. | gpt-4o-mini |
tts.model | ElevenLabs text-to-speech model. | eleven_flash_v2_5 |
tts.voiceId | ElevenLabs voice ID selected by setup/settings. | JBFqnCBsd6RMkjVDRZzb |
audio.inputDeviceId | Browser microphone device ID. null means system default. | null |
overlay.position | Bottom-right anchor or custom dragged position. | bottom-right |
launchAtLogin | Starts FlowLens in the background after OS login. | false |
privacy.voicePlaybackEnabled | Enables or disables spoken TTS playback. | true |
diagnostics.loggingEnabled | User-facing preference for diagnostics logging. | true |
Provider configuration
FlowLens supports providers through one OpenAI-compatible adapter plus provider-specific presets where needed:
providerKeyselects which stored secret to use.providerBaseUrlselects the API root.providerProtocolselects or infers the transport.modelselects the model.
For normal OpenAI-compatible providers, the request URL is assembled as:
{providerBaseUrl}/chat/completionsThe current setup/settings UI also includes convenience presets:
| Provider path | Base URL | Protocol | Notes |
|---|---|---|---|
| OpenAI-compatible | https://api.openai.com/v1 | openai-chat | Default adapter path for vision-capable chat completions |
| Gemini OpenAI-compatible | https://generativelanguage.googleapis.com/v1beta/openai | openai-chat | Works through Google's OpenAI-compatible chat completions surface |
| OpenCode Go | https://opencode.ai/zen/go/v1 | auto | Infers per-model protocol and capability quirks |
| Custom compatible endpoint | user supplied | user selected or auto | Useful for local gateways or hosted OpenAI-compatible APIs |
OpenCode Go has extra compatibility handling because its available models do not all behave like a single strict OpenAI clone. FlowLens can omit native response_format where the endpoint rejects it, infer text-only versus vision-capable models, avoid the short app-side request timeout for long-running models, and coerce prompt-only markdown output into the structured response contract when the answer is useful but not valid JSON.
This keeps the overlay, prompts, response parser, and voice pipeline stable while still allowing provider-specific request differences.
ElevenLabs configuration
FlowLens uses ElevenLabs for both ends of the voice loop:
scribe_v2for speech-to-text- configurable TTS for spoken summaries
The current settings UI exposes these TTS model options:
| Model | Use |
|---|---|
eleven_flash_v2_5 | Lowest latency for quick overlay responses |
eleven_turbo_v2_5 | Balanced speed and quality |
eleven_v3 | More expressive speech |
eleven_multilingual_v2 | Stable multilingual playback |
The voice picker loads available voices through the main process using the stored ElevenLabs key. The renderer never receives that key.
Settings and cleanup
The settings window and in-overlay settings panel expose:
- provider key, base URL, model, and API key
- ElevenLabs key, TTS model, and voice picker
- microphone selector
- hotkey capture and reset
- permission checks and request actions
- overlay position reset
- launch-at-login
- voice playback
- screenshot confirmation preference
- diagnostics export
- factory reset
Factory reset clears FlowLens-owned settings, encrypted secrets, diagnostics logs, and overlay position.