Minutes Brief logo

Minutes Brief

CommunityPopular
silverstein
minutes-brief

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. Use this whenever the user says "brief me", "give me a quick brief", "what's coming up", "background on my next call", "who am I meeting next", "brief me on Sarah", "I have a call in 10 min", "quick rundown", or right before walking into a meeting. Different from /minutes-prep — brief is the fast hook-fireable version that doesn't ask questions and doesn't set goals. Use brief when speed matters; use prep when the user wants to think hard about goals first.

Overview

Publishersilverstein
Repositoryminutes
Skill nameminutes-brief
Stars
1.5K
Forks
163
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by silverstein on GitHub. Read the source before you install it.

Installation

Install the Minutes Brief AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/silverstein/minutes.git /tmp/minutes
mkdir -p .claude/skills
cp -r /tmp/minutes/tooling/skills/goldens/claude/minutes-brief .claude/skills/minutes-brief
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Minutes Brief in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Minutes Brief on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Minutes Brief is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

/minutes-brief

Fast, non-interactive briefing that synthesizes your relationship history with someone into a one-page brief — designed so you can read it in 60 seconds before walking into a call.

This is the proactive layer. It's built to be invoked silently by a hook (e.g., 15 min before a calendar event) and to also work as a manual /minutes-brief command. Unlike /minutes-prep, brief asks no questions and sets no goals — it just hands you the facts.

How it works

Phase 0: Determine the target

Three ways the user can invoke this:

1. With a name (/minutes-brief sarah, "brief me on Alex") → Use that name directly. Before searching, check for learned aliases:

bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" aliases "<name>" 2>/dev/null

If aliases exist, search across all returned variants and treat them as the same person for the rest of the flow. If the user explicitly says two names are the same person, persist it:

bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-alias "Sarah Chen" "Sarah" "User confirmed these refer to the same person"

Then skip to Phase 1.

2. With "auto" or no argument (/minutes-brief, "brief me on my next call") → Auto-detect the next upcoming calendar event. Try sources in order — use the first that works:

  • Google Calendar MCP (best — Claude users):

    gcal_list_events(timeMin: "<now ISO>", timeMax: "<+2hr ISO>", condenseEventDetails: false)

    Filter to events with 2+ attendees, skip all-day events, pick the soonest. Pull attendee names from the event.

  • gog CLI (if installed):

    bash
    gog calendar list --today --json 2>/dev/null
  • Apple Calendar via osascript (every Mac, zero install):

    bash
    osascript -e 'tell application "Calendar" to get {summary, start date} of (every event of every calendar whose start date >= (current date) and start date < ((current date) + 2 * hours))'

If none return anything, ask once: "I can't find an upcoming meeting. Who do you want a brief on?" Then take whatever they say and move on.

3. Hook-fireable mode (/minutes-brief --auto, or invoked silently from a hook) → Same as auto, but never ask questions. If no upcoming meeting and no name, exit silently with no output. Hooks should never spam the user.

Phase 1: Gather data in parallel

The Minutes CLI already does the hard work. Person profiles, search, relationship rankings, and commitments are bounded policy-safe projections. Run the commands below in parallel and require exit status 0 before interpreting their output.

bash
# 1. Bounded live-source person profile.
minutes person "<name>"

# 2. Recent decisions involving them, last 30 days.
#    Clean JSON on stdout by default (insights does NOT accept --json — output is already JSON).
minutes insights --participant "<name>" --kind decision --since <30-days-ago>

# 3. Recent meetings with them, last 60 days. Newline-delimited JSON (one object per line).
minutes search "<name>" --limit 10 --since <60-days-ago> --format json

CLI stream-handling notes — the Minutes CLI is actively developed and its stream contract is not fully settled. Today (0.8.0):

  • minutes person, minutes insights, and minutes search --format json are bounded live-source surfaces.
  • minutes people, minutes commitments, and minutes person fail closed on authorization, resource-budget, or correction races. Never suppress a nonzero exit or translate it into an empty fact.
  • Any nonzero exit from a live-source command means the source is unavailable. Do not interpret empty stdout as “no history.”
  • Do not invent new flags on top of what's shown above — e.g. minutes insights --json is not a real flag, minutes export --since is not a real flag. The CLI will reject unknown flags with a usage error.

If a future CLI release changes any of these contracts, update this skill in the same PR that ships the CLI change.

Before declaring "first meeting on record", verify it with live-source search:

bash
minutes search "<name>" --limit 1 --format json

For multi-attendee meetings, focus on the requested person. Mention the others briefly at the end. Don't try to brief five people at once.

Phase 2: Read what you actually need

Extract the file paths of the most recent 1–2 meetings from a successful minutes search response. Reauthorize and retrieve each meeting through the native bounded surface:

bash
minutes get "<exact path>" --json

Require exit status 0 and use only the returned content. Never pass the path to the host Read tool: search results are hints, not retained authorization capabilities.

Don't read more than two — past three meetings is enough context for a brief, and the brief is supposed to fit on one screen.

Phase 3: Synthesize the brief

Produce a brief in this exact shape — every section is one tight chunk, total fits on one screen:

markdown
# Brief: <Person Name> · <today's date>

**Last conversation** (<date of most recent meeting>): <2–3 sentences in prose, including the emotional tone if discernible from the transcript>

**They've been thinking about**: <comma-separated list of 3–5 hot topics from the last 30 days, ordered by recency × frequency>

**Commitments**: Use `minutes commitments --person "<name>" --json`; require exit status 0.

**Where things stand**: <one-line read of the relationship vibe  warming, cooling, stable, urgent, drifting>

**Open with**: "<a concrete first sentence the user could literally say at the top of the call  references something specific from the last conversation>"

Concrete example of a good "Open with" line:

