Meeting Notes skill for Codex
Decisions and owners first, no invented commitments. Codex reads transcripts and rough notes with their weaknesses in mind, such as wrong speaker labels and misheard names, and extracts only decisions people actually made and tasks someone accepted. Each action gets one owner, an absolute due date and a clear definition of done; anything ambiguous is flagged instead of guessed, and recap emails are drafted but sent only on your approval.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- meeting-notes Installs to ~/.agents/skills/meeting-notes/ for every project on this machine.
curl -fsSL codexskills.dev/cli.mjs -o codex-skills.mjsnode codex-skills.mjs install meeting-notes The CLI also searches, updates and removes skills. Run it with no arguments to pick from a list. Needs Node 20.12+.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- --project meeting-notes Installs to .agents/skills/meeting-notes/ in the current repository. Commit it and everyone who runs Codex there gets it.
curl -fsSLO codexskills.dev/downloads/meeting-notes.zipunzip -o meeting-notes.zip -d ~/.agents/skills/ The archive holds the skill folder with its generated agents/openai.yaml. Unzip into .agents/skills/ to scope it to a repo.
& ([scriptblock]::Create((irm codexskills.dev/install.ps1))) meeting-notes PowerShell 5.1 or 7. Installs to %USERPROFILE%\.agents\skills\. Add -Project for the current repo.
104-line POSIX script. No sudo, no telemetry. Read install.sh
Use it in Codex
Start a prompt with $meeting-notes, or pick it from /skills.
You can also just describe the task: Codex reads the description below and loads the playbook when your request matches.
What Codex reads before loading it
Turns meeting transcripts (Zoom, Google Meet, Teams VTT or text exports), rough live notes and chat threads into concise notes that lead with decisions and action items - each action with one owner, a due date and a definition of done - followed by key discussion, open questions and parked items, without inventing commitments nobody made. Use when asked to summarize a meeting, write up minutes, extract action items or decisions from a transcript, or prepare a follow-up recap to send.
Use it when
- You have a VTT or text transcript and need usable notes
- Live notes are messy and need decisions and owners pulled out
- A follow-up recap needs to go to attendees after a call
Use something else when
- You are planning the agenda or running the meeting: use meeting-facilitation
- The meeting was an incident review that needs a full write-up: use postmortem-writing
How to check the result
Spot-check three action items and every decision against transcript timestamps; each has one owner, a date and a source line, and uncertain items are marked.
The mistake it prevents
Turning 'someone should look at this' into an action item with a guessed owner and deadline that nobody agreed to.
Good notes let someone who missed the meeting know within 30 seconds what was decided, who is doing what by when, and what is still open. They record commitments people actually made, in the words they agreed to, and nothing more. A transcript summary that reads well but invents an owner or a deadline is worse than no notes.
Before summarizing
- Identify the source and its reliability:
- Auto-transcript (VTT, SRT, TXT): speaker labels may be wrong or generic (“Speaker 2”), names and jargon are often misheard, crosstalk gets dropped.
- Human live notes: incomplete but intentional; trust their decisions more than transcript inference.
- Chat log alongside the call: often holds links and the exact numbers people pasted.
- Get the meeting metadata: title, date, attendees, purpose or agenda. Ask the user for anything missing that the notes need (especially who attended and the meeting type).
- Check where notes live and their format: a
meetings/ornotes/folder, a template in the docs, or conventions inAGENTS.md. Match existing files.
Planning and running the meeting itself (agenda design, facilitation) belongs to
$meeting-facilitation.
Prepare a transcript
Strip timing cues from VTT/SRT so the text is readable but keep timestamps available for citations:
# VTT -> "HH:MM:SS Speaker: text" lines (keeps the cue start time;
# the sed handles Teams-style <v Name>...</v> voice tags)
awk '/-->/{t=substr($1,1,8); next} /^(WEBVTT|NOTE|[0-9]+$|$)/{next} {print t, $0}' call.vtt \
| sed -E 's#<v ([^>]+)>#\1: #; s#</v>##' > call.txt
wc -l call.txt
For long transcripts (over ~1 hour), summarize in chunks of 10-15 minutes first, keeping timestamps, then merge. Never summarize a merged summary without checking decisions and actions against the original lines.
Extraction rules
| Item | Counts when | Does not count |
|---|---|---|
| Decision | Someone with authority states it and nobody objects, or the group explicitly agrees (“OK, let’s go with B”) | “We should probably…”, one person’s preference, a decision deferred to later |
| Action item | A person accepts a task (“I’ll send the draft by Friday”) or is assigned and agrees | “Someone needs to look at X” with no taker: record it as an open question with “owner needed” |
| Open question | Raised, not answered; or answer depends on someone absent | Rhetorical questions |
| Parked | Explicitly deferred (“let’s take that offline”, “next sprint”) | Topics simply not reached (list as “not covered”) |
| Risk or blocker | Named as something that could stop or delay work | General worries without a consequence |
When the transcript is ambiguous, keep the ambiguity visible: Owner: Priya (?) - confirm,
Due: "end of next week" (2026-11-06?). Never resolve it by guessing.
Convert relative dates to absolute ones using the meeting date, and show both when the
original phrasing matters: by Friday (2026-10-30).
Action item format
- [ ] **Priya** - Send revised pricing table to finance, including the EU VAT column - due 2026-10-30
- [ ] **Marco** - Decide whether the beta includes SSO; post the decision in #launch - due 2026-11-03
- [ ] **Owner needed** - Check whether the legal review covers the new data processor
Rules: one owner per item (a person, not a team; “Marco + Ana” becomes two items or one owner with a helper noted), a verb-first task, a date, and enough detail that the owner knows what done looks like. Split compound tasks.
Decision format
1. **Launch date moves to 2026-11-18** (from 11-11). Reason: payment provider certification
not complete. Decided by: Ana (product lead). Revisit if certification lands before 11-07.
Include the reason and any condition attached. Decisions without reasons get relitigated.
Notes template
# <Meeting title> - <YYYY-MM-DD>
**Attendees:** Ana (product), Marco (eng), Priya (finance) **Absent:** Lee
**Purpose:** <one line> **Notes by:** <name / generated from transcript, reviewed by ...>
## Decisions
1. ...
## Action items
- [ ] **Owner** - task - due YYYY-MM-DD
## Key discussion
- <Topic>: 2-4 bullets with the substance, numbers and the options considered.
## Open questions
- <Question> - who can answer - needed by
## Parked / not covered
- ...
## Links
- <docs, tickets, dashboards mentioned>
Order matters: decisions and actions first, discussion after. Most readers stop after the action items.
Meeting-type adjustments
| Type | Emphasize | Keep short |
|---|---|---|
| Standup | Blockers and who is helping | Status updates (one line each or omit) |
| Planning / sprint | Commitments, scope cuts, capacity | Debate about estimates |
| Design review | Decisions with rationale, rejected options and why | Walkthrough narration |
| Customer call | Customer’s words on pain points (quoted), requests, commitments made to them | Internal chatter |
| 1:1 | Agreed follow-ups only; ask the user what may be written down | Personal or sensitive topics (omit) |
| Incident review | Timeline facts, actions with owners | Speculation |
Writing the discussion section
- Capture substance, not chronology: group by topic even if the meeting jumped around.
- Keep numbers, names of options and quoted constraints exactly (“max 200 ms p95”).
- Attribute positions only when it matters for follow-up (“Finance needs the number by Q4 close”). Do not attribute jokes, frustration or off-the-cuff remarks.
- Leave out small talk, repeated points and anything said “off the record”.
Sensitive content
Transcripts capture everything. Before writing notes intended for a wider audience, drop: personal matters, health, compensation and performance discussions, HR issues, unreleased financials beyond the audience’s access, and customer personal data. When unsure whether something belongs, ask the user rather than including it.
Sending the recap
A follow-up message to attendees is often wanted. Draft it, show it, and send or post only after the user gives a clear yes:
Subject: Recap - Launch sync 2026-10-28: date moves to 11-18
Hi all - decisions and actions from today. Reply if anything is wrong by Thursday.
Decisions: launch moves to 2026-11-18 (payment certification pending).
Actions:
- Priya: revised pricing table to finance, due 10-30
- Marco: SSO in beta yes/no, posted in #launch, due 11-03
Open: who checks legal coverage for the new processor?
Full notes: <link>
Gotchas
- Transcript speaker attribution is unreliable. If an action’s owner depends on who said
“I’ll do it”, verify with surrounding context or mark it
(?). - Misheard names, product terms and numbers: cross-check against the chat log, agenda and attendee list; flag anything unverifiable.
- “We agreed” is not a decision if the decider was absent. Record it as a proposal pending that person.
- Generated summaries drift toward positive framing. Keep disagreement and unresolved risks visible.
Verification
- Every action item has exactly one owner, a date (or an explicit “date needed”), and maps to a line in the transcript or notes; spot-check three against the source timestamps.
- Every decision has a reason and a named decider.
- No owner, deadline or decision appears that cannot be traced to the source.
- Open questions and parked items are listed rather than silently dropped.
- Tell the user which items are marked uncertain so they can confirm before sharing.
What the zip contains
SKILL.md plus the interface file below. Nothing runs on install.
agents/openai.yaml
Gives the Codex app a display name, a one-line description and a starter prompt for this skill.
interface:
display_name: "Meeting Notes"
short_description: "Decisions and owners first, no invented commitments"
default_prompt: "$meeting-notes Summarize this Zoom transcript into decisions and action items" About this skill
Written and maintained by the Codex Skills editors to the same editorial standard as every skill here: a selective description, a real workflow, known pitfalls and a way to verify the work. First published , last updated . MIT licensed. Something wrong or out of date? Tell us.