Skip to content
alyn
ArtemXTech

Granola 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.

$npx skills add ArtemXTech/personal-os-skills --skill granola
View this skill on GitHubArtemXTech/personal-os-skills/skills/granola/SKILL.md
Pack stars
552
Pack installs
159
Alyn Score
50/99
Updated
10 days ago
License
MIT
– views – installs via Alyn

ArtemXTech

Granola

Install Granola

Pick your agent. Every command is ready to paste.

$npx skills add ArtemXTech/personal-os-skills --skill granola

The open skills CLI detects your agents (Claude Code, Cursor, Codex and 70+ more) and installs to the right folder. Add -g to install globally.

01

Install it

Run the command above, or upload the folder in Claude.

02

Ask naturally

Describe the task. Your agent loads granola when the request matches its description.

03

Name it if needed

If it does not trigger, say “use the granola skill”. In Codex, type $granola.

The skill itself

SKILL.md

FolderGitHub

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

Tips for Granola

  • • Start a fresh session after installing so your agent picks up the new skill.
  • • This skill ships scripts. Read them before the first run, and run it in a project without secrets first.
  • • It bundles reference files. The agent reads them only when needed, so they cost no context until then.
  • • It is part of a pack with 8 skills. Install only the ones you need with --skill to keep triggers precise.
  • • If two skills overlap, mention the one you want by name.

Questions about Granola

What does the Granola skill do?

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.

How do I install Granola?

Run "npx skills add ArtemXTech/personal-os-skills --skill granola" in your project. The skills CLI installs it for Claude Code, Cursor, Codex and 70+ other agents. In Claude on the web, upload the skill folder as a ZIP under Customize > Skills.

Does Granola work in Cursor and Codex?

Yes. Granola uses the open SKILL.md format, so it works in Claude Code, Claude, Cursor, OpenAI Codex, Gemini CLI, GitHub Copilot and other agents that support agent skills.

Is Granola free?

Granola is open source on GitHub under the MIT license. It is free to install; check the license before commercial use.

Who made Granola?

Granola is published by ArtemXTech in the ArtemXTech/personal-os-skills repository, together with 7 other skills.

Similar skills. From other creators.