An Obsidian plugin that automatically syncs your Granola AI meeting notes to your Obsidian vault with full customization options and real-time status updates.
Note: This plugin was recently renamed from "Granola Sync" to "Granola Sync Plus" and the plugin ID changed from
granola-synctogranola-sync-plusas part of our submission to the Obsidian Community Plugin catalog. If you previously installed the plugin manually, you'll need to rename your.obsidian/plugins/granola-sync/folder to.obsidian/plugins/granola-sync-plus/and restart Obsidian.
- π Automatic Sync: Configurable auto-sync from every minute to daily, or manual-only
- π Status Bar Integration: Real-time sync status in the bottom right corner (no more popup spam!)
- π Custom Date Formats: Support for multiple date formats (YYYY-MM-DD, DD-MM-YYYY, etc.)
- π Flexible Filename Templates: Customize how notes are named with variables like date, time, and title
- π Custom Directory: Choose where in your vault to sync notes
- π·οΈ Note Prefixes: Add custom prefixes to all synced notes
- π§ Custom Auth Path: Override the default Granola credentials location
- ποΈ Daily Note Integration: Automatically add today's meetings to your Daily Note with times and links
- π Periodic Notes Support: Full integration with the Periodic Notes plugin for flexible daily note management
- π·οΈ Attendee Tagging: Automatically extract meeting attendees and add them as organized tags (e.g.,
person/john-smith) - π Granola URL Links: Add direct links back to original Granola notes in frontmatter for easy access
- π§ Smart Filtering: Exclude your own name from attendee tags with configurable settings
- π‘οΈ Preserve Manual Additions: Option to skip updating existing notes, preserving your tags, summaries, and custom properties
- β¨ Rich Metadata: Includes frontmatter with creation/update dates and Granola IDs
- π Content Conversion: Converts ProseMirror content to clean Markdown
- π Update Handling: Intelligently updates existing notes instead of creating duplicates
- π Duplicate Detection: Find and review duplicate notes with the "Find Duplicate Granola Notes" command
- βοΈ Customizable Filename Separators: Choose how words are separated in filenames (underscore, dash, or no separator)
- π‘οΈ Smart File Conflict Handling: Skip duplicate filenames or create timestamped versions automatically
- π Granola Folder Organization: Mirror your Granola folder structure in Obsidian with automatic folder-based tagging
- Download the latest release from the Releases page
- Extract the files to your vault's plugins directory:
.obsidian/plugins/granola-sync-plus/ - Enable the plugin in Obsidian Settings β Community Plugins
- Configure your sync settings
main.jsmanifest.jsonstyles.cssversions.json
Access plugin settings via Settings β Community Plugins β Granola Sync Plus
Choose which folder in your vault to sync notes to (default: Granola)
Optional prefix to add to all synced note filenames (e.g., meeting-, granola-)
Path to your Granola authentication file. Default locations:
- macOS:
Users/USERNAME/Library/Application Support/Granola/supabase.json - Windows:
AppData/Roaming/Granola/supabase.json
The plugin automatically detects your operating system and sets the appropriate default path.
Customize how your notes are named using these variables:
{title}- The meeting/note title{id}- Granola document ID{created_date}- Creation date{updated_date}- Last updated date{created_time}- Creation time{updated_time}- Last updated time{created_datetime}- Full creation date and time{updated_datetime}- Full updated date and time
Example Templates:
{created_date}_{title}β2025-06-06_Team_Standup_Meeting.mdMeeting_{created_datetime}_{title}βMeeting_2025-06-06_14-30-00_Team_Standup_Meeting.md
Customize date formatting using these tokens:
YYYY- 4-digit year (2025)YY- 2-digit year (25)MM- 2-digit month (06)DD- 2-digit day (06)HH- 2-digit hours (14)mm- 2-digit minutes (30)ss- 2-digit seconds (45)
Popular Formats:
YYYY-MM-DDβ 2025-06-06 (ISO)DD-MM-YYYYβ 06-06-2025 (European)MM-DD-YYYYβ 06-06-2025 (US)DD.MM.YYβ 06.06.25 (German)
Automatically extract meeting attendees from Granola and add them as organized tags in your note frontmatter.
- Include Attendee Tags: Enable/disable attendee tagging (disabled by default)
- Exclude My Name from Tags: Remove your own name from attendee tags (recommended)
- My Name: Set your name as it appears in Granola meetings for filtering
- Attendee Tag Template: Customize the tag structure using
{name}placeholder
- Default format:
person/{name}(e.g., "John Smith" βperson/john-smith) - Customizable structure: Use the template setting to organize tags your way
- Template examples:
people/{name}βpeople/john-smith(group under "people")meeting-attendees/{name}βmeeting-attendees/john-smith(descriptive grouping)attendees/{name}βattendees/john-smith(simple grouping)contacts/work/{name}βcontacts/work/john-smith(multi-level hierarchy)
- Name processing: Special characters removed, spaces become hyphens, all lowercase
- Easy searching: Find all meetings with specific people using
#person/john-smith - Clean organization: All attendee tags grouped under
person/prefix - Smart filtering: Your name is automatically excluded from tags
- Retroactive updates: Can update existing notes with attendee tags while preserving content
Add direct links back to your original Granola notes for seamless workflow integration.
- Include Granola URL: Enable/disable URL links in frontmatter (disabled by default)
When enabled, each synced note includes a granola_url field in the frontmatter that links directly to the original note in the Granola web app:
granola_url: "https://notes.granola.ai/d/abc123def456"- Quick access: One-click to open the original note in Granola
- Cross-platform: Works with both desktop and web versions of Granola
- Always current: URL automatically generated from document ID
- Non-intrusive: Appears cleanly in frontmatter without cluttering note content
Choose how often to automatically sync:
- Never (manual only)
- Every 1-2 minutes (frequent)
- Every 5-15 minutes (recommended)
- Every 30 minutes to 24 hours (conservative)
Customize how words are separated in generated filenames:
_(underscore) - Default:Team_Standup_Meeting.md-(dash):Team-Standup-Meeting.md- `` (none):
TeamStandupMeeting.md
Use Case: Match your preferred naming convention or organizational standards.
Choose what happens when a file with the same name already exists:
- Skip - Don't create a new file (preserves existing file)
- Timestamp - Create a timestamped version (e.g.,
Meeting_14-30.md)
Use Case: Prevents accidental overwrites while giving you flexibility in conflict resolution.
Automatically organize synced notes to mirror your Granola folder structure:
- Enable Granola Folders: Organize notes by their Granola folder
- Folder Tag Template: Customize how folder hierarchy becomes tags (e.g.,
folder/{name})
Example: A note in Granola's "Team Meetings/Standups" folder becomes tagged as folder/Team_Meetings and folder/Standups.
- Click the sync icon in the ribbon (left sidebar)
- Use Command Palette: "Sync Granola Notes"
- Click "Sync Now" in plugin settings
- Watch the status bar (bottom right) for real-time progress
Set your preferred frequency in settings and the plugin will sync automatically in the background. Status updates appear in the status bar.
- "Granola Sync: Idle" - Ready to sync
- "Granola Sync: Syncing..." - Currently syncing (with animation)
- "Granola Sync: X notes synced" - Success (shows for 3 seconds)
- "Granola Sync: Error - [details]" - Error occurred (shows for 5 seconds)
Identify and manage duplicate notes that may have been created across multiple sync cycles.
How to use:
- Click the search icon in the ribbon (left sidebar)
- Use Command Palette: "Find Duplicate Granola Notes"
- The plugin scans your vault for notes with duplicate Granola IDs and creates a report file
Output: A duplicates report file listing all conflicts with their locations, making it easy to:
- Review which notes are duplicates
- Decide which versions to keep
- Clean up your vault manually if needed
Note: This uses the granola_id in frontmatter to identify duplicates, so renamed files are correctly recognized.
When enabled, notes that already exist in your vault will not be updated during sync. This is perfect for preserving any manual additions you've made such as:
- Custom tags
- Personal summaries
- Additional notes or comments
- Custom frontmatter properties
How it works: The plugin uses the granola_id in the frontmatter to identify existing notes, so you can safely:
- Rename note files
- Change filename templates
- Modify note titles
- Move notes within the sync directory
As long as you don't modify the granola_id field, the plugin will recognize them as the same note.
Note: New notes from Granola will still be imported, but existing ones won't be overwritten.
This release includes robust duplicate and file conflict management:
- New Command: Scans vault for notes with duplicate Granola IDs
- Report Output: Creates a dedicated duplicates file for easy review
- Usage: Ribbon icon or Command Palette β "Find Duplicate Granola Notes"
Control how the plugin handles naming conflicts:
- Skip Mode: Don't create new files if a name already exists
- Timestamp Mode: Add timestamps to create unique filenames automatically
- Avoid accidental duplicates: Sync can create duplicates when notes have the same title or filename
- Clean vault management: Identify problematic duplicates and clean them up
- Prevent overwrites: Choose whether to skip or timestamp when conflicts occur
- Run "Find Duplicate Granola Notes" to scan for existing duplicates
- Review the generated report file
- Manually clean up duplicates if needed
- Set your preferred
existingFileActionin settings for future syncs - Re-run sync with confidence
This experimental feature allows you to control where the plugin searches for existing notes when checking for duplicates by granola_id.
- Sync Directory Only (Default): Only searches within your configured sync directory
- Entire Vault: Searches all markdown files in your vault (allows you to move notes anywhere)
- Specific Folders: Search only in folders you specify
- Organize freely: Move your Granola notes to different folders without creating duplicates
- Flexible workflows: Keep meeting notes in project folders, daily folders, or anywhere you prefer
- Avoid duplicates: Plugin finds existing notes regardless of their location
- Backup your vault first!
- Test with manual sync: Change settings, then run manual sync to test
- Use the tools:
- "Find Duplicate Notes" - scan for existing duplicates
- "Re-enable Auto-Sync" - restart auto-sync after testing
- Consider "Entire Vault": Safest option if you want to move notes around
1. You have notes in "Granola/" folder
2. You want to organize them by project: "Projects/ProjectA/", "Projects/ProjectB/"
3. Set search scope to "Entire Vault"
4. Move your existing notes to project folders
5. Run manual sync to test - no duplicates created!
6. Re-enable auto-sync
- Before changing settings: Move notes to new location OR use "Entire Vault" search
- After changing settings: Run manual sync first, then re-enable auto-sync
- If you get duplicates: Use "Find Duplicate Notes" tool to identify and clean them up
Under File Management & Duplicates section in plugin settings.
When enabled, today's Granola meetings automatically appear in your Daily Note:
## Granola Meetings
- 09:30 [[Granola/2025-06-09_Team_Standup|Team Standup]]
- 14:00 [[Granola/2025-06-09_Client_Review|Client Review Meeting]]The plugin now supports the Periodic Notes plugin for enhanced daily note management:
- Independent Integration: Works alongside or instead of Daily Notes integration
- Plugin Detection: Automatically detects if Periodic Notes plugin is available
- Flexible Configuration: Separate section heading configuration for Periodic Notes
- Seamless Workflow: Integrates with Periodic Notes' daily note creation and templating
Setup Requirements:
- Install and enable the Periodic Notes plugin
- Configure your daily note templates in Periodic Notes settings
- Enable "Periodic note integration" in Granola Sync settings
- Customize the section heading as desired
Once enabled, attendee tagging automatically enhances your meeting notes:
- Search by tag: Use
#person/john-smithto find all meetings with John Smith - Tag panel: Browse all
person/tags in Obsidian's tag panel - Graph view: Visualize meeting connections through attendee relationships
The plugin extracts attendee names from:
- Granola's
peoplefield (primary source) - Google Calendar attendee information (if available)
- Email addresses (converts to readable names when needed)
When both "Skip Existing Notes" and "Include Attendee Tags" are enabled:
- Content preserved: Your manual edits, summaries, and custom properties remain untouched
- Tags updated: Attendee tags are refreshed based on current meeting data
- Non-person tags preserved: Your custom tags are kept alongside attendee tags
Example workflow:
- Enable attendee tagging in settings
- Set your name (e.g., "Danny McClelland") to exclude from tags
- Run sync - existing notes get attendee tags, content stays the same
- Future syncs keep attendee tags current while preserving your edits
Use the preview buttons in settings to see how your filename template and date format will look before syncing.
Synced notes include rich frontmatter with metadata:
---
granola_id: abc123def456
title: "Team Standup Meeting"
granola_url: "https://notes.granola.ai/d/abc123def456"
created_at: 2025-06-06T14:30:00.000Z
updated_at: 2025-06-06T15:45:00.000Z
tags:
- people/john-smith
- people/sarah-jones
- people/mike-wilson
---
# Team Standup Meeting
Your converted meeting content appears here in clean Markdown format.
- Action items are preserved
- Headings maintain their structure
- All formatting is converted appropriately- Obsidian v1.6.6+
- Active Granola AI account
- Granola desktop app installed and authenticated (available for macOS and Windows)
- Check that all plugin files are in the correct directory
- Ensure you have the latest version of Obsidian
- Check the console (Ctrl/Cmd + Shift + I) for error messages
- Verify your Granola auth key path is correct
- Check that you have meeting notes in your Granola account
- Ensure the sync directory exists or can be created
- Look for error messages in the Obsidian console
- Make sure Granola desktop app is logged in
- Check that the auth key file exists at the expected location:
- macOS:
~/Library/Application Support/Granola/supabase.json - Windows:
C:\Users\[USERNAME]\AppData\Roaming\Granola\supabase.json
- macOS:
- If the file is in a different location, update the "Auth Key Path" in plugin settings
- Try logging out and back in to Granola
- Use the preview buttons to test your templates
- Avoid special characters in custom prefixes
- Check that your date format is valid
- No attendee tags appearing: Check that "Include Attendee Tags" is enabled in settings
- Your name still appears in tags: Update "My Name" setting to match exactly how it appears in Granola
- Missing attendees: Some meeting platforms may not provide complete attendee information
- Duplicate tags: The plugin automatically prevents duplicate tags - check for variations in name formatting
- Tags not updating: Ensure both "Skip Existing Notes" and "Include Attendee Tags" are enabled for updates
- Seeing duplicates: Use "Find Duplicate Granola Notes" command to identify and review them
- Want to prevent duplicates: Set "File Conflict Handling" to either "Skip" or "Timestamp"
- Duplicates created during sync: Likely from multiple sync runs with same notes - use the duplicate finder to clean up
- Can't find duplicates tool: Check ribbon icons (left sidebar) or use Command Palette
Contributions are welcome! Please feel free to submit a Pull Request.
- Clone this repository
- Run
npm installto install dependencies - Run
npm run buildto compile - Copy files to your Obsidian plugins directory for testing
Thank you to all the contributors who have helped improve this plugin:
- @amscad - Duplicate detection, filename customization, and CLAUDE.md
- @rylanfr - Dynamic tag preservation and conditional fixes
- @CaptainCucumber - Transcript inclusion and date-based folders
- @andrewsong-tech - Historical notes sync and folder reorganization
This project is licensed under the MIT License - see the LICENSE file for details.
- With thanks to Joseph Thacker for first discovering that it's possible to query the Granola API using locally stored auth keys!
- Granola AI for creating an amazing meeting assistant
- The Obsidian community for plugin development resources
- Contributors and testers who helped improve this plugin
- Issues: GitHub Issues
- Documentation: This README and plugin settings descriptions
- Community: Obsidian Discord #plugin-dev channel
Made with β€οΈ by Danny McClelland
Not officially affiliated with Granola AI or Obsidian.

