Meeting Minutes
github/awesome-copilot
Generate concise, actionable meeting minutes for internal meetings.
Self-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what…
$ npx skills add silverstein/minutes --skill minutes-mirror -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install silverstein/minutes minutes-mirror --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.opencode/skills/minutes-mirror .claude/skills/minutes-mirror && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .claude/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirrorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add silverstein/minutes --skill minutes-mirror -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install silverstein/minutes minutes-mirror --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.opencode/skills/minutes-mirror .agents/skills/minutes-mirror && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .agents/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add silverstein/minutes --skill minutes-mirror -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install silverstein/minutes minutes-mirror --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.opencode/skills/minutes-mirror .cursor/skills/minutes-mirror && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .cursor/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/silverstein/minutes.git --path .opencode/skills/minutes-mirror--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add silverstein/minutes --skill minutes-mirror -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install silverstein/minutes minutes-mirror --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.opencode/skills/minutes-mirror .gemini/skills/minutes-mirror && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .gemini/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install silverstein/minutes minutes-mirrorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add silverstein/minutes --skill minutes-mirror -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .github/skills && cp -r skills-src/.opencode/skills/minutes-mirror .github/skills/minutes-mirror && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .github/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add silverstein/minutes --skill minutes-mirror -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install silverstein/minutes minutes-mirror --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/silverstein/minutes.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.opencode/skills/minutes-mirror .opencode/skills/minutes-mirror && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "minutes-mirror" agent skill from https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-mirror into .opencode/skills/minutes-mirror/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "minutes-mirror", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
minutes-mirrorSelf-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what…
Minutes Mirror is an agent skill from silverstein/minutes. Self-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what your behavior in winning meetings looks like vs losing ones. Use this whenever the user says "how did I do", "review my last meeting", "mirror", "self-review", "show my patterns", "coach me", "where am I weak", "talk time", "am I improving", "what do I do in meetings I win", "feedback on me", or asks for any kind of…
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/mirror_metrics.py`). Compatibility notes: opencode
The repository describes itself as: Open-source, local-first Granola/Otter alternative that Claude Code, Codex, Cursor, and any MCP client can query. Meetings, calls, and voice memos transcribed on-device into… The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d3285c7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
gitpython3kindFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
opencode
From compatibility in the SKILL.md frontmatter.
Minutes Mirror loads about 3.5k tokens when it runs. Until then it costs about 191 tokens; SKILL.md has 1,603 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from silverstein/minutes at commit d3285c7, republished under its MIT licence (© silverstein). 1,603 words, ~3,465 tokens.
.claude/skills/minutes-mirror/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Before running helper scripts or opening bundled references, set:
export MINUTES_SKILLS_ROOT="$(git rev-parse --show-toplevel)/.opencode/skills"
export MINUTES_SKILL_ROOT="$MINUTES_SKILLS_ROOT/minutes-mirror"Self-coaching analysis based on your own meeting transcripts. Two modes:
The point is not to roast you. The point is to give you a kind, evidence-based mirror to behaviors that are usually invisible to you because you're inside them.
Mirror needs to know which speaker label in the transcript is the user. Real transcripts use one of two formats:
[Mat 0:00] Hey there. — first-name labels from voice enrollment[SPEAKER_0 0:00] Hey there. — generic labels from diarizationEither way, mirror needs to know which label maps to the user. Check sources in order:
1. Enrolled voice profile:
minutes voices --json 2>/dev/nullReturns a JSON array of enrolled profiles. The user's profile is the one with source: "self-enrollment" (or the first one if there's only one). Use the name field as the speaker label to look for in transcripts. Example response:
[{"person_slug": "mat", "name": "Mat", "source": "self-enrollment", ...}]→ Speaker label is Mat.
2. Cached self name(s):
cat ~/.minutes/config/self.txt 2>/dev/nullThe cache may contain multiple labels, one per line (e.g., Mat, Mat S., MAT_SILVERSTEIN) — match any of them. People often appear under multiple labels across transcripts.
3. Ask once and cache: If neither source returns a name, ask via AskUserQuestion: "Which speaker label in your transcripts is you? You can give multiple if you appear under different names (e.g., 'Mat, Mat S., MAT_SILVERSTEIN')."
Cache the answer (comma-separated input → one label per line):
mkdir -p ~/.minutes/config
printf '%s\n' <label1> <label2> ... > ~/.minutes/config/self.txtThis is a one-time setup cost. Don't ask again on future runs. If the user later mentions they have a new label, they can re-edit the file or re-run with mirror reset-self.
Single-meeting mode triggers on: "review my last meeting", "how did I do", "mirror that call", "feedback on the Sarah call".
Pattern mode triggers on: "show my patterns", "trends", "across all meetings", "coach me", "what do my winning meetings look like".
If ambiguous, default to single-meeting mode on the most recent meeting — it's fast, useful, and obviously what most people mean.
Find the target meeting (filter to meetings, not voice memos — talk-time analysis on a solo memo is meaningless):
minutes list --content-type meeting --limit 5Require exit status 0. If the user named a specific meeting, use bounded search to identify its exact path; otherwise pick the most recent list result. Paths are hints, not retained capabilities.
Compute the metrics with the bundled helper script, not by counting in-context. LLMs are bad at exact token counting; the script does it deterministically with regex and basic string ops.
set -o pipefail
minutes get "<exact path>" | \
python3 "$MINUTES_SKILL_ROOT/scripts/mirror_metrics.py" \
- \
--self "$(cat ~/.minutes/config/self.txt 2>/dev/null | paste -sd, -)"Require both sides of the pipeline to exit successfully. The helper receives only the exact native-authorized bytes over stdin; never pass it a meeting path.
The --self flag takes a comma-separated list of speaker labels (e.g., Mat,Mat S.,SPEAKER_3). Use the labels you cached in Phase 0.
The script outputs JSON to stdout with these fields:
| Field | Meaning |
|---|---|
total_words, self_words, other_words | Word counts (split-on-whitespace) |
talk_ratio | self_words / total_words as a 0–1 float |
self_turn_count, other_turn_count | Number of speaker turns |
speakers | All distinct speaker labels seen in the transcript |
filler_count, filler_per_100_words | Filler-word hits in self speech (um, uh, like, you know, basically, literally, kinda, right?) |
hedging_count, hedging_per_100_words | Hedging hits in self speech (maybe, kind of, sort of, i think, i guess, possibly, somewhat, a little, perhaps, sorry to). The word just is intentionally excluded — too many false positives. |
question_count, questions_per_5min | Self questions (? count) |
duration_minutes | From last timestamp if present, else word-count estimate at 150 wpm |
longest_monologue | Longest uninterrupted self stretch: word count, seconds estimate, first 8 words, start time |
longest_listen | Same shape, but for the longest stretch where you didn't speak |
outcome | Supported frontmatter outcome (won, lost, stalled, great, noise), or null |
The script exits non-zero on errors (file missing, no diarized turns, no self labels matched). On exit code 3 ("no turns matched any self label"), it tells you which speaker labels it found in the transcript — re-run with one of those, or update ~/.minutes/config/self.txt.
Compute your baseline from the last ~10 bounded list results. For each path,
repeat the native minutes get to stdin pipeline above and require both commands
to succeed. Never enumerate or open the meeting directory directly. Average the
metrics. If you have fewer than 5 successful meetings, say so explicitly —
"Baseline computed from only N meetings, treat with caution" — instead of
pretending the comparison is meaningful.
Once you have current-meeting metrics + baseline, flag anything >25% off baseline as worth noting.
Output format:
## Mirror: <meeting title> · <date>
**Talk time**: You spoke <X>% of the time. (Your 30-day average: <Y>%.) <flag if abnormal>
**Longest monologue**: ~<N> seconds on "<topic>". <one-line judgment: was it earned (you were asked to explain something complex) or was it dominance?>
**Longest you listened**: ~<N> seconds during "<topic>". <one-line: what did they reveal?>
**Filler words**: <N> per 100 words. (Average: <Y>.)
**Hedging**: <N> per 100 words. (Average: <Y>.) <flag specific moments if you hedged on price, scope, or commitment>
**Questions asked**: <N>. <one-line: was this discovery, close, or update?>
### What stood out
<2–3 specific moments worth re-reading. Quote a short line from the transcript and say why it matters. Be specific — "You hedged the moment Sarah pushed on price ('I mean, I think we could maybe…')" beats "you hedged sometimes".>
### One thing to try next time
<Exactly one. Concrete. Achievable in the next call. Not a personality change — a behavior change. Falsifiable so the next mirror can verify it.>Run across the last 30 days (or whatever window the user gives you).
Run minutes list --content-type meeting --limit 50, require exit status 0,
and filter its JSON results to the requested window. Retrieve each selected
meeting only through the native minutes get to stdin pipeline above.
Compute the same per-meeting metrics across every successfully authorized normal meeting in the window. Then look for patterns:
Behavioral patterns (always available):
Outcome correlations (only if meetings are tagged via /minutes-tag):
Standard outcome tags that mirror correlates: won, lost, stalled, great, noise. These mirror the set defined by /minutes-tag — if that skill ever adds new standard tags, update mirror to recognize them too. Custom (non-standard) tags are ignored for correlation analysis.
The helper includes a bounded outcome field (won, lost, stalled,
great, noise, or null) from the same authorized bytes. If every result is
null, skip the outcome-correlation section. Otherwise group only those returned
values and compare metrics across groups:
Minimum data thresholds:
/minutes-tag and I can show you what wins look like."Output format:
## Mirror: 30-day patterns
**You've been in <N> meetings.** Here's what I see:
### Talk patterns
<2–3 bullets, specific>
### Where you hedge
<2–3 bullets with specific topics>
### Energy & timing
<observations about time-of-day, fatigue, day-of-week>
### Win/loss correlation
<only if ≥3 tagged meetings per outcome — otherwise skip this section entirely>
### One thing to try this week
<Exactly one. Concrete. Falsifiable.>End with two beats:
Specific experiment — Restate the "one thing to try" as a concrete test. "Try cutting your hedging in your next 3 meetings. I'll measure it when you ask me to mirror again."
Tag nudge (only if no meetings have an outcome: field yet) — "After your next meeting, run /minutes-tag won|lost|stalled so I can correlate behavior with outcomes over time. ~10 tagged meetings is when the patterns get sharp."
~/.minutes/config/self.txt.© silverstein, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in .opencode/skills/minutes-mirror of silverstein/minutes.
Open the folder on GitHubat commit d3285c7
Minutes Mirror next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Minutes Mirror this skillsilverstein/minutes | 1.5k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Meeting Minutesgithub/awesome-copilot | 40k | 2 repos | ~2k | Automated safety check: Pass | MIT | |
| Meeting Minutesaipoch/medical-research-skills | 1.9k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Meetingsalirezarezvani/claude-skills | 28k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Meeting Minutes Takerdaymade/claude-code-skills | 1.4k | — | ~9.8k | Automated safety check: Pass | MIT | |
| Meeting Minutes Generatoraipoch/medical-research-skills | 1.9k | — | ~1.5k | Automated safety check: Pass | MIT |
github/awesome-copilot
Generate concise, actionable meeting minutes for internal meetings.
aipoch/medical-research-skills
Use meeting minutes for other workflows that need structured execution, explicit assumptions, and clear output boundaries.
alirezarezvani/claude-skills
A skill your agent uses when someone wants to decide whether a meeting is worth calling, price a meeting in dollars, build a timeboxed agenda with desired outcomes, or turn messy meeting notes into…
daymade/claude-code-skills
Transforms raw meeting transcripts into structured, evidence-based meeting minutes — merges multiple versions without losing content, reviews existing minutes against the transcript for missing…
aipoch/medical-research-skills
Generates structured meeting minutes from text transcripts. An agent skill from aipoch/medical-research-skills.
NousResearch/hermes-agent
Turn meeting notes into cited decisions, owners, tickets. An agent skill from NousResearch/hermes-agent.
silverstein/minutes
Analyze a product walkthrough, bug report video, Loom, or ScreenPal using Minutes transcription plus visual review.
silverstein/minutes
Lightweight outcome tagging for meetings — won, lost, stalled, great, or noise.
silverstein/minutes
Verify that Minutes is properly set up and working — model downloaded, mic accessible, directories exist, no stale state.
silverstein/minutes
Start or stop recording a meeting, call, or voice memo. An agent skill from silverstein/minutes.
silverstein/minutes
Fast non-interactive briefing before any meeting — auto-detects your next calendar event, pulls relationship history, surfaces open commitments, and produces a one-page brief in under 30 seconds.
silverstein/minutes
Manage old recordings — find large files, archive old meetings, delete processed originals.
Self-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what…. Minutes Mirror is an agent skill from silverstein/minutes. Self-coaching analysis of your own behavior across meetings — talk-time ratio, filler words, hedging language, monologue length, energy patterns, and (when meetings are tagged via /minutes-tag) what your behavior in winning meetings looks like vs losing ones.
Minutes Mirror fits situations like: says how did I do; review my last meeting; show my patterns; where am I weak.
Run `npx skills add silverstein/minutes --skill minutes-mirror -a claude-code`. Or copy the skill folder (.opencode/skills/minutes-mirror in silverstein/minutes) into .claude/skills/minutes-mirror in your project. Claude Code loads it when a task matches its description.
Run `npx skills add silverstein/minutes --skill minutes-mirror -a codex`. Or copy the skill folder (.opencode/skills/minutes-mirror in silverstein/minutes) into .agents/skills/minutes-mirror in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add silverstein/minutes --skill minutes-mirror -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/minutes-mirror, .gemini/skills/minutes-mirror, .github/skills/minutes-mirror and .opencode/skills/minutes-mirror in your project.
Going by SKILL.md and its folder, Minutes Mirror needs Python for the scripts in its folder and the command-line tools its instructions call (git, python3 and kind). Our summary lists: Python 3. Compatibility (from SKILL.md): opencode.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Minutes Mirror is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Minutes Mirror: Meeting Minutes (github/awesome-copilot, 40k stars), Meeting Minutes (aipoch/medical-research-skills, 1.9k stars), Meetings (alirezarezvani/claude-skills, 28k stars) and Meeting Minutes Taker (daymade/claude-code-skills, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
silverstein (a GitHub user) maintains it in silverstein/minutes, which has 1,542 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 8, 2026.
Source: silverstein/minutes on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.