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

WhatWhenWhy
OpenAI API callOnly when you use the AI CopilotYou explicitly send a message
GitHub Releases checkOnce at launch + every 6 hoursNotify 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

DataLocation
Notes (.md files)Your vault folder (~/Documents/OV/ by default)
Attachments<vault>/.attachments/
API keysOS keychain (macOS: Keychain, Windows: DPAPI, Linux: libsecret)
Chat historyOS keychain (encrypted)
App settingsElectron userData/ (theme, sidebar width, etc. — no note contents)
Crash dumpsuserData/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).


Related: Features · FAQ · Full docs


Back home