The core loop is a recording, a transcript and a prompt: capture system audio and your microphone, run whisper.cpp, and ask a language model to merge the transcript with the rough notes you typed. One sitting gets you Markdown notes on your own disk. What you give up is everything around it: automatic capture when a call starts, phone and watch apps, shared folders, integrations, and note quality that now depends on how well you tune your own prompt.
Before you buildCheck the free plan first: Granola Basic still records unlimited meetings with AI notes. It keeps only the last 30 days of history and leaves out the API and every integration except Slack.
Build me a Mac meeting notepad to replace Granola. Requirements: - A macOS 15+ menu bar app in Swift 6 and SwiftUI, built with Swift Package Manager; `make app` produces MeetingNotes.app in ./build/. One menu item starts and stops a meeting, another opens the notepad window. - Capture: a single ScreenCaptureKit stream (SCStream with system audio and captureMicrophone enabled, no video frames kept). Mix both sources into 16 kHz mono 16-bit WAV at ~/MeetingNotes/audio/YYYY-MM-DD-HHMM.wav. - Notepad: a plain text area for the rough notes I type during the meeting, autosaved to a draft every 5 seconds so a crash loses nothing. - On Stop: run `whisper-cli` (whisper.cpp from Homebrew) as a subprocess with the ggml-medium.en model from ./models/, show progress, and keep timestamps in the transcript. - Notes: send my rough notes and the transcript to an OpenAI-compatible chat endpoint (LLM_BASE_URL, LLM_MODEL, LLM_API_KEY, read from ~/.config/meetingnotes/.env; local Ollama works). The prompt returns a summary, decisions, action items with owners and open questions, in that order, and treats my typed lines as the points to emphasize. - Output: ~/MeetingNotes/YYYY-MM-DD-HHMM.md with the structured notes on top, my raw notes under a "My notes" heading and the full transcript below a divider. Delete the audio after 7 days unless KEEP_AUDIO=true. - No accounts, no cloud storage, no telemetry. The only network call is the LLM endpoint, and with Ollama the app works offline. - Out of scope: joining calls, reading the calendar, speaker labels, syncing across devices. - README: the Screen & System Audio Recording and Microphone permissions to grant, the brew packages to install and how to test with a recorded call.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Granola.
Add full-text search to the meeting-notes app in this folder. Requirements: - Index every note in ~/MeetingNotes (summary and transcript) with SQLite FTS5, in whatever language the app is already written in. - Re-index a note when its .md file changes, and pick up new files automatically. - A local search page on http://localhost:4321: one search box, results ranked by relevance, each showing the meeting date, title and a highlighted snippet. - Clicking a result opens the .md file in my default editor. - Everything stays local: no accounts, no network calls for search. - Update the README with how to start the search page.
Add speaker labels to the transcripts in the meeting-notes app in this folder. Requirements: - After transcription, run speaker diarization on the saved audio with pyannote.audio. The pyannote models need a Hugging Face token: read it from .env. - Merge the speaker turns with the whisper.cpp segments so every transcript line starts with "Speaker 1:", "Speaker 2:" and so on. - A "speakers:" block at the top of each .md file lets me rename them (Speaker 1: Anna), and the summary uses those names for action-item owners. - If diarization fails or no token is set, fall back to the unlabeled transcript. - Update the README with the Hugging Face steps: create a token and accept the model terms.
Make the meeting-notes app in this folder notice calls by itself. Requirements: - Every 10 seconds, check whether zoom.us, Microsoft Teams or Webex is running, or whether a Chrome or Safari tab is open on meet.google.com. - When a call starts, show a macOS notification "Record this meeting?" with Record and Ignore buttons. Never start recording without a click. - Stop and process the recording 2 minutes after the call ends. - A menu bar toggle turns detection off. - Out of scope: reading my calendar or joining calls. - List any new macOS permissions (Automation access to read browser tabs) in the README.
Add a "chat with my meetings" page to the meeting-notes app in this folder. Requirements: - Split every note in ~/MeetingNotes into chunks, embed them with nomic-embed-text through Ollama, and store the vectors in SQLite next to the notes. - A page on http://localhost:4322 with one question box. Answer with the LLM already configured in .env, using only the five most relevant chunks. - Every answer lists its sources as links to the notes it used. - Re-embed a note when its file changes. - Out of scope: sharing, accounts and any cloud vector database. - Update the README with the Ollama install step and the model pull command.
Add an importer for a Granola CSV export to the meeting-notes app in this folder. Requirements: - A command that takes the path to the CSV Granola emails me (Settings > Profile > Generate CSV). - Read the CSV header first and map the columns for title, date, note summary and transcript; show me the mapping and ask before importing anything. - Write one .md file per meeting to ~/MeetingNotes/YYYY-MM-DD-HHMM.md in the same format as new notes, marked "imported from Granola" at the top, with the transcript below the divider when the CSV has one. - Skip meetings that already have a file, so running it twice is safe. - Print a summary at the end: imported, skipped and failed rows. - Update the README with the export steps and the import command.
It records without a meeting bot, so nobody sees an extra attendee, and the notes arrive structured as soon as the call ends. Teams add shared folders and integrations, and security teams get SOC 2 Type II and admin controls on the higher plans.
Estimate · Transcription runs locally for free. Summaries cost roughly 1–5¢ per meeting through an API, or nothing with a local model. The build session is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Basic | $0/user | $0/user | AI notes, templates, shared folders and Slack; 30 days of history, chat on the automatic model, no API, MCP limited to personal notes from the last 30 days. |
| Business | $14/user | — | Everything in Basic plus unlimited history, integrations (Notion, Zapier, HubSpot, Attio, Affinity), pre-meeting briefs, follow-up emails, API access, full MCP and model choice for chat. |
| Enterprise | $35/user | — | Business plus SSO, SCIM, HIPAA workspaces, audit API, admin controls, org-wide retention rules and dedicated support. |
Basic is free with unlimited meetings and AI notes, but only the last 30 days of history stay visible.
Yes. An AI coding agent such as Claude Code, Codex or Cursor can build a usable personal version in one session with the prompt on this page, running on your own machine.
About $14 a month on the Business plan per seat, $168 a year (checked 2026-10-14).
Starting automatically when a calendar meeting begins; iPhone, Android and Apple Watch apps; Shared folders and notes your colleagues can open; Notion, HubSpot, Slack and Zapier hooks, and an API for your notes; Pre-meeting briefs and follow-up emails drafted for you. If any of those matter to you, keep paying.
Yes: Anarlog (open source), Meetily (open source), Meeting Transcriber (open source).