Zero-knowledge sync for personal data — iMessage, WhatsApp, Apple Notes, Contacts, and more.
Nia supports end-to-end encrypted (E2E) sync for personal and sensitive data sources. With E2E mode, your plaintext never leaves your device — Nia stores only encrypted vectors and ciphertext, enabling semantic search without server-side access to your data.
Zero-knowledge guarantee: The Nia server never sees plaintext content. Encryption, embedding, and decryption all happen on your device.
The E2E encryption layer is source-agnostic — every adapter produces the same { files, cursor, stats } shape and pipes through the same buildE2ESyncBatch() pipeline.
Source
Adapter
DB / Format
Status
iMessage
imessage.ts
SQLite chat.db
Production
WhatsApp
whatsapp.ts
SQLite ChatStorage.sqlite
New
Apple Notes
notes.ts
SQLite NoteStore.sqlite
New
Apple Contacts
contacts.ts
AddressBook / vCard
New
macOS Stickies
stickies.ts
Stickies DB / plist
New
Apple Reminders
reminders.ts
SQLite
New
Screenshots
screenshots.ts
Metadata + optional OCR text
New
All adapters live in the TypeScript SDK under sdk/typescript/src/local-first/. You can add your own by following the adapter pattern.
A user-owned passphrase that never leaves your device and is never sent to the server. Stored in the macOS Keychain (or platform-equivalent secure storage). Used to derive AES-256-GCM encryption keys via PBKDF2.
Derived separately from the same passphrase. Produces deterministic HMAC-SHA256 tokens for keywords, contact hashes, and conversation hashes. These tokens enable the server to filter encrypted results without knowing the plaintext values.
All E2E sources use the zembed-1-2560 embedding profile. Embeddings are computed client-side so that query embeddings from the agent match the stored document embeddings — enabling vector similarity search over encrypted data.
Use the standard search endpoint with the e2e_session_id parameter:
Copy
Ask AI
const result = await sdk.search.query({ messages: [{ role: "user", content: "What did Alice say about the project?" }], local_folders: ["imessage-folder-id"], e2e_session_id: session.id, // desktop bridge session});
This is the most common E2E use case — indexing your iMessage history so agents can search your conversations without the server ever seeing message content.
1
Set up encryption
On first run, the desktop app prompts for a passphrase. This derives both the encryption key and blind index key. The passphrase is stored in your macOS Keychain.
Your passphrase is the only way to decrypt your data. If you lose it, Nia cannot recover your encrypted content. Store your passphrase in a password manager.