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

- **Type:** Skill
- **Install:** `agentstack add skill-artemxtech-personal-os-skills-granola`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [ArtemXTech](https://agentstack.voostack.com/s/artemxtech)
- **Installs:** 0
- **Category:** [Productivity](https://agentstack.voostack.com/c/productivity)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [ArtemXTech](https://github.com/ArtemXTech)
- **Source:** https://github.com/ArtemXTech/personal-os-skills/tree/main/skills/granola
- **Website:** https://lab.artemzhutov.com/

## Install

```sh
agentstack add skill-artemxtech-personal-os-skills-granola
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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

```bash
# List all meetings
python3 .claude/skills/granola/scripts/granola.py list

# Get specific meeting with transcript
python3 .claude/skills/granola/scripts/granola.py get 

# 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 
```

## Commands

### list

List all Granola meetings with sync status.

```bash
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.

```bash
python3 .claude/skills/granola/scripts/granola.py get 
python3 .claude/skills/granola/scripts/granola.py get  --no-transcript
```

### sync

Sync meetings to `Meetings/` as structured Markdown.

```bash
# Sync new meetings only
python3 .claude/skills/granola/scripts/granola.py sync

# Sync specific meeting
python3 .claude/skills/granola/scripts/granola.py sync --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:

```markdown
---
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:**
```json
{
  "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

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [ArtemXTech](https://github.com/ArtemXTech)
- **Source:** [ArtemXTech/personal-os-skills](https://github.com/ArtemXTech/personal-os-skills)
- **License:** MIT
- **Homepage:** https://lab.artemzhutov.com/

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-artemxtech-personal-os-skills-granola
- Seller: https://agentstack.voostack.com/s/artemxtech
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
