Security fixes are made on the current default branch. Historical hosted builds and their services are retired and are not supported by this repository.
Do not open a public issue for a vulnerability that could expose transcripts, recordings, API keys, or allow unwanted microphone or Accessibility access.
Use GitHub's private vulnerability reporting for the repository if it is enabled. Otherwise, contact the repository maintainer privately and include:
- affected commit or version;
- macOS version and hardware architecture;
- concise reproduction steps;
- expected and observed behavior; and
- impact, including what data or permission boundary is crossed.
Please do not include real dictations, provider keys, or other personal data in a report. Use synthetic samples and redact logs.
- Provider API keys can stay in a user-selected
.envfile. If a key is pasted or recovered, it is stored in macOS Keychain, not in source code, preferences, or the transcript database. Groq, OpenRouter, and OpenAI each use one item across dictation, Smart Dictation, and Cmd + E. ElevenLabs uses one item for dictation and optional read-aloud. Custom dictation and custom text use separate items. - Launching Vibe Read and opening Settings do not read Keychain. The app reads a saved key only after explicit verification or intentional provider use. A loaded key is cached in process memory until the app quits.
- Previous-build recovery explicitly disables authentication UI. Using a
.envfile remembers its path and reads only the selected provider variable. The key is not copied into Keychain and the app never scans for credential files. - Generic provider keys created by older builds are not automatically discovered or migrated.
- Vibe Read does not request system access at startup. macOS prompts only after the user clicks Grant Access or intentionally uses a feature that needs the permission.
- Remote providers must use HTTPS. Unencrypted HTTP is allowed only for an explicitly configured loopback address.
- Transcript and audio files are local but not application-level encrypted. Use FileVault for encryption at rest.
- Accessibility permission is powerful. Install builds only from a source and signer you trust, and revoke permission in System Settings when no longer needed.
- Data sent to a configured AI provider leaves the local security boundary and is governed by that provider.
- Normal Fn dictation never sends its transcript to the text provider. Smart Dictation does. Its text request contains the raw transcript, the local Smart prompt, and a sanitized app name only. It does not include selected text, window titles, documents, screenshots, or screen contents.
- ElevenLabs voice loading and preview are explicit actions. Voice metadata may be cached in macOS preferences. Preview and read-aloud send entered text to ElevenLabs and consume provider usage.
- A stable bundle identifier and signing identity matter for macOS permissions and Keychain access. Anyone distributing a build should use their own bundle identifier, Developer ID identity, and notarization credentials. Ad hoc signing is suitable only for local development.
Before publishing or distributing a build:
- build from a reviewed, clean working tree;
- run the tests and a secret scanner;
- confirm no API keys, provisioning files, personal recordings, databases, or environment files are present;
- review the complete Git history for secrets and private data;
- use a fresh or reviewed squashed public history rather than the retired private product's full history;
- confirm the bundle identifier and signing identity are intended for the release; and
- sign and notarize binaries intended for other people.