Granola Sync Plus
pendingby Danny McClelland
Sync your Granola AI meeting notes to your vault with customizable settings.
Granola Sync Plus for Obsidian
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.
๐ Features
- ๐ 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
๐ฆ Installation
Manual Installation
- 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
Files to Download
main.jsmanifest.jsonstyles.cssversions.json
โ๏ธ Configuration
Access plugin settings via Settings โ Community Plugins โ Granola Sync Plus
Sync Directory
Choose which folder in your vault to sync notes to (default: Granola)
Note Prefix
Optional prefix to add to all synced note filenames (e.g., meeting-, granola-)
Auth Key Path
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.
Filename Template
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
Date Format
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)
Attendee Tagging
Automatically extract meeting attendees from Granola and add them as organized tags in your note frontmatter.
Settings:
- 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
Tag Format & Customization:
- 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
Benefits:
- 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
Granola URL Integration
Add direct links back to your original Granola notes for seamless workflow integration.
Setting:
- Include Granola URL: Enable/disable URL links in frontmatter (disabled by default)
How it works:
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"
Benefits:
- 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
Auto-Sync Frequency
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)
Filename Separator
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.
File Conflict Handling
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.
Granola Folder Organization
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.
๐ฏ Usage
Manual Sync
- 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
Auto-Sync
Set your preferred frequency in settings and the plugin will sync automatically in the background. Status updates appear in the status bar.
Status Bar Indicators
- "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)
Find Duplicate Granola Notes
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.
Skip Existing Notes
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.
Duplicate Detection & File Management
This release includes robust duplicate and file conflict management:
Find Duplicate Notes
- 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"
File Conflict Handling
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
Why Use These Tools:
- 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
How to Use:
- 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
๐งช Experimental: Search Scope for Existing Notes
โ ๏ธ Please backup your vault before using this feature!
This experimental feature allows you to control where the plugin searches for existing notes when checking for duplicates by granola_id.
Search Scope Options:
- 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
Why Use This Feature:
- 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
How to Use Safely:
- 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
Example Workflow:
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
Avoiding Duplicates:
- 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
Settings Location:
Under File Management & Duplicates section in plugin settings.
Daily Note Integration
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]]
Periodic Notes Integration
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
Attendee Tagging Usage
Once enabled, attendee tagging automatically enhances your meeting notes:
Finding Meetings by Attendee
- 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
Smart Name Detection
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)
Automatic Updates
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
Preview Your Settings
Use the preview buttons in settings to see how your filename template and date format will look before syncing.
๐ Note Format
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
๐ง Requirements
- Obsidian v1.6.6+
- Active Granola AI account
- Granola desktop app installed and authenticated (available for macOS and Windows)
๐ Troubleshooting
Plugin Won't Enable
- 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
No Notes Syncing
- 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
Authentication Issues
- 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
File Naming Issues
- Use the preview buttons to test your templates
- Avoid special characters in custom prefixes
- Check that your date format is valid
Attendee Tagging Issues
- 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
Duplicate Notes Issues
- 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
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
- Clone this repository
- Run
npm installto install dependencies - Run
npm run buildto compile - Copy files to your Obsidian plugins directory for testing
๐ฅ Contributors
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
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- 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
๐ Support
- 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.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.
