skills/integrations/fathom/process-client-meeting/SKILL.md
Complete end-to-end workflow to process a client meeting. Load when user says "process meeting", "meeting workflow", "process client meeting", "full meeting processing", "handle meeting for [client]", or "post-meeting workflow". Handles transcript fetching, minutes creation, Linear tickets, client updates, internal updates, and project context sync.
npx skillsauth add beam-ai-team/beam-next-skills process-client-meetingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Complete end-to-end workflow for processing client meetings from transcript to deliverables.
Automates the entire post-meeting workflow:
Time saved: ~45 minutes of manual work per meeting
Required integrations (add to .env):
# Fathom API - for meeting transcripts
FATHOM_API_KEY=your-fathom-key
# Linear API - for ticket management
LINEAR_API_KEY=lin_api_xxxxx
# Slack - for team notifications (run setup_slack.py first)
SLACK_USER_TOKEN=xoxp-xxxxx
┌─────────────────────────────────────────────────────────────┐
│ STEP 1: Fetch Meeting [CHECKPOINT: Select meeting] │
│ ↓ │
│ STEP 2: Create Meeting Minutes │
│ ↓ │
│ STEP 3: Create Linear Tickets (action items) │
│ ↓ │
│ STEP 4: Update Existing Tickets (if discussed) │
│ ↓ │
│ STEP 5: Draft Client Update [CHECKPOINT: Approve draft] │
│ ↓ │
│ STEP 6: Send Internal Update (Slack) │
│ ↓ │
│ STEP 7: Update Project Context │
└─────────────────────────────────────────────────────────────┘
Retrieve meeting list and transcript from Fathom API filtered by client domain.
API Endpoint: https://api.fathom.ai/external/v1
Auth Header: X-Api-Key: {FATHOM_API_KEY}
Known Client Domains: | Client | Domain | |--------|--------| | Smartly | smartly.io | | Rivertrace | rivertrace.com | | Moverii | moverii.de | | Doula Givers | doulagivers.com |
curl -s --request GET \
--url 'https://api.fathom.ai/external/v1/meetings?calendar_invitees_domains[]={DOMAIN}&include_summary=true&include_action_items=true' \
--header 'X-Api-Key: {FATHOM_API_KEY}'
Display:
Found 3 meetings for smartly.io:
1. Weekly Sync - Dec 20, 2025
Summary: Discussed pipeline progress and Q1 planning...
Recording ID: abc123-def456
2. Technical Review - Dec 18, 2025
Summary: Reviewed architecture decisions...
Recording ID: ghi789-jkl012
Which meeting to process? (enter number)
curl -s --request GET \
--url 'https://api.fathom.ai/external/v1/recordings/{RECORDING_ID}/transcript' \
--header 'X-Api-Key: {FATHOM_API_KEY}'
Response Format:
{
"transcript": [
{
"speaker": {"display_name": "Name", "matched_calendar_invitee_email": "email"},
"text": "What they said",
"timestamp": "HH:MM:SS"
}
]
}
Transform raw transcript into structured meeting minutes with discussion points and action items.
Discussion Points (include):
Action Items (include):
Action Items (exclude):
# Meeting Minutes: [Client] — [Topic]
**Date:** [Month Day, Year]
**Attendees:** [Name] (Company), [Name] (Company)
**Recording:** [Fathom link if available]
---
## Discussion Points
- [Topic with context and decisions made]
- [Technical details or process explanations]
- [Blockers, dependencies, or waiting items]
---
## Action Items
### Internal Team
- [Person] to [specific task with deliverable]
- [Person] to [specific task with deliverable]
### Client Actions
- [Person] to [specific task]
---
## Decisions Made
- [Decision 1]
- [Decision 2]
---
## Next Meeting
[Date/time if discussed]
[project-folder]/meetings/YYYY-MM-DD-Meeting-Minutes.md
Create Linear tickets from internal team action items.
API Endpoint: https://api.linear.app/graphql
Auth Header: Authorization: {LINEAR_API_KEY} (NO "Bearer" prefix!)
Team IDs: | Team | ID | |------|-----| | Clients | 2686694f-6343-48a0-9efb-d69d77aaa621 |
State IDs (Clients team): | State | ID | |-------|-----| | Todo | d8899534-a204-4446-a06b-681cbc4c6e04 | | In Progress | 9a2c9ba8-5931-491e-8298-c9fb761aab23 | | In Review | 7866c5ad-5654-4516-849f-b3f7462613d6 | | Done | 40112a2a-870e-48ca-aeff-7f16356acd90 |
Priority Values: | Priority | Value | |----------|-------| | Urgent | 1 | | High | 2 | | Medium | 3 | | Low | 4 |
mutation CreateIssue($input: IssueCreateInput!) {
issueCreate(input: $input) {
success
issue {
id
identifier
title
url
}
}
}
Variables:
{
"input": {
"title": "Task title (no project prefix)",
"teamId": "2686694f-6343-48a0-9efb-d69d77aaa621",
"projectId": "PROJECT_UUID",
"stateId": "d8899534-a204-4446-a06b-681cbc4c6e04",
"priority": 3,
"description": "## Context\nFrom meeting: [date]\n\n## Description\n[Task details]"
}
}
Created 3 tickets:
- CLI-456: Implement data validation logic
- CLI-457: Update documentation for new API
- CLI-458: Review architecture proposal
Update tickets that were discussed in the meeting (status changes, comments).
Look for ticket references in transcript:
mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
issueUpdate(id: $id, input: $input) {
success
issue {
identifier
title
state { name }
}
}
}
Variables (status change):
{
"id": "issue-uuid",
"input": {
"stateId": "40112a2a-870e-48ca-aeff-7f16356acd90"
}
}
mutation AddComment($issueId: String!, $body: String!) {
commentCreate(input: {
issueId: $issueId,
body: $body
}) {
success
comment { id }
}
}
Updated tickets:
- CLI-400: In Progress → Done (comment: "Completed per meeting discussion")
Generate external client-facing summary for Slack or email.
Hey team! Quick update from today's call:
**What we covered:**
• [Key discussion point 1]
• [Key discussion point 2]
• [Decision made]
**Next steps:**
• [Our team]: [Action with timeline]
• [Your team]: [What we need from them]
**Next meeting:** [Date/time if scheduled]
Let me know if you have any questions!
Subject: [Client] Meeting Follow-up - [Date]
Hi [Name],
Thanks for the productive call today! Here's a quick summary:
**Discussion Highlights:**
- [Point 1]
- [Point 2]
**Action Items:**
Our team:
- [Action 1]
- [Action 2]
Your team:
- [Action if any]
**Next Steps:**
[Timeline and next meeting info]
Best regards,
[Name]
Draft client update:
---
[Content]
---
1. Approve and continue
2. Request changes
3. Skip client update
Choice:
Post meeting summary to internal team Slack channel.
Uses Slack User OAuth token from .env:
SLACK_USER_TOKEN=xoxp-xxxxx
curl -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer {SLACK_USER_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"channel": "#client-updates",
"text": "Meeting update message..."
}'
*[Client] Meeting Summary* - [Date]
*Key Decisions:*
• [Decision 1]
• [Decision 2]
*Action Items Created:*
• CLI-456: [Task]
• CLI-457: [Task]
*Blockers/Risks:*
• [Any blockers identified]
*Next Meeting:* [Date]
Full notes: [link to minutes]
Sync PROJECT_CONTEXT.md and project-state.json with meeting outcomes.
Add new entry at TOP of file:
## [Today's Date]
**Meeting: [Topic]**
- [Key outcome 1]
- [Key outcome 2]
- Action items: CLI-456, CLI-457, CLI-458
- Next meeting: [Date]
**Decisions:**
- [Decision 1]
- [Decision 2]
{
"lastUpdated": "[timestamp]",
"currentPhase": "[DISCOVERY|BUILD|REVIEW|COMPLETE]",
"recentActivity": [
{
"date": "[today]",
"type": "meeting",
"summary": "[Meeting topic and key outcomes]",
"tickets": ["CLI-456", "CLI-457"]
}
],
"nextSteps": [
"[Updated next step 1]",
"[Updated next step 2]"
],
"openIssues": ["[Any new issues]"],
"blockers": ["[Any blockers]"]
}
Meeting Processing Complete
Meeting Minutes
Saved: [path/to/minutes.md]
Linear Tickets
Created: CLI-456, CLI-457, CLI-458
Updated: CLI-400 → Done
Client Update
Status: Approved
Format: Slack message
Internal Update
Posted to: #client-updates
Project Context
Updated: PROJECT_CONTEXT.md
Updated: project-state.json
All steps completed successfully!
| Step | Error | Recovery | |------|-------|----------| | 1 | No meetings found | Ask for different date range or domain | | 1 | API 401 | Check FATHOM_API_KEY | | 3 | Linear 401 | Check LINEAR_API_KEY (no Bearer prefix!) | | 5 | User skips | Continue to step 6 | | 6 | Slack fails | Offer to copy message manually |
On any step failure:
Skip steps based on context:
Run individual steps: Each step can be executed independently via the component skills.
Version: 1.0 Integration: Fathom, Linear, Slack Owner: Hassaan Ahmed Tested: Full workflow validated
development
--- name: taste-skill type: skill version: '1.0' author: Leonxlnx (packaged by Zhichao Li) category: general tags: - frontend - design - anti-slop - landing-page updated: '2026-06-11' visibility: public description: Anti-slop frontend skill for landing pages, portfolios, and redesigns. The agent reads the brief, infers the right design direction, and ships interfaces that do not look templated. Real design systems when applicable, audit-first on redesigns, strict pre-flight check. license: MIT.
development
Use when communicating quantitative information in any form — Slack updates, emails, reports, decks, dashboards, landing pages, product UI, public talks. Covers two integrated layers: (1) making numbers semantically meaningful (translation, anchoring, simplification, story-pairing) and (2) showing numbers cleanly (chart vs table vs prose, chart-by-message, pre-attentive emphasis, color discipline, decluttering). Distilled and integrated from *Show Me the Numbers* (Stephen Few) and *Make Numbers Count* (Chip Heath & Karla Starr). Not for raw data analysis or statistics — this is about communication of numbers, not their derivation.
development
Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
tools
Stateful multi-session tutor adapted for Beam — teach a stakeholder to understand, trust, and operate a specific agent, or teach a Solution Engineer a client's business process for delivery. Grounds every lesson in Knowledge Hub sources (real agent graphs, real tasks, transcripts, Linear) before any web resource. Also works for any general topic. Trigger on "teach me", "beam teach", "教我", "onboard <person> on <agent>", "help <stakeholder> understand the agent", "learn this client's process".