/granola
Query and sync Granola meetings to Obsidian vault. Use when user mentions Granola, meeting transcripts, or wants to sync meeting notes. Reads from local cache - no API needed.
$ npx -y skills add ArtemXTech/claude-code-obsidian-starter --skill granola --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/granola
Context preview
The summary Claude sees to decide when to auto-load this skill.
Query and sync Granola meetings to Obsidian vault. Use when user mentions Granola, meeting transcripts, or wants to sync meeting notes. Reads from local cache - no API needed.
SKILL.md
granola.SKILL.mdname: granola
description: Query and sync Granola meetings to Obsidian vault. Use when user mentions Granola, meeting transcripts, or wants to sync meeting notes. Reads from local cache - no API needed.
Granola Skill
Query and sync Granola AI meeting notes to Obsidian vault.
How It Works
Granola stores everything locally at `~/Library/Application Support/Granola/cache-v3.json`:
- Documents (meetings with title, notes, people)
- Transcripts (real-time, with timestamps and source)
- Updates in real-time as you record
No API calls needed - reads directly from local cache.
Quick Start
# 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>
Commands
list
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 yet
get
View 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
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
Output Format
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:**
- 🎤 = microphone (you)
- 🔊 = system audio (others on call)
Workflow
1. **Record meeting** in Granola (real-time transcription) 2. **Sync to vault**: `python3 .claude/skills/granola/scripts/granola.py sync` 3. **Process meeting**: Extract action items, update people notes 4. **Mark as processed**: Change `status: raw` to `status: processed`
Querying with Bases
Use `Granola.base` to query synced meetings:
| View | Filter | |------|--------| | Recent | Last 7 days | | Needs Processing | status = raw | | By Person | Grouped by people field |
Data Structure
**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"
}Tips
- **Real-time access**: Cache updates as you record - can query mid-meeting
- **Free tier hack**: Sync hourly to bypass 7-day history limit
- **No auth needed**: Uses local files, not API
Read more
name: granola description: Query and sync Granola meetings to Obsidian vault. Use when user mentions Granola, meeting transcripts, or wants to sync meeting notes. Reads from local cache - no API needed.
Granola Skill
Query and sync Granola AI meeting notes to Obsidian vault.
How It Works
Granola stores everything locally at `~/Library/Application Support/Granola/cache-v3.json`:
- Documents (meetings with title, notes, people)
- Transcripts (real-time, with timestamps and source)
- Updates in real-time as you record
No API calls needed - reads directly from local cache.
Quick Start
# 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>
Commands
list
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 yet
get
View 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
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
Output Format
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:**
- 🎤 = microphone (you)
- 🔊 = system audio (others on call)
Workflow
1. **Record meeting** in Granola (real-time transcription) 2. **Sync to vault**: `python3 .claude/skills/granola/scripts/granola.py sync` 3. **Process meeting**: Extract action items, update people notes 4. **Mark as processed**: Change `status: raw` to `status: processed`
Querying with Bases
Use `Granola.base` to query synced meetings:
| View | Filter | |------|--------| | Recent | Last 7 days | | Needs Processing | status = raw | | By Person | Grouped by people field |
Data Structure
**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"
}Tips
- **Real-time access**: Cache updates as you record - can query mid-meeting
- **Free tier hack**: Sync hourly to bypass 7-day history limit
- **No auth needed**: Uses local files, not API
Free starter kit: Claude Code + Obsidian. Pre-configured vault with skills for projects, tasks, clients, and daily routines. Just open and go.
Other skills on claude-code-obsidian-starter.
- /client
Manage client relationships. USE WHEN user asks about clients, follow-ups, client emails, or who needs attention.
Open skill - /query
Query data from this vault. USE WHEN user asks about projects, clients, tasks, daily notes. Use grep to extract frontmatter - do NOT read full files.
Open skill - /review
Daily and weekly review workflows. USE WHEN user says "morning routine", "evening routine", "weekly review", "start my day", "end of day".
Open skill - /tasknotes
Create, update, delete, and list tasks via HTTP API. USE WHEN user wants to create tasks, mark done, update status, or manage tasks.
Open skill

