Granola (meeting notes)
An in-development integration that brings Granola meeting notes into Omniscio: a browsable list of recent meetings, a read-only transcript viewer, an inbox row when a new meeting appears, and one click to hand a meeting to a new session as context.
What it is
Experimental, in-development integration that brings your Granola meeting notes into Omniscio: a browseable list of recent meetings, a read-only transcript viewer, an inbox row when a new meeting is generated, and a one-click "Use as context" action that hands a meeting's summary + transcript to a new Claude session.
Granola is a meeting-notes app. Omniscio reads (read-only) the user's meetings through Granola's official public REST API — it never edits Granola.
Where to find it
How to turn it on
- Settings → Lab → enable Granola meetings (the master toggle; hidden until you flip it because the feature is still in development).
- A Granola tab appears in the sidebar. Open it and click Set up Granola (or the header gear, which carries a status dot), then paste a Granola API key (create one in the Granola desktop app → Settings) and click Save.
- Optionally enable Granola meetings in Inbox (Lab) to get an inbox row when a new meeting is generated.
How it behaves
What you can do
- Browse meetings — the panel lists recent meetings (title, date, a short summary), newest first, with cursor-based "Load more" pagination. Only meetings that already have a generated AI summary appear (still-processing meetings are absent — that is Granola's behaviour, not a bug).
- Read a transcript — selecting a meeting opens a drawer showing the summary plus the full transcript as speaker-labelled segments, read-only. No external images are loaded.
- Use as context — from a meeting, "Use as context" copies a well-formed context block (title + date + summary + transcript) to the clipboard with a toast, so you can paste it into a new Claude session. It never spawns or runs a session itself — the cost-safety guarantee is absolute.
- Inbox rows — when "Granola meetings in Inbox" is on, each newly-created
meeting surfaces as one self-clearing amber inbox row titled
Granola · <title> (<date>). Dismissing one snoozes it; it returns only if the meeting changes.
For agents
How it works (for maintainers)
- Gate:
src/shared/unreleased-features.ts(idgranola,settingKeygranolaEnabled, envAMC_SHOW_GRANOLA). Default hidden; flipstatusto'shipped'to release. Never read the flag raw — route throughisUnreleasedFeatureVisible[InRenderer]. - Auth: one flat
AppSettingsfieldgranolaApiKey, in BOTHENCRYPTED_APP_SETTINGS_KEYS(encrypted at rest) andCLI_SETTINGS_SENSITIVE_KEYS(stripped from CLI/IPC reads). The key never crosses IPC back to the renderer. - Client:
src/main/services/granola/granola-client.ts— a singlegranolaFetchchokepoint with an SSRF guard (assertSafeGranolaOrigin: https only, host must equalpublic-api.granola.ai), Bearer auth, andhumanizeGranolaError(401/403 → invalid key, 429 → rate limit). Read-only:listMeetings,getMeetingDetail,testConnection. - IPC:
granola:auth-status,granola:test-connection,granola:list-meetings,granola:meeting-detail(+ theinbox-granola:*source). Handlers insrc/main/ipc/granola-handlers.ts; channels insrc/shared/ipc-channels/granola.ts. - UI:
src/renderer/src/features/granola-meetings/—GranolaMeetingsView(list),GranolaTranscriptDrawer(transcript viewer + Use-as-context), and thegranola-meetings-store(stale-guarded list + detail). - Inbox:
granola-inboxsource — thegranola-inbox-pollerwholesale- replaces thegranola_inbox_snapshotscache each tick and pushesINBOX_GRANOLA_UPDATEDwhen the row set or any meeting'screated_atchanged.
See the contract .claude/memory/contracts/granola-contract.md for the
load-bearing invariants and the tests that lock them.
Related
Fathom does the same job for Fathom.ai recordings, and Google Meet covers Meet conference records and transcripts.
Last verified 2026-09-23