Team meeting agenda template
Last updated: · Reviewed quarterly
A team meeting is where a group finds out what the rest of the group is doing, and where the small cross-cutting decisions get made that no single person's ticket would ever hold. Its record exists mostly for the people who were not in it. The template is below, free and complete. After it, how to stop typing it out: the meeting is already recorded on your device, and an agent writes this template from the transcript into a file you keep.
The team meeting agenda template
Three blocks a team meeting needs that a 1:1 does not: a check on last week's actions before anything new is raised, a per-workstream round so quiet work is still visible, and an unowned bucket, because the failure mode of a team meeting is a blocker everybody nodded at and nobody took.
# <Team> weekly, <date>
**Present:**
**Absent:** <the people this record is actually for>
**Chair:**
## Since last time
- [ ] <action from the last meeting, and what happened to it>
## Context and announcements
<what changed outside the team that the team has to know: scope, dates, people, priorities>
## Round the team
### <workstream or person>
<what moved, what is next, what is in the way>
## Blockers
| Blocker | Raised by | Owner | Needed by |
| --- | --- | --- | --- |
## Decisions
| Decision | Owner | Date |
| --- | --- | --- |
## Actions
| Action | Owner | Due |
| --- | --- | --- |
## Nobody took this
<raised, agreed to be a problem, and left the room without an owner. Read this out before closing.>
## Parked
<worth returning to, not this week>
## Next meeting
The absent line is doing real work here and is worth filling in properly. It is the difference between a record written for the archive and a record written for two named people who will read it on Monday.
What has to survive a team meeting
What it decides. The small cross-cutting things: who picks up the thing that belongs to nobody, whether a date still holds, which of two half-solutions the team is going with. None of these are big enough to get a document, which is exactly why none of them get written down and why the same question gets re-decided in three weeks.
Who is in it. The whole team, and the record is for the two who were out, the one who joins in six weeks, and the person who has to explain in October why the team went the way it did. A 1:1's record is for the two people in it. A team meeting's record is mostly for people who were not there, and that changes what belongs in it: less atmosphere, more decision and owner. What engineering leads keep covers the version of this that has to survive as an architecture decision record.
What must survive it. The decision the room made in passing, which nobody logged because it was not on the agenda. The blocker that was acknowledged and not assigned, which is the single most common way a week is lost. And the piece of context that made the decision reasonable, which is the part that is missing whenever a past decision looks stupid in hindsight.
What a team meeting's notes need that others do not. A closed loop on last week's actions at the top rather than the bottom, because an action list nobody revisits stops being written. An explicit unowned bucket, so "we should look at that" is visible as an unassigned item instead of disappearing into the transcript. And a per-workstream round, so the record is not just the two loudest topics.
Where this meeting is a standing ritual rather than a working session, the format does the agenda's job instead, and standup and retrospective formats covers the five that hold up. If your team meeting is really a daily scrum, a sprint planning or a retro, the templates for those are on agile ceremony templates.
Who is writing it by week nine
Somebody volunteers to take the notes in week one. By week five it is whoever forgot to look busy, by week nine it is nobody, and the meeting continues for another two years without a written trace.
The reason is structural rather than lazy. The person best placed to write the record is the person chairing, and chairing well and typing accurately are two jobs that cannot be done at once. So either the chair drops out of the conversation to type, or the record is written from memory an hour later by someone who was mostly listening for their own turn. The absent colleague the notes were for gets a two-line summary, reads nothing into it, and asks in a message what actually happened.
Writing it from the recording
This half is a product feature. Exactly what it does, in four steps:
- The day is already recorded. Earkeep captures your microphone and your system audio continuously and transcribes on your device, and the audio is never written to disk at all. There is no start button and no bot joining the call. Always-on capture covers why, and private by design covers where the audio goes, which is nowhere.
- You mark the meeting once it is over. Select the range on the timeline and save it as a meeting. A standing weekly on a connected calendar names and bounds its own span. Calendar connection has the detail.
- You pick a saved template in the composer. Settings → Templates holds instruction presets, each with a name, an agent, a working directory and the prompt text. Opening the agent panel on a saved meeting offers them, and the meeting and its transcript are attached to the prompt for you.
- The agent writes the file. It runs on your machine, as your own CLI, with your own key, in the directory the preset names. Agents and MCP explains how that works.
The "one click" is picking the preset. Nothing fires a template because a meeting's title matched a pattern; Earkeep has no such matching.
The preset for this page, with ~/notes/team as the directory:
Write this team meeting up as a new markdown file in this directory, named
<yyyy-mm-dd>-team.md.
Use exactly these sections: Since last time, Context and announcements, Round the team,
Blockers, Decisions, Actions, Nobody took this, Parked, Next meeting.
Read the most recent previous file in this directory first. Open "Since last time" with
every action from it, and say what was said about each one today, or "not mentioned" if
it did not come up. Do not quietly drop an action because nobody raised it.
Under "Round the team", use one subheading per workstream or person actually discussed.
Do not invent a heading for someone who did not come up.
A line goes under Actions only if someone said out loud who owns it. Anything the room
agreed was a problem and left without a named owner goes under "Nobody took this",
verbatim enough that the person reading it can tell what was meant.
Leave a section out entirely if nothing in the meeting belongs in it.
The instruction not to drop an unmentioned action is the one that earns its place. An agent asked for a summary will give you the meeting that happened; what a team meeting record is for is the thing that was supposed to happen and did not get mentioned.
Cross-linking a year of them, on your own schedule
Earkeep has no scheduler. There is no nightly job to switch on, no "run this agent every week" setting, and there is not one hidden in a menu either. What it has instead is a directory of plain markdown files and a read-only MCP server on loopback, which is everything a scheduler you already own needs.
The pattern on top of that is a compiled wiki: raw sources stay immutable, an agent writes one page per concept from them, and a schema file states the rules. The LLM Wiki is the pattern and from what was said to what you know is the pipeline a meeting travels along it. For a team meeting the destination is a decision register plus a page per recurring topic, because the value of fifty weekly meetings is not fifty summaries, it is being able to answer "when did we decide that, and what did we know at the time".
Keep the ingest instructions in a file so a scheduled run and a manual one read the same one. ~/wiki/INGEST.md:
Sources are the markdown files in ~/notes/team. Never edit them.
Maintain ~/wiki/decisions.md as one dated row per decision: what was decided, who owns it,
the date, and a link to the write-up it came from. Append only. If a later meeting reverses
a decision, add a new row and mark the old one superseded rather than editing it.
Maintain one page per recurring topic in ~/wiki/topics/. Each page: current state, how it
got there in dated steps, open questions, and who to ask.
Every claim carries the date of the write-up it came from and links that file.
Carry anything under "Nobody took this" into ~/wiki/unowned.md with its date, and remove
a line only when a later write-up shows it was picked up. Say who picked it up.
Then the schedule, which is yours. On macOS a LaunchAgent is the supported mechanism and it survives the laptop being asleep at the appointed minute, where a cron job simply misses it. Save this as ~/Library/LaunchAgents/com.yourname.wiki-ingest.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourname.wiki-ingest</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-lc</string>
<string>cd ~/wiki && /opt/homebrew/bin/claude -p "$(cat INGEST.md)"</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>19</integer>
<key>Minute</key><integer>30</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/wiki-ingest.log</string>
<key>StandardErrorPath</key>
<string>/tmp/wiki-ingest.err</string>
</dict>
</plist>
Load it once with launchctl bootstrap gui/$(id -u) and the path to that file. Or, if you already keep a crontab, one line instead:
30 19 * * 1-5 cd $HOME/wiki && /opt/homebrew/bin/claude -p "$(cat INGEST.md)" >> /tmp/wiki-ingest.log 2>&1
Two things bite about that line. Cron runs with a minimal PATH, so the agent binary needs its absolute path or the job fails silently. And on current macOS a cron job that reads directories under ~/Documents or ~/Desktop needs Full Disk Access granted to /usr/sbin/cron in System Settings.
The join between a meeting and its write-up is the filename convention you chose, and nothing else: there is no field on a saved meeting recording where its notes landed. A year in, the unowned list is the most uncomfortable and most useful page in the wiki.
What this does not do
- No speaker labels. There is no diarisation, so nothing in the transcript says who said which sentence, and the minutes cannot attribute a line to a person from the audio. Attribution comes from what was said out loud ("Sam will take the migration"), from a connected calendar's attendee list, or from you typing the names. The
**Present:**line is a line you fill in. - macOS only. macOS 13 or later. The Windows audio path is designed and not released, and the scheduling half of this page is macOS-specific by construction.
- The agent is yours. It runs as your own CLI with your own key. Earkeep does not resell model access and there is no per-meeting AI fee, which is what makes it €39 once. What the agent does with the context after Earkeep hands it over is a property of the agent you chose, not of Earkeep. Setting up Claude Code covers installing and signing in to one of them.
- Nothing writes back. The MCP server is read-only, with exactly two tools, so a scheduled agent can read your meetings and cannot create or edit a meeting, a note or a file through it. The wiki is a one-way derivative of the record.
Related
- One-on-one meeting agenda template: for the conversation a team meeting keeps trying to become and should not.
- Agile ceremony templates: if the weekly is really a standup, a planning or a retro, the shapes differ enough to matter.
- Meeting overload: whether this meeting should exist at all, and the four verdicts an audit can reach about it.
- All meeting minutes templates.
Frequently asked questions
Is there a free team meeting agenda template I can copy?
The one above. It is complete, there is no email gate and nothing to sign up for. Copy it into whatever your team already writes in, delete the blocks that do not apply, and keep the rest. If you take it and never install anything, this page did its job.
What is the difference between a team meeting agenda and team meeting minutes?
Mostly when you fill them in. The template above is one file: the chair fills in Context and announcements before, the rest gets filled in during or after. Splitting them across two documents is how teams end up with an agenda nobody read and minutes nobody wrote, so this page treats them as one thing on purpose.
How long should a weekly team meeting be?
Shorter than the slot it is in, which is the only rule that survives contact with a real calendar. The useful discipline is the per-workstream round with a stated cap, because it makes an over-stuffed meeting visible while there is still time to cut something. Meeting overload covers how to work out whether it earns its slot at all.
Does this record the meeting without telling anyone?
Earkeep announces itself to nobody: there is no bot in the participant list and no banner on anyone's screen, so telling the room is yours to do and you should. What it changes is what you can honestly say when you do, because nothing leaves your device and no IT system gets a copy. Telling people you're recording covers how to say it in a sentence, and our privacy page covers what the app itself sends.
Can I get the minutes without letting an AI read the transcript?
Yes. The transcript is a plain text file on your own disk and the template above is a template: open one, fill in the other, and no model is involved at any point. The agent step is a convenience for people who do not want to type, not a dependency. Private by design covers what stays local either way.