Package Exports
- granola-toolkit
- granola-toolkit/dist/cli.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (granola-toolkit) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
granola-toolkit
General toolkit to do more with Granola notes and transcripts.
Install
From npm:
npm install -g granola-toolkit
granola --helpWithout a global install:
npx granola-toolkit --helpFor local development:
curl -fsSL https://vite.plus | bash
vp help
vp installRun
Installed CLI:
granola --help
granola auth login
granola meeting --help
granola notes --help
granola transcripts --helpLocal build:
vp pack
node dist/cli.js --help
node dist/cli.js meeting --help
node dist/cli.js notes --help
node dist/cli.js transcripts --helpYou can also use the package scripts:
npm run build
npm run start -- meeting --help
npm run notes -- --help
npm run transcripts -- --helpExamples
Export notes:
granola auth login
granola notes
node dist/cli.js notes --supabase "$HOME/Library/Application Support/Granola/supabase.json"
node dist/cli.js notes --format json --output ./notes-jsonExport transcripts:
node dist/cli.js transcripts --cache "$HOME/Library/Application Support/Granola/cache-v3.json"
node dist/cli.js transcripts --format yaml --output ./transcripts-yamlInspect individual meetings:
granola meeting list --limit 10
granola meeting list --search planning
granola meeting view 1234abcd
granola meeting export 1234abcd --format yamlHow It Works
Notes
notes exports Granola's generated meeting notes, not the raw transcript.
The flow is:
- read a stored Granola session, or fall back to your local
supabase.json - extract the WorkOS access token from it
- call Granola's paginated documents API
- normalise each document into a structured note export
- choose the best available note content for each document
- render that export as Markdown, JSON, YAML, or raw JSON
- write one file per document into the output directory
Content is chosen in this order:
noteslast_viewed_panel.contentlast_viewed_panel.original_content- raw
content
Markdown note files include:
- YAML frontmatter with the document id, created timestamp, updated timestamp, and tags
- a top-level heading from the note title
- converted note body content
Transcripts
transcripts exports Granola's locally cached transcript segments.
The flow is:
- read Granola's cache JSON from disk
- parse the cache payload, whether it is double-encoded or already an object
- normalise transcript data into a structured export per document
- match transcript segments to documents by document id
- render each export as text, JSON, YAML, or raw JSON
- write one file per document into the output directory
Speaker labels are currently normalised to:
YouformicrophoneSystemfor everything else
Structured output formats are useful when you want to post-process exports in scripts instead of reading the default human-oriented Markdown or text files.
Meetings
meeting combines the API-backed notes path with the local transcript cache so you can inspect one meeting at a time.
The flow is:
- read a stored Granola session, or fall back to
supabase.json - fetch documents from Granola's API
- optionally load the local cache for transcript data
- resolve a meeting by full id or unique id prefix
- render either a list, a human-readable meeting view, or a machine-readable export bundle
The human-readable view command shows:
- meeting metadata
- the selected notes content
- transcript lines when the local cache is available
The machine-readable export command includes:
- a meeting summary
- structured note data plus rendered Markdown
- structured transcript data plus rendered transcript text when available
Auth
If you do not want to keep passing --supabase, import the desktop app session once:
granola auth login
granola auth statusThat stores a reusable Granola session locally and lets granola notes use it directly. granola auth logout deletes the stored session.
Incremental Writes
Both commands keep a small hidden state file in the output directory to track:
- document id to filename
- content hash
- source timestamp
- last export time
That state is used to:
- keep filenames stable even if a meeting title changes later
- skip rewrites when the rendered content is unchanged
- migrate old files cleanly when the output format changes
- delete stale exports when a document disappears from the source data
That makes repeated runs cheap and keeps long-lived export directories much cleaner.
Config
The CLI reads configuration in this order:
- command-line flags
- environment variables
.granola.toml- platform defaults
Supported config keys:
debug = true
supabase = "/Users/yourname/Library/Application Support/Granola/supabase.json"
output = "./notes"
timeout = "2m"
cache-file = "/Users/yourname/Library/Application Support/Granola/cache-v3.json"
transcript-output = "./transcripts"Supported environment variables:
DEBUG_MODESUPABASE_FILEOUTPUTTIMEOUTCACHE_FILETRANSCRIPT_OUTPUT
Development Checks
Before pushing changes, run:
vp check
vp test
vp pack
npm pack --dry-runWhat those do:
vp check: formatting, linting, and type checksvp test: unit testsvp pack: builds the CLI bundle intodist/cli.jsnpm pack --dry-run: shows the exact npm package contents without publishing
vp build is for web apps. This repo is a CLI package, so the build step here is vp pack.