Nabheet Madan198 downloadsSync Gmail into your vault as one note per email plus a per-label thread index. Incremental history sync, PKCE auth, configurable labels, and a Google Calendar upcoming-meetings sidebar.
Sync Gmail into your Obsidian vault as one note per email plus a per-label thread index, and mirror your Google Calendar into an Upcoming meetings sidebar with one note per event (auto-linked to related emails).
Built as a sibling to the Outlook Mailbox plugin and shares its design: incremental sync, PKCE auth, always-on progress logging, per-request timeouts, per-item resilience, and a cooperative Stop.
10-Mailbox/Gmail/<Subfolder>/ (configurable), with YAML frontmatter (from, to, cc, date, labels, thread id, web link)._Thread Index.md per label grouping messages by conversation.history.list — only changes since the last run. First run enumerates the whole label (optionally filtered by a start date).You need a Google Cloud OAuth client. It's free.
Error 403: org_internal for any account outside your Google Workspace organization — switch it to External. (A personal Gmail-owned project is External-only, so you may not see this choice.)http://127.0.0.1:<port>) redirects without registering a port.Then in Obsidian: Settings → Gmail Mailbox → Connect. A browser tab opens for consent; approve and return to Obsidian.
https://www.googleapis.com/auth/gmail.readonly — read mail.https://www.googleapis.com/auth/calendar.readonly — read calendar.Read-only. The plugin never modifies your mailbox or calendar.
npm install
npm run build
VAULT="/path/to/your/vault" npm run install:vault
Then enable Gmail Mailbox under Settings → Community plugins.
historyId, then lists every message id in the label (messages.list, paginated) and writes a note for each. The captured historyId becomes the cursor.history.list?startHistoryId=<cursor>&labelId=<id> and only fetches messages that were added to (or newly labelled with) that label; removals and label-removals trash the corresponding notes.Use Settings → Maintenance → Reset sync state to force a clean full re-enumeration.
Hit Stop in Settings → Maintenance, or run the Gmail Mailbox: Stop sync command. The sync unwinds at the next message/page checkpoint. The interrupted label's history cursor is deliberately not advanced, so the next sync re-fetches whatever was missed — no silently-skipped mail.
The OAuth refresh token and your client secret are stored in the plugin's data.json inside your vault, in plain text (same as the Outlook plugin). They are not encrypted at rest. Anyone with read access to your vault files can read them. Keep your vault private; revoke access anytime at https://myaccount.google.com/permissions.
[obs-gmail] lines. Baseline progress (label start/finish, page counts, summary) always prints, regardless of the Debug toggle.access_denied / app not verified — add your address as a Test user on the OAuth consent screen.invalid_client — the Client ID/secret don't match, or the client isn't a Desktop-app type.