From granola
Sync Granola meeting notes and transcripts to the Obsidian vault. Two operations: (1) Ingest - export meetings from the local Granola cache to vault markdown files; (2) Backfill - fetch missing transcripts from the Granola API for meetings already in the vault. Use when asked to sync, export, ingest, or update Granola meetings, or when vault meeting files are missing transcripts. Always re-indexes QMD after writing files.
npx claudepluginhub adamlevoy/claude-plugins --plugin granolaThis skill uses the workspace's default tool permissions.
Two operations for keeping the Obsidian vault's `Granola-Meetings/` folder in sync.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Two operations for keeping the Obsidian vault's Granola-Meetings/ folder in sync.
Exports meetings from the local Granola cache file to vault markdown. Run this when new meetings need to be added to the vault.
python3 ~/.claude/skills/granola/scripts/ingest_granola.py \
--vault "$VAULT_DIR" [OPTIONS]
| Flag | Default | Description |
|---|---|---|
--vault DIR | $VAULT_DIR or cwd | Vault root |
--output DIR | Granola-Meetings | Subfolder within vault |
--days N | all | Only meetings from last N days |
--transcripts | — | Only meetings that have transcripts in cache |
--list | — | Preview without writing |
--dry-run | — | Show what would be exported |
Cache location: ~/Library/Application Support/Granola/cache-v4.json
Note: The local cache only stores transcripts for ~6 recent meetings. For full transcript coverage, run the backfill after ingesting.
Fetches transcripts from the Granola API for meetings already in the vault that are missing them. Run after ingest, or any time has_transcript: false files exist.
python3 ~/.claude/skills/granola/scripts/backfill_granola_transcripts.py \
--vault "$VAULT_DIR" [OPTIONS]
| Flag | Default | Description |
|---|---|---|
--vault DIR | $VAULT_DIR | Vault root |
--output DIR | Granola-Meetings | Subfolder within vault |
--dry-run | — | Preview without writing |
--force | — | Re-fetch even if has_transcript: true |
--delay N | 0.3 | Seconds between API calls |
Auth token: ~/Library/Application Support/Granola/supabase.json → workos_tokens.access_token. If API calls fail, re-open Granola to refresh the token.
# 1. Ingest new meetings from cache
python3 ~/.claude/skills/granola/scripts/ingest_granola.py --vault "$VAULT_DIR"
# 2. Backfill missing transcripts from API
python3 ~/.claude/skills/granola/scripts/backfill_granola_transcripts.py --vault "$VAULT_DIR"
# 3. Re-index QMD
qmd update
has_transcript: true filesqmd update re-indexes for BM25 search; qmd embed generates vectors for semantic search (optional)