This plugin allows you to synchronize your notes and transcripts from Granola (https://granola.ai) directly into your Obsidian vault. It fetches documents from Granola, converts them from ProseMirror JSON format to Markdown, and saves them as .md files.
Note: Granola credentials are read directly from the filesystem. The plugin reads the credentials file from the Granola application's data directory. You can review the implementation of this mechanism in
src/services/credentials.ts.
All synced files include structured frontmatter for tracking and identification:
Notes:
---
granola_id: doc-123
title: "Meeting Title"
type: note
created: 2024-01-15T10:00:00Z
updated: 2024-01-15T12:00:00Z
attendees:
- John Doe
- Jane Smith
transcript: "[[Transcripts/Meeting Title-transcript.md]]"
---
Transcripts:
---
granola_id: doc-123
title: "Meeting Title - Transcript"
type: transcript
created: 2024-01-15T10:00:00Z
updated: 2024-01-15T12:00:00Z
attendees:
- John Doe
- Jane Smith
note: "[[Granola/Meeting Title.md]]"
---
The granola_id is consistent across both note and transcript files for the same source document, while the type field distinguishes between them. This allows both file types to coexist with proper duplicate detection.
granola_id: Unique identifier from Granola, consistent across note and transcript filestitle: Document title (with "- Transcript" suffix for transcripts)type: Either note or transcriptcreated: ISO timestamp when the document was createdupdated: ISO timestamp when the document was last updatedattendees: Array of attendee names from the meetingtranscript: Wiki-style link to the transcript file (only in notes saved as individual files, not in daily notes)note: Wiki-style link to the note (in transcripts, links to individual files or daily notes with heading anchors)The transcript field is added when notes are saved as individual files and transcripts are synced. The note field is always added to transcripts when notes are being synced - for individual note files, it links to the file path; for daily notes, it links to the daily note file with a heading anchor (e.g., [[2024-01-15#Meeting Title]]).
When the "Include Private Notes" setting is enabled and a document has private notes content, synced notes will include:
When private notes are disabled or not present, notes display the content directly without section headings.
For combined notes (notes with transcripts), the structure is: Private Notes → Enhanced Notes → Transcript.
For detailed information about how the sync process works, see Sync Process Documentation. This document explains the credentials loading, document fetching, note syncing, transcript syncing, frontmatter structure, file deduplication, and error handling mechanisms.
npm install
To build the plugin:
npm run build
The plugin uses Jest for testing. To run the tests:
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
For detailed testing information, including testing strategy and development workflow, see CONTRIBUTING.md.
To create a release:
# Auto-bump patch version
node scripts/release.js
# Specify a specific version
node scripts/release.js 1.2.3
Please see CONTRIBUTING.md for info on contributing to this project.
MIT