Bad: "Hey Sarah, how's everything going with Q2?" — generic, could be said to anyone. Bad: "Hi Sarah, hope you're doing well!" — pure filler. Good: "Hey Sarah — last time you mentioned the Q2 hiring freeze was making your roadmap impossible. Did legal come back on the contractor question?"

The good version is specific (cites Q2 freeze, the contractor angle), references something only THIS conversation history would surface, and gives Sarah an immediate hook to pick up the thread.

Rules for the brief:

  • No filler. Cut anything that doesn't change what the user does in the next 60 minutes.
  • Be specific. "They want to talk about Q2" is useless. "Sarah has raised the Q2 hiring freeze in 3 of her last 4 meetings" is useful.
  • Honest about gaps. If minutes search returns nothing, say that no matching meeting history was found. Never infer relationship facts from the unavailable graph.
  • The opening line matters most. This is the punchline. Make it usable verbatim. The user should be able to literally say it.

Phase 4: Save and display

Save the brief to ~/.minutes/briefs/ so /minutes-debrief can compare against it later:

bash
mkdir -p ~/.minutes/briefs
chmod 700 ~/.minutes/briefs

Write to ~/.minutes/briefs/YYYY-MM-DD-{person-first-name-lowercase}.brief.md with frontmatter:

yaml
---
person: <Full Name>
date: <today ISO>
brief_type: auto | manual
meeting_count: <count from minutes search results used>
trigger: "calendar:<event title>" | "manual"
---

…followed by the brief body. Then chmod 600 the file — briefs contain relationship intelligence and should be private.

Display the brief inline in the response. Don't paraphrase it or summarize it after — let the brief speak for itself.

Phase 5: One-line nudge

End with exactly one line — this skill is about speed:

"Want to think harder about goals? Run /minutes-prep <name>. After the call, run /minutes-debrief."

That's it. No follow-up questions, no "anything else I can help with?". Brief is fast on purpose.

Gotchas

  • Record explicit workflow preferences when the user states them. If the user says something like "default to prep", "always brief me first", or "stop reminding me about meeting prep", persist it:
bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-explicit workflow_preference meeting_prep_mode prep "User explicitly prefers prep"
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-explicit workflow_preference meeting_prep_mode brief "User explicitly prefers brief"
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-explicit nudge_feedback meeting_prep_nudge suppress "User explicitly asked to suppress meeting prep nudges"
  • Record explicit person aliases when the user confirms them. If the user says "Sarah and Sarah Chen are the same person" or "Dan means Dan Benamoz here", persist it:
bash
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/minutes-learn-cli.mjs" set-alias "Sarah Chen" "Sarah" "User confirmed alias"
  • Hook-fireable mode is silent on failure. When invoked with --auto and nothing matches, exit cleanly with zero output. Hooks should never spam the user. Errors only matter when the user is actively asking.
  • First-name slugs match the rest of the plugin. Save files as sarah.brief.md, not sarah-chen.brief.md. Slug rules: lowercase, ASCII-only (strip diacritics via Unicode NFKD), replace spaces and punctuation with hyphens, take only the first name token. "María José Pérez" → maria. "Jean-Claude" → jean-claude. Single-name people (Madonna) → madonna. This matches /minutes-prep and /minutes-debrief so they can find each other.
  • If the user types two names, ask once. "brief me on Sarah and Alex" — pick one as the focus and tell the user. "I'll focus the brief on Sarah since you have more history with her, and mention Alex briefly." Don't refuse, don't try to brief both fully.
  • Don't duplicate prep. Brief sets no goals, asks no questions, and never produces talking points. If the user wants any of that, the closing nudge points them at /minutes-prep. Two skills, two jobs — keep the line clean.
  • One screen of output. If the brief body is longer than ~25 lines, you've added filler. Cut it.
  • Multi-attendee meetings focus on one person. Pick the single most-mentioned attendee (highest meeting count) and brief on them. Mention others in one sentence at the end: "Also in the room: Logan, Kim." Don't try to brief everyone — the signal dilutes to noise.
  • Zero history is not an error — but verify it before claiming it. If minutes search returns empty, say that no matching meeting history was found and use only the calendar event. Never invent history.
  • Calendar attendee names are messy. The event might say "Sarah Chen sarah@acme.com" but transcripts say "Sarah" or "SPEAKER_1". Match on first name when looking up history; the CLI's --participant flag does fuzzy matching for you.
  • Briefs are sensitive. Always chmod 600. They contain relationship intelligence the user wouldn't want leaked.
  • Be honest about staleness. If the most recent meeting with this person is 3+ months old, lead with that fact: "Last conversation (4 months ago): …" — the user's mental model of the relationship may be more recent than reality.
  • Run the three live-source CLI calls in parallel. They're independent. Synthesize only from returned source-backed results after all three exit successfully.
  • A failed commitment projection is unavailable, not empty. Never claim “No open commitments” from a nonzero graph command.

Frequently asked questions

What does the Minutes Brief AI skill do?

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. Use this whenever the user says "brief me", "give me a quick brief", "what's coming up", "background on my next call", "who am I meeting next", "brief me on Sarah", "I have a call in 10 min", "quick rundown", or right before walking into a meeting. Different from /minutes-prep — brief is the fast hook-fireable version that doesn't ask questions and doesn't set goals. Use brief when speed matters; u...

Why use Minutes Brief on TypingMind?

Because you install it once and use it with any model. Minutes Brief is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Minutes Brief in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/silverstein/minutes/tree/main/tooling/skills/goldens/claude/minutes-brief. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Minutes Brief?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Minutes Brief?

As many as you like. As long as a model supports skills, you can use Minutes Brief with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Minutes Brief AI skill free?

Yes. It is published on GitHub by silverstein under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