← ClaudeAtlas

granola-synclisted

On-demand pull of fresh calls/meetings from Granola (summaries + transcripts + participants) into the Obsidian vault via the official API. Incremental + idempotent (dedup by note id + updated_at) — safe to re-run, no duplicates. Trigger on "/granola-sync", "pull granola", "refresh meetings".
tonydzi/second-brain-starter-kit · ★ 1 · AI & Automation · score 70
Install: claude install-skill tonydzi/second-brain-starter-kit
OBJECTIVE: Incrementally pull fresh meetings/calls from Granola into the vault (summary + full transcript + participants + a calendar match), on demand. Idempotent: the script downloads only what is new or changed (state.json: note id → updated_at). CONTEXT: - Transport: the official Granola public API `https://public-api.granola.ai/v1` (List Notes / Get Note ?include=transcript; page_size <= 30; 5 rps). Key: `%WORKDIR%\secrets\granola.env` (account owner.calendar@example.com, Workspace2, scopes personal+public, created 2026-07-02). - ⛔ The MCP transport is NO LONGER used for syncing (browser OAuth, it dies after ~10 days) — only for interactive questions, and only if re-authorized. - Engine (all the logic lives there, this skill is a thin wrapper): `$IMPORTS_ROOT/granola/granola_pull.py`. The same script does both backfill and increment. - Home for notes: `$OBSIDIAN_VAULT/04-Projects/granola-meetings/` (auto_generated: true — never hand-edit, they get overwritten). Raw JSON: `_imports\granola\raw\`. Nightly task log: `_imports\granola\pull.log`. - ⚠️ Granola does NOT start recording by itself: it records only when a human opens the note or clicks the notification. "The app is running" is not "it is recording". STEPS: 1. BACKUP FIRST ([[vault-backup-rule]]): `python $IMPORTS_ROOT/vault_backup.py` BEFORE running anything. 2. Run it: `python $IMPORTS_ROOT/granola/granola_pull.py` (options: `--dry` to count without writing, `--limit N` to cap). 3. Read the stdout counters: `DO