From sync-claude-sessions-skill
Queries and syncs Granola AI meeting notes and transcripts from local cache to Obsidian vault as Markdown files. Supports list, get, sync commands via Python CLI.
npx claudepluginhub artemxtech/personal-os-skills --plugin recall-skillThis skill uses the workspace's default tool permissions.
Query and sync Granola AI meeting notes to Obsidian vault.
Syncs Granola meeting transcripts, summaries, and notes to local disk from macOS app auth. Enables bash searches by title, content, date, or attendees.
Accesses Granola meeting data from local cache, MCP server, or Enterprise API for dev workflows like extracting action items into code and syncing to tools.
Processes raw meeting transcripts into structured Obsidian notes with YAML frontmatter, action items, summary, and formatted transcript. Useful for Granola transcripts or direct pastes.
Share bugs, ideas, or general feedback.
Query and sync Granola AI meeting notes to Obsidian vault.
Granola stores everything locally at ~/Library/Application Support/Granola/cache-v3.json:
No API calls needed - reads directly from local cache.
# List all meetings
python3 .claude/skills/granola/scripts/granola.py list
# Get specific meeting with transcript
python3 .claude/skills/granola/scripts/granola.py get <id>
# Sync new meetings to vault
python3 .claude/skills/granola/scripts/granola.py sync
# Sync specific meeting
python3 .claude/skills/granola/scripts/granola.py sync --id <id>
List all Granola meetings with sync status.
python3 .claude/skills/granola/scripts/granola.py list
python3 .claude/skills/granola/scripts/granola.py list --limit 5
Output:
[โ] 2026-01-09 Team Sync - Weekly
ID: abc123...
Transcript: 450 segments, ~86 min
[ ] 2026-01-10 Team Standup
ID: def456...
Transcript: 120 segments, ~15 min
[โ] = already synced to vault[ ] = not synced yetView full meeting details and transcript.
python3 .claude/skills/granola/scripts/granola.py get <id>
python3 .claude/skills/granola/scripts/granola.py get <id> --no-transcript
Sync meetings to Meetings/ as structured Markdown.
# Sync new meetings only
python3 .claude/skills/granola/scripts/granola.py sync
# Sync specific meeting
python3 .claude/skills/granola/scripts/granola.py sync --id <id>
# Re-sync all (overwrites existing)
python3 .claude/skills/granola/scripts/granola.py sync --all
Synced meetings are saved to Meetings/ with this structure:
---
type: granola-meeting
date: 2026-01-09
time: "19:30"
duration_min: 86
granola_id: abc123...
people:
- "[[Sarah Chen]]"
topics: []
status: raw
---
# Meeting Title
## Notes
(Your notes from Granola)
## Transcript
[19:30:45] ๐ค Hey, how's it going?
[19:30:48] ๐ค Great to meet you...
Transcript icons:
python3 .claude/skills/granola/scripts/granola.py syncstatus: raw to status: processedUse Granola.base to query synced meetings:
| View | Filter |
|---|---|
| Recent | Last 7 days |
| Needs Processing | status = raw |
| By Person | Grouped by people field |
Local cache: ~/Library/Application Support/Granola/cache-v3.json
cache (JSON string) โ state โ
โโโ documents: {id: {title, notes_plain, notes_markdown, people, created_at}}
โโโ transcripts: {id: [{text, source, start_timestamp, end_timestamp}]}
Transcript segment:
{
"text": "Hey, how's it going?",
"source": "microphone",
"start_timestamp": "2026-01-09T19:30:45.123Z",
"end_timestamp": "2026-01-09T19:30:48.456Z"
}