Nabheet Madan15 downloadsRead your local WhatsApp Desktop message database and mirror chats into your vault as one transcript note per conversation. Read-only, incremental, fully local — no network, no cloud, no API keys.
Mirror your WhatsApp Desktop chats into your Obsidian vault — one transcript note per conversation — by reading the app's local SQLite database. Fully local: no network, no cloud, no QR pairing, no API keys. Read-only.
📖 Setting up? See SETUP.md for exact database locations, permission notes (macOS full-disk access), and troubleshooting.
Desktop-only (it reads a local database file via Node). Not for Obsidian mobile.
WhatsApp Desktop keeps every message in a local SQLite file, ChatStorage.sqlite.
This plugin reads that file directly (via a WebAssembly build of SQLite bundled
into the plugin — nothing to install), groups messages by chat, and writes them
into your vault:
11-Whatsapp/
_Conversation Index.md
Personal/
Alice Smith 8x1k2p.md
Groups/
Project Falcon 3ff0az.md
## YYYY-MM-DD day headers.0 = all history (heavier first sync).Each note carries YAML frontmatter (source, chat_id, chat_name, kind)
plus a # Chat name heading, followed by the running transcript.
On macOS the plugin reads two files from WhatsApp's shared container
(~/Library/Group Containers/group.net.whatsapp.WhatsApp.shared/):
ChatStorage.sqlite — your messages.ContactsV2.sqlite — saved contact names, used to label senders.Both are read from temporary copies; neither is modified. On macOS this container is protected, so Obsidian needs Full Disk Access — see SETUP.md.
From source:
npm install
npm run build # produces main.js
VAULT="/path/to/your/vault" npm run install:vault
That copies main.js, manifest.json, and styles.css into
<vault>/.obsidian/plugins/whatsapp-local-sync/. Then in Obsidian: Settings →
Community plugins → Installed plugins → enable WhatsApp Local Sync.
Open Settings → WhatsApp Local Sync:
ChatStorage.sqlite was found. If not,
set Database path override (see SETUP.md for locations).Sync anytime via the ribbon icon or the "WhatsApp Local Sync: Sync now" command. Stop mid-run from settings or the Stop sync command; already-written notes are kept, and the next sync resumes from each chat's cursor.
Reset sync state (Maintenance) clears the per-chat cursors so the next sync re-reads the whole window. Existing notes are left in place (it appends, so this can duplicate recent messages — clear the notes first if you want a clean rebuild).
WhatsApp writes recent messages to a write-ahead log (ChatStorage.sqlite-wal)
before checkpointing them into the main file. The plugin reads the main file, so
the newest messages may lag by up to a checkpoint interval. Fully quitting
WhatsApp Desktop flushes the WAL; otherwise the next sync picks them up once
WhatsApp checkpoints. There are no duplicates either way (dedup is by row id).
WhatsApp · <last sync time> / WhatsApp · 45/1200 / error.[whatsapp] console output
(open devtools with Ctrl/Cmd+Shift+I). Baseline progress prints regardless.ChatStorage.sqlite from a temp directory and deletes
the copy afterwards. It never modifies the WhatsApp database.11-Whatsapp to untrusted locations.npm install
npm run dev # esbuild watch, rebuilds main.js on change
npm run typecheck # tsc --noEmit
npm run build # typecheck + minified production bundle
Source layout:
src/main.ts — plugin lifecycle, ribbon, status bar, commands, timer.src/db.ts — sql.js loader, DB path detection, windowed query.src/sync.ts — grouping, incremental append, index regeneration.src/notes.ts — filename hashing, sanitizing, race-tolerant writes.src/mactime.ts — Mac absolute-time conversion.src/settings.ts — settings UI.src/types.ts — shared types + defaults.Released under the MIT License © 2026 Nabheet Madan.
This project is an independent, community-built plugin. It is not affiliated with, endorsed by, or sponsored by WhatsApp or Meta. "WhatsApp" is a trademark of WhatsApp LLC / Meta Platforms, Inc.