README file from
GithubObsidian Granola Sync
[!IMPORTANT] Upgrading from 2.0.x? The plugin now connects differently. Granola broke the old credential-based login in app version 7.427.0, so as of 2.1.0 this plugin uses Granola's official API instead. You'll need to create an API key in the Granola desktop app (Settings → Connectors → API keys — note that API keys require a paid Granola plan) and paste it into the plugin settings. Everything else — your synced notes and settings — carries over untouched.
This plugin pulls your Granola meeting notes and transcripts into your Obsidian vault as plain Markdown - so they're searchable, linkable, and yours to keep, instead of locked away in Granola, separate from everything else you know.
The most actively maintained Granola sync plugin, and the one that gets the details right: it syncs reliably, never leaves you with duplicate notes, and keeps everything neatly organised the way you set it up. It's built on a clean, well-tested codebase, so syncs just work and stay working.
This repo is maintained by @kayacancode.
Now built on the official Granola API
As of version 2.1.0 the plugin authenticates with a personal API key against Granola's official public API (public-api.granola.ai), replacing the old approach of decrypting the desktop app's local credential store (which Granola 7.427.0 broke). That means:
- No desktop app required on the machine running Obsidian — the plugin talks straight to the API.
- No keychain/DPAPI prompts and no credential decryption — just paste a key.
- AI summaries as the source of truth — note bodies come from Granola's
summary_markdownrather than a conversion of the raw note content, so your own typed notes no longer sync, and only meetings with a finished AI summary and transcript come through. - The "Include private notes" and "Include shared notes" settings were removed — access is governed by your API key's scope instead. Image attachments are no longer embedded.
Features
- Sync notes to daily-note sections or individual files, with configurable folders, subfolder patterns, and filename patterns
- Transcript syncing: separate files, same location as notes, or combined into the note
- Automatic bidirectional linking between notes and transcripts
- Periodic automatic syncing with a customizable interval
- Title-based include/exclude filtering and a sync-history window
- Rate-limit aware: batches requests within the public API's limits and retries on
429 - Platform support: This plugin only works on desktop. It is not supported on mobile.
Installation
- Go to https://community.obsidian.md/plugins/granola-sync
- Click Install
Setup
- In the Granola desktop app, go to Settings → Connectors → API keys and create a new key with the Personal notes scope. (Enterprise workspaces need an admin to enable API keys first.)
- In Obsidian, open the plugin settings and paste the key (
grn_…) into Granola API key. - Click Test connection to confirm it works.
- Run the command Sync from Granola, or enable periodic sync.
Upgrading from 2.0.x
- Your settings are kept — you only need to add an API key (see Setup above).
- Your existing synced files are updated in place, not duplicated. The public API uses new note IDs, but each note's
web_urlcarries the old internal ID, so the first sync re-keys existing files (matched by theirgranola_idfrontmatter, with a target-path fallback) to the new IDs. - Settings that no longer apply (credential paths, private/shared-notes toggles) are cleaned up automatically on load.
What syncs
- Meetings that have a generated AI summary and transcript — that's what the public API returns. Notes still processing (or without a summary) are skipped until Granola finishes them.
- The note body is the AI-enhanced summary (
summary_markdown). Your own raw typed notes are not exposed by the public API and no longer sync. - Transcripts (optional), with speaker names when Granola can identify them.
- Folders: notes carry their Granola folder membership in frontmatter, including nested paths.
- Attendees, timestamps, and a
web_urllink back to the note in the Granola web app.
Frontmatter structure
All synced files include structured frontmatter for tracking and deduplication:
Notes:
---
granola_id: not_1d3tmYTlCICgjy
title: "Meeting Title"
type: note
created: 2024-01-15T10:00:00Z
updated: 2024-01-15T12:00:00Z
attendees:
- John Doe
- Jane Smith
web_url: https://notes.granola.ai/d/f3e45e0f-24cc-480b-9a6c-8b1f5e3d7a2c
transcript: "[[Transcripts/Meeting Title-transcript.md]]"
---
Transcripts:
---
granola_id: not_1d3tmYTlCICgjy
title: "Meeting Title - Transcript"
type: transcript
created: 2024-01-15T10:00:00Z
updated: 2024-01-15T12:00:00Z
attendees:
- John Doe
- Jane Smith
note: "[[Granola/Meeting Title.md]]"
---
The granola_id is consistent across both note and transcript files for the same meeting, while the type field distinguishes them.
Development
Prerequisites
- Node.js 18 or later
- pnpm
Setup and building
pnpm install
pnpm build
Testing
pnpm test # run all tests
pnpm test:watch # watch mode
pnpm test:coverage # with coverage
See CONTRIBUTING.md for more.
Releasing
node scripts/release.js # auto-bump patch version
node scripts/release.js 2.1.1 # specific version
Contributing
Please see CONTRIBUTING.md for info on contributing to this project.
License
MIT
Disclaimer
This plugin is an independent project and is not affiliated with, endorsed by, or sponsored by Granola. It uses Granola's official public API with an API key you create in your own account. Do not use this plugin in any way that breaks Granola's Terms of Service — you are responsible for ensuring your use complies with them.