Syncs Granola meeting notes to Obsidian vault. Reads from Granola's local cache to extract meeting metadata and notes, then creates properly formatted markdown files with frontmatter...
Manual formatting:
When local cache has no notes, ask user to copy from Granola app.
~/Library/Application Support/Granola/cache-v3.json
{
"cache": "{\"state\":{\"documents\":{...}}}" // nested JSON string
}
Each document contains:
id - unique meeting IDtitle - meeting titlenotes_markdown - notes content (often empty)notes_plain - plain text versiongoogle_calendar_event.start.dateTime - meeting timegoogle_calendar_event.attendees - list with email fieldsfor doc in docs.values(): md = doc.get('notes_markdown', '') if md and len(md) > 50: title = doc.get('title', 'Untitled') cal = doc.get('google_calendar_event') or {} start = cal.get('start') or {} dt = start.get('dateTime', '')[:10] print(f'{dt} | {title[:40]} | {len(md)} chars') "
</read_cache>
### Output File Format
<file_format>
**Filename:** `YYYY-MM-DD-kebab-case-title.md`
**Location:** Project meetings folder (e.g., `Projects/project-name/meetings/`)
```markdown
---
type: meeting
project: <project-name>
status: active
date: YYYY-MM-DD
attendees:
- name1
- name2
source: granola
granola-id: <meeting-id>
tags:
- meeting
---
# Meeting Title
**Date**: YYYY-MM-DD
**Attendees**: Name1, Name2
---
## Notes
<notes_markdown content>
Ask for metadata if not obvious:
Structure the content:
---
type: meeting
project: <project>
status: active
date: YYYY-MM-DD
attendees:
- name1
- name2
source: granola-manual
tags:
- meeting
---
# Topic Name
**Date**: YYYY-MM-DD
**Attendees**: Name1, Name2
---
## Summary
<2-3 sentence summary>
## Key Decisions
- Decision 1
- Decision 2
## Discussion Notes
<cleaned transcript, organized by topic>
## Action Items
- [ ] Action 1 (owner)
- [ ] Action 2 (owner)
When syncing from cache:
š„ **Granola Sync**
Found X meetings with notes:
- YYYY-MM-DD: Meeting Title (XXX chars)
Syncing to `Projects/project/meetings/`...
ā Created: 2025-01-28-meeting-title.md
When no notes in cache:
š„ **Granola Sync**
Found X meetings but none have local notes cached.
Paste transcript content and I'll format it.