Your coding agent is your meeting notetaker.
An open-source Granola alternative with a twist: there is no app. A tiny local recorder transcribes your meetings with Whisper — and the AI you already pay for (Claude Code, Cursor, Codex…) writes the notes, answers questions, and keeps your team's knowledge base in sync. No bots joining calls. No accounts. No API keys. No cloud.
you, in a meeting ──► localhost:4123 recorder
mic + system audio → Whisper (local, WebGPU)
│
▼
meetings/2026-07-18-standup.transcript.md (streams live)
│
"write up my meeting" ▼
your coding agent
│
▼
meetings/2026-07-18-standup.notes.md
│
▼
git commit → push → 🧠 team knowledge base
No bot joins your call. The recorder listens to your machine — your mic plus the system audio you already hear — captured as two separate tracks, transcribed separately, and tagged You / Room in the transcript. Your agent does everything intelligent with the result.
git clone https://github.com/VedSoni-dev/oatmeal.git
cd oatmealThen paste one line into your coding agent:
Read SKILL.md and set up Oatmeal for me.
That's the whole install. The agent installs deps, starts the recorder, opens
http://localhost:4123, and tells you how to record. (Claude Code auto-discovers the
skill via .claude/skills/ — mentioning meetings is enough.)
When a meeting starts: hit Record, share Entire screen with "share system audio" checked (window shares carry no audio). When it ends, tell your agent:
write up my meeting
You get summary, key points, decisions, and action items — committed to git if the repo has a remote.
Manual setup (no agent)
npm install
npm start # recorder at http://localhost:4123Transcripts land in meetings/ as plain Markdown. Bring any tool you like.
Cloning the repo IS the install. Claude Code picks all of this up automatically:
| You type | What happens |
|---|---|
/meeting |
Recorder starts (if needed) and opens in your browser — for when you're 2 minutes out |
/writeup |
Latest transcript becomes polished notes: summary, decisions, action items — committed & pushed |
/recall what did we tell Acme about pricing? |
Grounded answer from every meeting in the knowledge base, with file citations |
/prep akrit |
Pre-meeting brief: what you discussed last time, open action items, promises made, suggested agenda |
And two things you never type:
- It notices unwritten meetings. A
SessionStarthook checks for transcripts with no notes — open Claude Code after a call and it offers the write-up before you ask. - MCP auto-registers.
.mcp.jsonexposeslist_meetings/search_meetings/get_meetingto any MCP client the moment you open the repo.
(Other agents: same flows work by asking in plain English — the commands are just
markdown files in .claude/commands/, readable by anything.)
Sharing = git. No sync server, no org accounts, no per-seat pricing:
- Your team creates one repo — say
team-knowledge— with ameetings/folder. - Everyone clones it and points their recorder at it
(
OATMEAL_MEETINGS_DIR=<clone>/meetings npm start). - After each meeting, each person's agent commits + pushes their notes there (the skill does this automatically when a remote exists).
- Everyone's agent
git pulls and can answer from anyone's meetings:
"What did we tell Acme about pricing last month?" "List every action item assigned to me this week." "Summarize all the decisions from sprint planning meetings."
Access control is your git host's access control. History is the git log. Deleting
a note is a commit. Compliance export is git archive. It's boring — that's the point.
The recorder and calendar watcher are background services, not agent tasks — your coding agent doesn't need to stay open for any of this to work day to day.
node scripts/install-autostart.mjsRegisters the recorder as a real background service — a Startup-folder entry on
Windows, a LaunchAgent on macOS, systemd --user on Linux — with no admin rights
and no permission prompts. Starts at every login, keeps running. Your agent runs
this once; after that, closing your terminal or Claude Code doesn't stop it.
If your coding agent has (or can add) a Google/Outlook Calendar connector, just ask it to wire your calendar into Oatmeal — one click of OAuth, nothing to paste.
No calendar connector? One URL, no OAuth:
cp oatmeal.config.example.json oatmeal.config.json
# paste your calendar's ICS feed URL (Google Calendar → Settings → your calendar
# → "Secret address in iCal format")
node scripts/install-autostart.mjs # re-run: also installs the calendar watcherFrom then on, with zero agent involvement: a standalone script checks your calendar every 5 minutes and opens the recorder in your browser ~7 minutes before each meeting. You just hit Record. Your agent's only jobs are the one-time install and writing up notes afterward.
| Path | What it is |
|---|---|
SKILL.md |
The product spec your agent follows — setup, notes flow, knowledge base rules, calendar automation |
capture/ |
Zero-dependency local server + recorder page — mic + system loopback, in-browser Whisper (WebGPU, pick tiny/base/small), live You/Room transcript, built-in meeting viewer |
meetings/ |
Your transcripts + notes. Plain Markdown. Yours. |
scripts/mcp-server.mjs |
Optional MCP server — expose meetings to any MCP client |
scripts/install-autostart.mjs |
Registers the recorder (+ calendar watcher) as a background OS service |
scripts/calendar-watch.mjs |
Standalone ICS calendar poller — opens the recorder before meetings, no agent needed |
.claude/skills/ |
Auto-discovery so Claude Code picks up the skill on clone |
- Transcription is local — Whisper runs in your browser (one-time ~80 MB model download, then fully offline). Audio is never stored or uploaded anywhere.
- Transcripts are plain files on your disk. The only network hop is the git remote you choose — or none.
- The AI that reads your transcripts is the coding agent you already use and trust.
- Recording people has consent rules that vary by place. Tell attendees you're taking notes.
PRs welcome. The codebase is intentionally tiny (~500 lines, zero server deps):
if you can read capture/server.mjs and capture/public/app.js, you've read the
whole thing.
Good first issues:
- Smarter meeting-title detection (from calendar or first few words)
- Calendar connector recipes (Google, Outlook, Slack integration guides)
- Full multi-person diarization (mic vs system audio are already tagged "You"/"Room" — telling apart two+ people on the other end of the call would need Pyannote or similar)
- Better error messages (when Whisper fails, when git push fails, etc.)
Not in scope: cloud sync, accounts, compliance features (fine-grained audit logs), multi-language models beyond Whisper's baseline. Those belong in derivatives, not core.
MIT © Vedant Soni — free forever. Everything the paid notetakers charge for is a git repo and an agent prompt away.