philfreo2k downloadsSync your Granola meeting notes, summaries, and transcripts to your vault in a simple way (no API usage). Customizable by template. Supports auto-linking of attendee Person notes.
Sync your Granola meeting notes to Obsidian.
This plugin uses Granola's official MCP API to sync meeting notes, AI summaries, and transcripts into your vault. One-time OAuth setup, then fully automatic.
There are other (1, 2) Granola plugins for Obsidian, but I found their implementation lacking for my needs. They either had unnecessary complexity or didn't support features like bringing in private notes, linking to attendee Person notes, or customizing the note template/frontmatter. This plugin fits my workflow better.
Hopefully Obsidian community plugin directory inclusion will come soon. In the meantime:
philfreo/obsidian-granola-pluginBRAT will automatically keep the plugin updated.
<vault>/.obsidian/plugins/
| Setting | Default | Description |
|---|---|---|
| Time range | Last 30 days | How far back to look for meetings |
| Sync frequency | Every 15 minutes | How often to sync. Options: Manual only, On startup, 1m, 15m, 30m, 60m, 12h |
| Sync transcripts | Off | Include full meeting transcripts (1 extra API call per meeting) |
| Folder path | Meetings |
Where to save meeting notes |
| Filename pattern | {date} {title} |
Pattern for filenames. Supports {date}, {title}, {id} |
| Template path | Templates/Granola.md |
Path to your template file |
| Show ribbon icon | On | Show a sync button in the left sidebar |
| Skip existing notes | On | Don't overwrite notes you've edited |
| Match attendees by email | On | Link attendees to notes with matching email in frontmatter |
Create a template file to customize how your meeting notes look. Use these variables:
{{granola_id}} - Unique meeting ID{{granola_title}} - Meeting title{{granola_date}} - Date (YYYY-MM-DD){{granola_url}} - Link to meeting on Granola web{{granola_start_time}} - Start time (e.g., "3:00 PM"){{granola_private_notes}} - Your notes from the meeting{{granola_enhanced_notes}} - AI-generated content (Summary, Action Items, etc.){{granola_transcript}} - Full transcript (requires "Sync transcripts" enabled){{granola_attendees}} - Comma-separated names{{granola_attendees_linked}} - With Obsidian links: [[John]], [[Jane]]{{granola_attendees_list}} - YAML list format{{granola_attendees_linked_list}} - YAML list with linksUse {{#variable}}...{{/variable}} to only render content when a variable is non-empty:
{{#granola_transcript}}
## Transcript
{{granola_transcript}}
{{/granola_transcript}}
If no template exists at the configured path, the plugin creates this default:
---
granola_id: {{granola_id}}
granola_url: {{granola_url}}
title: "{{granola_title}}"
date: {{granola_date}}
attendees:
{{granola_attendees_linked_list}}
tags:
- meeting
- granola
---
{{#granola_private_notes}}## Notes
{{granola_private_notes}}
{{/granola_private_notes}}
{{#granola_enhanced_notes}}## Summary
{{granola_enhanced_notes}}
{{/granola_enhanced_notes}}
{{#granola_transcript}}
## Transcript
{{granola_transcript}}
{{/granola_transcript}}
npm install
npm run dev # Build (watch mode)
npm run build # Build (production)
npm run package # Package for release
Per Obsidian's guidelines, tags should not use a v prefix (use 1.0.0, not v1.0.0).
MIT