{"id":49165722,"url":"https://github.com/mj-deving/n8n-meeting-intelligence","last_synced_at":"2026-04-22T15:03:59.860Z","repository":{"id":351304188,"uuid":"1209520729","full_name":"mj-deving/n8n-meeting-intelligence","owner":"mj-deving","description":"Meeting recording → transcript → protocol + action items in 19s. n8n workflow with Whisper speech-to-text and Claude analysis.","archived":false,"fork":false,"pushed_at":"2026-04-22T06:37:56.000Z","size":61,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T08:32:40.729Z","etag":null,"topics":["ai-agents","code-mode","n8n","typescript","workflow-automation"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mj-deving.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":null},"created_at":"2026-04-13T14:07:16.000Z","updated_at":"2026-04-22T06:37:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mj-deving/n8n-meeting-intelligence","commit_stats":null,"previous_names":["mj-deving/n8n-meeting-intelligence"],"tags_count":0,"template":false,"template_full_name":"mj-deving/n8n-project-template","purl":"pkg:github/mj-deving/n8n-meeting-intelligence","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mj-deving%2Fn8n-meeting-intelligence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mj-deving%2Fn8n-meeting-intelligence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mj-deving%2Fn8n-meeting-intelligence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mj-deving%2Fn8n-meeting-intelligence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mj-deving","download_url":"https://codeload.github.com/mj-deving/n8n-meeting-intelligence/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mj-deving%2Fn8n-meeting-intelligence/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32141504,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T14:31:12.705Z","status":"ssl_error","status_checked_at":"2026-04-22T14:27:43.037Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","code-mode","n8n","typescript","workflow-automation"],"created_at":"2026-04-22T15:03:59.205Z","updated_at":"2026-04-22T15:03:59.853Z","avatar_url":"https://github.com/mj-deving.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Meeting Intelligence Pipeline\n\n![n8n](https://img.shields.io/badge/-n8n-EA4B71?style=flat-square) ![TypeScript](https://img.shields.io/badge/-TypeScript-3178C6?style=flat-square) ![Whisper](https://img.shields.io/badge/-Whisper-74AA9C?style=flat-square) ![Claude](https://img.shields.io/badge/-Claude-D4A574?style=flat-square)\n\n**Meeting audio or text transcript → AI analysis → structured protocol with action items, decisions, and follow-ups.** 14-node n8n workflow powered by Claude Sonnet via OpenRouter. Processing in ~19 seconds, outputs to Google Sheets, Gmail, and Slack.\n\n## Table of Contents\n\n- [Architecture](#architecture) — 14-node workflow with 2 trigger variants\n- [How It Works](#how-it-works) — pipeline steps in detail\n- [Quick Start](#quick-start) — setup in 5 steps\n- [Example Output](#example-output) — real Slack message from test run\n- [Test Scenarios](#test-scenarios) — 3 verified scenarios\n- [LLM Output Schema](#llm-output-schema) — 8 extracted fields\n- [Google Sheets Schema](#google-sheets-schema) — 12 CRM columns\n- [Tech Stack](#tech-stack) — versions and dependencies\n- [Credentials](#credentials) — required n8n credentials\n- [Whisper Options](#whisper-options) — API vs. local (GDPR)\n- [Project Structure](#project-structure)\n\n## Architecture\n\n```mermaid\nflowchart LR\n    TextWH[\"Text Webhook\\nPOST /webhook/meeting-text\"] --\u003e Analyze\n    AudioWH[\"Audio Webhook\\nPOST /webhook/meeting\"] --\u003e Whisper[\"Whisper API\\nOpenAI whisper-1\"]\n    Whisper --\u003e Analyze\n    Analyze[\"Analyze Meeting\\n(Claude Sonnet via OpenRouter)\"] --\u003e Prepare\n    Analyze -.-\u003e|AI| Model[\"Claude Model\\nanthropic/claude-sonnet-4\"]\n    Analyze -.-\u003e|Parser| Schema[\"Meeting Schema\\nStructured Output + AutoFix\"]\n    Prepare[\"Prepare CRM Data\\n(Code Node)\"] --\u003e Time[\"Measure Time\"]\n    Time --\u003e Sheets[\"Log to Google Sheets\\n(Meeting Intelligence CRM)\"]\n    Time --\u003e Email[\"Gmail Send\\n(HTML Protocol)\"]\n    Time --\u003e Slack[\"Format + Post Slack\\n(Action Items)\"]\n    Time --\u003e Response[\"Webhook Response\\n(JSON Summary)\"]\n\n    style TextWH fill:#e1f5fe,color:#0f1117,stroke:none\n    style AudioWH fill:#e8f5e9,color:#0f1117,stroke:none\n    style Whisper fill:#e8f5e9,color:#0f1117,stroke:none\n    style Analyze fill:#fff3e0,color:#0f1117,stroke:none\n    style Model fill:#fff3e0,color:#0f1117,stroke:none\n    style Schema fill:#fff3e0,color:#0f1117,stroke:none\n    style Prepare fill:#f5f5f5,color:#0f1117,stroke:none\n    style Time fill:#f5f5f5,color:#0f1117,stroke:none\n    style Sheets fill:#e8eaf6,color:#0f1117,stroke:none\n    style Email fill:#c8e6c9,color:#0f1117,stroke:none\n    style Slack fill:#ffcdd2,color:#0f1117,stroke:none\n    style Response fill:#e8eaf6,color:#0f1117,stroke:none\n```\n\n| Node | Type | Purpose |\n|------|------|---------|\n| Text Webhook | webhook | JSON input: title, participants, date, transcript |\n| Audio Webhook | webhook | Multipart audio upload |\n| Whisper Transcription | httpRequest | OpenAI Whisper API (model: whisper-1, language: de) |\n| Analyze Meeting | agent (LangChain) | Claude Sonnet analyzes transcript |\n| Claude Model | lmChatOpenAi | OpenRouter → anthropic/claude-sonnet-4 |\n| Meeting Schema | outputParserStructured | JSON schema with 8 required fields |\n| AutoFix Model | lmChatOpenAi | Gemini Flash for schema auto-fix |\n| Prepare CRM Data | code | Formats 12 columns for Google Sheets |\n| Measure Processing Time | code | Calculates processing duration |\n| Log to Google Sheets | googleSheets | Append row with explicit column mapping |\n| Send Protocol Email | gmail | HTML protocol to participants |\n| Format Slack Message | code | Slack markdown with priority icons |\n| Post Slack Actions | slack | Team channel, @channel on urgent |\n| Webhook Response | code | JSON summary as response |\n\n## How It Works\n\n1. **Receive transcript** — Text webhook (JSON) or audio webhook (multipart → Whisper)\n2. **AI analysis** — Claude Sonnet extracts: summary, decisions, action items, open questions, follow-ups, key topics, sentiment\n3. **Google Sheets** — Protocol as CRM row with 12 columns\n4. **Gmail** — HTML-formatted protocol to participants (summary, decisions as bullets, action items as table)\n5. **Slack** — Action items with @channel on high-priority items\n\n## Quick Start\n\n```bash\n# 1. Install dependencies\nnpm install\n\n# 2. Connect n8n instance\nnpx --yes n8nac init\n# URL: http://172.31.224.1:5678\n\n# 3. Create Google Sheet\nnpx --yes n8nac push \"workflows/172_31_224_1:5678_marius _j/personal/setup-meeting-sheet.workflow.ts\"\nnpx --yes n8nac workflow activate Cctig8XetXsoKeou\ncurl http://172.31.224.1:5678/webhook/setup-meeting-sheet\n\n# 4. Deploy main workflow\nnpx --yes n8nac push \"workflows/172_31_224_1:5678_marius _j/personal/meeting-intelligence.workflow.ts\"\nnpx --yes n8nac workflow activate k2VzgzfxKOtosxzn\n\n# 5. Test\ncurl -X POST http://172.31.224.1:5678/webhook/meeting-text \\\n  -H \"Content-Type: application/json\" \\\n  -d @workflows/pipelines/meeting-intelligence/test.json\n```\n\n## Example Output\n\n**Slack message (Sprint Planning Q2):**\n```\n@channel *📋 Meeting Protocol: Sprint Planning Q2*\n_2026-04-14 | Participants: Marius, Lisa, Thomas_\n\n*Summary:* Sprint planning for Q2 focused on the Meeting Intelligence Pipeline\nfor the conference demo on April 28. Decision to use Claude Sonnet via OpenRouter.\n\n*Action Items:*\n  🔴 *Thomas*: Complete API documentation (by this week)\n  🔴 *Marius*: Share OpenRouter credentials with Thomas (by today)\n  🔴 *Thomas*: Take over Whisper integration (by Friday)\n  🔴 *Lisa*: Prepare Google Sheets template (by Wednesday)\n  🟡 *Marius*: Implement Slack integration (by Thursday)\n  ⚪ *Thomas*: Document local Whisper option\n\n*Decisions:*\n  ✅ Prioritize Meeting Intelligence Pipeline as sprint goal #1\n  ✅ Use Claude Sonnet via OpenRouter instead of GPT-4\n```\n\n## Verified Test Results\n\n| Metric | Value |\n|--------|-------|\n| Processing time | 19.4 seconds |\n| Transcript length | 292 words |\n| Action items extracted | 6 |\n| Decisions detected | 2 |\n| Sentiment | positive |\n| All 12 nodes | OK |\n| Execution ID | #158 |\n| Date | 2026-04-13 |\n\n## Test Scenarios\n\n3 test payloads in `workflows/pipelines/meeting-intelligence/test.json`:\n\n| # | Scenario | Participants | Transcript | Expected |\n|---|----------|-------------|------------|----------|\n| 1 | Sprint Planning Q2 | Marius, Lisa, Thomas | 292 words | 3+ action items, 2+ decisions, positive |\n| 2 | Customer Call (Autohaus Muller) | Marius, Thomas Muller | 266 words | 2+ action items, 1+ follow-up, positive |\n| 3 | Incident Review: API Outage | Marius, DevOps Team | 281 words | 4+ action items, 1+ decision, negative |\n\n## LLM Output Schema\n\n```json\n{\n  \"summary\": \"3-5 sentence summary\",\n  \"decisions\": [{\"decision\": \"...\", \"context\": \"...\"}],\n  \"action_items\": [{\"owner\": \"...\", \"task\": \"...\", \"deadline\": \"...|null\", \"priority\": \"high|medium|low\"}],\n  \"open_questions\": [\"...\"],\n  \"follow_ups\": [{\"topic\": \"...\", \"when\": \"...\", \"participants\": [\"...\"]}],\n  \"key_topics\": [\"...\"],\n  \"sentiment\": \"positive|neutral|negative\",\n  \"duration_estimate_min\": 30\n}\n```\n\n## Google Sheets Schema\n\n| Column | Type | Description |\n|--------|------|-------------|\n| Timestamp | DateTime | Processing timestamp |\n| Meeting_Title | Text | Meeting title |\n| Date | Date | Meeting date |\n| Participants | Text | Participants (comma-separated) |\n| Summary | Text | AI-generated summary |\n| Decisions | Text | Decisions (numbered) |\n| Action_Items | Text | Action items with owner + deadline |\n| Open_Questions | Text | Open questions (numbered) |\n| Follow_Ups | Text | Planned follow-ups |\n| Sentiment | Text | positive / neutral / negative |\n| Transcript_Length | Number | Words in transcript |\n| Processing_Time_Sec | Number | Processing duration in seconds |\n\n## Tech Stack\n\n| Component | Version / Detail |\n|-----------|-----------------|\n| n8n | 2.x (Windows, WSL access via vEthernet bridge) |\n| n8nac | 1.5.0 (code-first workflow development) |\n| LLM (Analysis) | anthropic/claude-sonnet-4 via OpenRouter |\n| LLM (AutoFix) | google/gemini-2.0-flash-001 via OpenRouter |\n| Transcription | OpenAI Whisper API (whisper-1, language: de) |\n| Outputs | Google Sheets + Gmail + Slack |\n| Language | TypeScript (n8nac .workflow.ts) |\n\n## Credentials\n\n| Credential | Type | Purpose |\n|---|---|---|\n| OpenRouter | openAiApi | Claude Sonnet + Gemini Flash |\n| Google Sheets | googleSheetsOAuth2Api | Meeting protocol CRM |\n| Gmail | gmailOAuth2 | Protocol delivery |\n| Slack Bot | slackApi | Action items channel |\n| OpenAI (optional) | httpHeaderAuth | Whisper API (audio path only) |\n\n## Whisper Options\n\n| Option | Use Case | Details |\n|--------|----------|---------|\n| **OpenAI API** (default) | Demo / fast | `POST api.openai.com/v1/audio/transcriptions`, model: whisper-1 |\n| **Local Server** (GDPR) | Production | `docker run -d -p 9000:9000 onerahmet/openai-whisper-asr-webservice` |\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLocal Whisper Server Setup\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# faster-whisper as Docker service\ndocker run -d -p 9000:9000 \\\n  onerahmet/openai-whisper-asr-webservice:latest\n\n# Adjust in workflow:\n# Whisper Transcription Node → change URL to:\n# http://localhost:9000/asr?language=de\u0026output=json\n```\n\n\u003c/details\u003e\n\n## Workflows\n\n| Workflow | ID | Status | Nodes |\n|---|---|---|---|\n| Meeting Intelligence Pipeline | `k2VzgzfxKOtosxzn` | Active | 14 |\n| Setup Meeting Intelligence Sheet | `Cctig8XetXsoKeou` | Active | 2 |\n\n## Project Structure\n\n```\nn8n-meeting-intelligence/\n├── workflows/\n│   ├── pipelines/meeting-intelligence/\n│   │   ├── README.md              # Detailed workflow documentation\n│   │   ├── workflow/\n│   │   │   ├── workflow.ts        # n8nac TypeScript source (14 nodes)\n│   │   │   └── workflow.json      # n8n JSON export\n│   │   └── test.json              # 3 test scenarios\n│   └── 172_31_224_1.../personal/\n│       ├── meeting-intelligence.workflow.ts  # n8nac sync copy\n│       └── setup-meeting-sheet.workflow.ts   # Sheet setup helper\n├── scripts/\n│   ├── new-workflow.sh            # Scaffold new workflows\n│   └── check-secrets.sh           # Pre-commit secret detection\n├── docs/                          # GitHub Pages + ADRs\n├── CLAUDE.md                      # AI agent instructions\n├── AGENTS.md                      # n8nac protocol\n└── README.md\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmj-deving%2Fn8n-meeting-intelligence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmj-deving%2Fn8n-meeting-intelligence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmj-deving%2Fn8n-meeting-intelligence/lists"}