Privacy & Security
OV is local-first. No telemetry, no analytics, no notes leaving for our servers. Your data lives in your vault folder, your API key lives in the OS keychain, your crash dumps live on your disk.
We talk to only two outside services
| What | When | Why |
|---|---|---|
| OpenAI API call | Only when you use the AI Copilot | You explicitly send a message |
| GitHub Releases check | Once at launch + every 6 hours | Notify you about a new OV version |
Anything else? OV doesn't make the call.
What we never send
- ❌ Usage stats, analytics, telemetry
- ❌ Crash reports (every crash stays on your local disk)
- ❌ Note contents (and even with AI, only the notes you explicitly ask about)
- ❌ Vault location or folder structure (AI gets a vault summary, never the bodies)
- ❌ IP or device identifiers (for ad targeting)
- ❌ Email or account info (we don't have accounts)
Where your data lives
| Data | Location |
|---|---|
Notes (.md files) | Your vault folder (~/Documents/OV/ by default) |
| Attachments | <vault>/.attachments/ |
| API keys | OS keychain (macOS: Keychain, Windows: DPAPI, Linux: libsecret) |
| Chat history | OS keychain (encrypted) |
| App settings | Electron userData/ (theme, sidebar width, etc. — no note contents) |
| Crash dumps | userData/Crashpad/ (local only) |
Encryption
App password (optional)
Turn it on in settings and OV asks for the password on every launch. The plaintext password lives only in memory.
File password (per-note)
Encrypt selected notes with AES-GCM-256.
- Key derivation: PBKDF2-SHA256, 200,000 iterations
- Encryption: AES-GCM-256 (authenticated encryption)
- API: WebCrypto (the browser standard)
- Plaintext: in memory only, discarded the moment the screen locks
An encrypted note is still a .md file — it stores the base64 ciphertext plus frontmatter (so Obsidian can open it, but cannot read the contents).
API key
OpenAI keys are stored via Electron's safeStorage API, encrypted in the OS keychain.
- macOS: Apple Keychain
- Windows: DPAPI (per-user encryption)
- Linux: libsecret / gnome-keyring
- iOS / Android: system Keychain / Keystore
Never written to disk in plaintext.
Defense in depth
Path traversal protection
Every file I/O goes through assertVaultRoot + safeJoin helpers (applied in 15 places). ../, absolute paths, and symlink escapes are all blocked.
Atomic writes
Every save follows the tmp → fsync → rename pattern. A mid-write crash never leaves a partial file.
Mtime conflict detection
If something outside OV (Obsidian on the same machine, another computer via sync, …) writes to the file you're editing, OV catches it and shows a conflict modal. We never overwrite silently.
Content Security Policy
script-src 'self'
connect-src 'self' ws: wss:
Scripts only from OV's own bundle; network only to self plus the explicit outbound calls (OpenAI, GitHub).
Moving / deleting your data
- Move: copy the vault folder. Open it on another machine or in another tool (e.g. Obsidian) and it just works.
- Delete: delete the vault folder. To also remove OV's keys from the OS keychain, settings → "Reset all secrets".
Mobile & sync
- iCloud sync — put your vault in iCloud Drive and desktop and mobile see the same notes. Sync runs through your iCloud only, never OV's servers (Apple's iCloud policy applies).
- Mobile key storage — your OpenAI key is encrypted in the iOS Keychain / Android Keystore.
- On-device AI — on iPhone, Apple Intelligence runs on the device, so summaries and to-do suggestions happen with no network.
GDPR / CCPA
Because OV does not collect your personal data, the "data processor" obligations of GDPR/CCPA do not apply to us. When you use the AI, the data flows directly to OpenAI under OpenAI's own policy. See our Privacy Policy for the full mapping to PIPA / GDPR / CCPA obligations.
Open-source audit
The full source is on GitHub. Found a security issue? Please open an issue — privately first if it's a vulnerability (see Contact).