All-hands meeting agenda template
Last updated: · Reviewed quarterly
An all-hands is the one meeting where the company talks to itself on the record, and the half worth keeping is not the presentation. It is the Q&A: what people asked, what got answered, and what got promised an answer later and never received one. 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 all-hands meeting agenda template
The block that makes this template different is the Q&A split three ways: asked, answered, and owed. Most all-hands records keep the slides and lose the questions, which is precisely backwards. The slides already exist as a file.
# All-hands, <date>
**Presenting:**
**Absent or in another timezone:** <the people this record is really for>
## The one message
<if everyone forgets the rest, what should they remember? One sentence, written before the meeting.>
## Numbers
| Metric | Last time | Now | What it means |
| --- | --- | --- | --- |
## What changed
<org, priorities, plans, people. Say the hard one plainly rather than in the fourth bullet.>
## Recognition
<who and what, specifically enough that it means something>
## What is next
<the next quarter in three or four lines, tied to whatever the planning cycle decided>
## Questions asked and answered
| Question | Asked by | Answer given |
| --- | --- | --- |
## Questions we owe an answer to
| Question | Asked by | Who will answer | By when |
| --- | --- | --- | --- |
## Questions nobody asked out loud
<what came in anonymously, or what did not get asked and probably should have>
## Follow-ups
| Action | Owner | Due |
| --- | --- | --- |
## Next all-hands
The owed table is the whole point and it has to have names and dates in it. An all-hands that generates unanswered questions and no list of them teaches the room not to ask, and the second all-hands after that one is silent.
What has to survive an all-hands
What it decides. Nothing, formally. It commits. What gets said from the front is what the company has now said out loud about itself, and people plan their year around it whether or not it was meant that firmly.
Who is in it. Everyone, which means the record is for the sizeable fraction who could not attend: other timezones, people on shift, anyone who joined last week. It is the one meeting in this pillar whose audience for the record is larger than the audience for the meeting. What executives keep covers the narrative side of it, and what happens to the number that gets quoted.
What must survive it. The question that was asked and not answered, which is the fact that determines whether anyone asks next time. The number as it was actually stated, because it will be requoted for a quarter with increasing confidence and decreasing accuracy. And the commitment made from the stage, which nobody thinks of as a commitment at the time because it was phrased as reassurance.
What an all-hands record needs that others do not. The three-way Q&A split, so an owed answer has somewhere to live between meetings. Attribution of questions where the asker was public, and deliberate non-attribution where they were not. And a plainly stated one-message line at the top, because a record of an all-hands that opens with the numbers reproduces the meeting's own habit of burying the thing people came to hear.
The deck is not the record
Somebody posts the deck afterwards, and occasionally a recording, and that is treated as the record. Neither is one. A deck is the part that was already written down, and a full-length video is not something a person joining in six weeks will ever watch.
The Q&A is where this bites hardest. Questions come in from three places at once, the chat, the room and a submission form, and the last few get an honest "let me come back to you on that". Nobody is assigned to collect them, because collecting them is a job that belongs to whoever is currently on stage. So the promise is made in good faith and then simply evaporates, and the next all-hands gets fewer questions for reasons everyone can feel and nobody names.
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. An all-hands is always on a calendar and is usually the only event of its kind that month, so the connected event names and bounds the span cleanly. 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, as resources, so the preset itself is just the instruction.
- 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/all-hands as the directory:
Write this all-hands up as a new markdown file in this directory, named
<yyyy-mm-dd>-all-hands.md.
Use exactly these sections: The one message, Numbers, What changed, Recognition, What is
next, Questions asked and answered, Questions we owe an answer to, Questions nobody asked
out loud, Follow-ups, Next all-hands.
Go through the transcript specifically for questions. Every question put to the presenters
gets a row. If it received an answer, put it in the answered table with the answer as
given. If the response was a promise to follow up, a deferral, or a non-answer, it goes in
the owed table instead, even when it sounded like an answer at the time.
In the owed table, fill "Who will answer" and "By when" only from what was said. Where
nothing was said, write "unassigned" and "no date". Do not guess.
Record numbers exactly as stated, with the period they refer to. If a number was given
without a period, mark it unqualified.
Treat anything said as reassurance about jobs, dates or money as a commitment, and list it
under Follow-ups with whoever said it as the owner.
The distinction between an answer and a non-answer is the instruction worth being firm about. "We are looking at that" reads as an answer in the room and is an owed item on paper, and a record that cannot tell the two apart produces an owed list of length zero every time.
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 an all-hands the destination is a page per recurring theme plus one ledger of owed answers, because the pattern that matters across a year is which questions keep coming back, which is a fact no single meeting contains.
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/all-hands. Never edit them.
Maintain ~/wiki/owed-answers.md as one row per question we owe: the question, the date it
was asked, who said they would answer, by when, and a link to the write-up. Mark a row
answered only when a later write-up shows it was answered, with that date and a link.
Never delete a row.
Maintain one page per recurring theme in ~/wiki/themes/. A theme is a question asked at
three or more all-hands. Each page: the question in its various phrasings, every answer
given with its date, and whether the answers are consistent with each other.
Maintain ~/wiki/numbers.md: each metric with every stated value and the date and period it
referred to, so a requoted number can be checked against the one that was said.
Every claim carries the date of the write-up it came from and links that file.
Do not attribute a question to a person unless the write-up says who asked it.
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 themes pages answer the question nobody wants to ask directly, which is whether the answers given to the same question in March and in November were the same answer.
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
- Strategic planning meeting agenda template: where the plan being announced was actually decided, and where the rejected options are.
- Staff meeting agenda template: the smaller room where what the all-hands announced turns into work for each area.
- Telling people you're recording: what to say before capturing a meeting with a hundred people in it.
- All meeting minutes templates.
Frequently asked questions
Is there a free all-hands meeting agenda template?
The one above. It is complete, there is no email gate and nothing to sign up for. The block to keep if you keep nothing else is the questions we owe an answer to, with names and dates in it.
Is a town hall the same as an all-hands?
Close enough that one template serves both. The words tend to split by culture rather than by content: a town hall usually implies the Q&A is the main event and the presentation is the warm-up, an all-hands often implies the reverse. If yours is a town hall, move the Q&A blocks above the numbers and give them most of the time.
How do you run the Q&A so people actually ask something?
Answer the previous meeting's owed questions first, out loud, before anything else. It is the only signal that reliably works, because it demonstrates that asking produces an answer. Everything else, anonymous submission, pre-seeded questions, a longer pause, helps at the margin and cannot compensate for a room that has learned its questions go nowhere.
Should the all-hands record be shared with everyone?
That is a decision about your organisation rather than about the tool, so make it deliberately. What Earkeep produces is a file on your own disk; nothing is published anywhere and nobody else gets a copy unless you send one. If you do share it, share the Q&A tables rather than the whole write-up, because that is the half people could not get from the deck.
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.