Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ae95874
Add README for Meeting Intelligence Agent
AnuragDubey007 Apr 21, 2026
bedd1bd
feat: add meeting intelligence kit
AnuragDubey007 Apr 21, 2026
8c28948
Add config.json for Meeting Intelligence Agent
AnuragDubey007 Apr 21, 2026
853bac7
Add configuration for meeting intelligence flow
AnuragDubey007 Apr 21, 2026
bb02f1d
Add files via upload
AnuragDubey007 Apr 21, 2026
2380af5
Create meeting-notes-extractor
AnuragDubey007 Apr 21, 2026
8867c6c
Delete kits/automation/meeting-intelligence/flows/config.json
AnuragDubey007 Apr 21, 2026
f049ce6
Delete kits/automation/meeting-intelligence/flows directory
AnuragDubey007 Apr 21, 2026
213eb49
Add config.json for meeting notes extraction flow
AnuragDubey007 Apr 21, 2026
a7737fe
Add files via upload
AnuragDubey007 Apr 21, 2026
d6a54a8
Add files via upload
AnuragDubey007 Apr 21, 2026
78b5f56
Add .gitignore for meeting intelligence project
AnuragDubey007 Apr 21, 2026
22bb3d2
Add analyzeMeeting function for workflow execution
AnuragDubey007 Apr 21, 2026
549c9fc
Add lamatic client configuration and executeFlow function
AnuragDubey007 Apr 21, 2026
543d9cb
Merge branch 'main' into main
AnuragDubey007 Apr 21, 2026
9d17091
Update kits/automation/meeting-intelligence/app/layout.tsx
AnuragDubey007 Apr 21, 2026
2df5b81
Update kits/automation/meeting-intelligence/package.json
AnuragDubey007 Apr 21, 2026
e6525d1
Update kits/automation/meeting-intelligence/README.md
AnuragDubey007 Apr 21, 2026
745b251
Update kits/automation/meeting-intelligence/README.md
AnuragDubey007 Apr 21, 2026
def3648
Update kits/automation/meeting-intelligence/package.json
AnuragDubey007 Apr 21, 2026
55678c7
Update kits/automation/meeting-intelligence/app/globals.css
AnuragDubey007 Apr 21, 2026
4dd69b0
Refactor analyzeMeeting to use executeFlow
AnuragDubey007 Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added kits/automation/meeting-intelligence/.env.example
Binary file not shown.
4 changes: 4 additions & 0 deletions kits/automation/meeting-intelligence/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
.env
.env.local
.next/
193 changes: 193 additions & 0 deletions kits/automation/meeting-intelligence/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
# 🧠 Meeting Intelligence Agent

> Stop losing action items after meetings. Paste your raw notes — get a structured report delivered to your inbox in seconds.

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/AnuragDubey007/meeting-intelligence)

## 🔴 Live Demo

**[https://meeting-intelligence-tau.vercel.app/]**

---

## The Problem

Every team has this problem.

Someone takes notes during a meeting — messy, unstructured, full of half sentences. After the meeting ends, nobody knows exactly who owns what task or what deadline was agreed on. Action items get lost in a wall of text. Follow ups never happen. The meeting was a waste of time.

Existing tools like Zoom AI require you to be inside their ecosystem and cost money. This is open source, works with any text source, and runs entirely on Lamatic.

---

## The Solution

Paste any raw meeting notes. The agent:

- Writes a clean 2-3 sentence summary
- Extracts every action item with owner, deadline, and priority
- Lists all decisions that were made
- Identifies follow up questions that need answers
- Emails the full structured report to your team automatically

---

## How It Works
Raw Notes → Lamatic Flow → LLM Extraction → Code Parser → SMTP Email → Dashboard

1. User pastes messy meeting notes and enters recipient email in the Next.js UI
2. Frontend sends the data to Lamatic via GraphQL API
3. **LLM Node** extracts structured JSON from the raw notes using Llama 3.3 70B
Comment on lines +38 to +40
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Mission telemetry mismatch: request path description is inaccurate.

Line 39 says the frontend sends data directly to Lamatic GraphQL, but this kit structure includes app/api/analyze/route.ts; the step should describe frontend → /api/analyze → Lamatic.

✏️ Suggested wording
-2. Frontend sends the data to Lamatic via GraphQL API
-3. **LLM Node** extracts structured JSON from the raw notes using Llama 3.3 70B
+2. Frontend sends the data to the Next.js API route (`/api/analyze`)
+3. Backend route forwards the payload to Lamatic GraphQL (`executeWorkflow`)
+4. **LLM Node** extracts structured JSON from the raw notes using Llama 3.3 70B
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@kits/automation/meeting-intelligence/README.md` around lines 38 - 40, Update
step 2 in the README so it accurately describes the request flow: change the
statement that the frontend sends data directly to Lamatic GraphQL to indicate
the Next.js frontend posts to the local API route (/api/analyze implemented in
app/api/analyze/route.ts), which then forwards/queries Lamatic GraphQL;
reference the Next.js UI, the /api/analyze route, and Lamatic GraphQL in the
revised wording so readers can follow the exact flow.

4. **Code Node** parses the JSON and builds a formatted HTML email body
5. **SMTP Node** sends the report directly to the recipient's inbox
6. **API Response** returns the parsed data to the frontend dashboard

---

## Lamatic Flow Architecture

The entire intelligence pipeline runs inside Lamatic — 5 nodes, zero backend servers:

| Node | Purpose |
|------|---------|
| API Request | Accepts `meetingNotes` and `recipientEmail` from the frontend |
| Generate Text | Runs Llama 3.3 70B via Groq to extract structured JSON |
| Code Node | Parses JSON response and builds HTML email body |
| SMTP Node | Sends formatted report to recipient email automatically |
| API Response | Returns structured result back to the Next.js frontend |

---

## Features

- Works with any meeting notes — standups, client calls, brainstorms, retrospectives
- Automatically identifies task owners from natural language
- Color coded priority labels — High, Medium, Low
- Sends formatted HTML email report via Lamatic SMTP node
- Copy all results to clipboard in one click
- Clean dark UI built with Next.js and Tailwind CSS
- Fully open source and self hostable

---

## Tech Stack

| Layer | Technology |
|-------|-----------|
| Frontend | Next.js 16, TypeScript, Tailwind CSS |
| AI Orchestration | Lamatic.ai |
| LLM | Llama 3.3 70B via Groq |
| Email Delivery | Lamatic SMTP Node |
| Deployment | Vercel |

---

## Setup

### Prerequisites

- Node.js 18+
- Lamatic.ai account (free)
- Gmail or SMTP credentials configured in Lamatic Connections

### 1. Clone and install


### 2. Set up environment variables

Copy `.env.example` to `.env.local` and fill in your values:

```bash
cp .env.example .env.local
```

```env
LAMATIC_API_URL=your_lamatic_graphql_endpoint
LAMATIC_API_KEY=your_lamatic_api_key
LAMATIC_PROJECT_ID=your_project_id
LAMATIC_FLOW_ID=your_flow_id
```

Get these values from Lamatic Studio → your project → Connect → API tab.

### 3. Import the Lamatic Flow

- Go to Lamatic Studio
- Create a new flow
- Set up the 5 nodes as described in the architecture section above
- Configure your SMTP credentials in Lamatic Connections
- Deploy the flow
- Copy your Flow ID and Project credentials to `.env.local`
Comment thread
AnuragDubey007 marked this conversation as resolved.

### 4. Run locally

```bash
npm run dev
```

Open `http://localhost:3000`

### 5. Deploy to Vercel

Click the Deploy button at the top of this README or:

1. Push to GitHub
2. Import repo in Vercel
3. Add all 4 environment variables in Vercel settings
4. Deploy

---

## Example

**Input — raw messy notes:**
ok so we had our weekly sync. raj mentioned the API is still slow and
needs optimization before launch. priya will handle the database indexing
by thursday. john said the login page bug is critical and needs to be fixed
today. we decided to delay the launch by one week to april 28. need to
follow up with the design team about the new onboarding flow.

**Output — structured report:**

**Summary:** The team discussed pre-launch blockers including API performance and a critical login bug. The launch has been delayed by one week. Database optimization and bug fixes are the immediate priorities.

**Action Items:**

| Task | Owner | Deadline | Priority |
|------|-------|----------|----------|
| Optimize API performance | Raj | Before launch | 🔴 High |
| Database indexing | Priya | Thursday | 🔴 High |
| Fix login page bug | John | Today | 🔴 High |
| Follow up with design team | Unknown | Not specified | 🟡 Medium |

**Decisions:** Launch delayed to April 28

**Follow Up:** What is the status of the new onboarding flow design?

---

## Project Structure

```
kits/automation/meeting-intelligence/
├── app/
│ ├── api/
│ │ └── analyze/
│ │ └── route.ts
│ ├── page.tsx
│ └── layout.tsx
├── .env.example
├── package.json
└── README.md
```

---

## Contributing

This kit is part of [Lamatic AgentKit](https://github.com/Lamatic/AgentKit).
See [CONTRIBUTING.md](../../../CONTRIBUTING.md) for guidelines.

---

Built with ❤️ for the Lamatic AgentKit Challenge
11 changes: 11 additions & 0 deletions kits/automation/meeting-intelligence/actions/orchestrate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"use server";
import { executeFlow } from "@/lib/lamatic-client";

export async function analyzeMeeting(meetingNotes: string, recipientEmail: string) {
// We use executeFlow from your lib folder instead of raw fetch
const result = await executeFlow(
process.env.LAMATIC_FLOW_ID!,
{ meetingNotes, recipientEmail }
);
Comment on lines +6 to +9
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify declaration and call-site arity for executeFlow.
ast-grep --lang ts --pattern 'export async function executeFlow($_) { $$$ }' kits/automation/meeting-intelligence/lib/lamatic-client.ts
ast-grep --lang ts --pattern 'executeFlow($_, $_)' kits/automation/meeting-intelligence/actions/orchestrate.ts
rg -nP -C2 'export\s+async\s+function\s+executeFlow\s*\(' kits/automation/meeting-intelligence/lib/lamatic-client.ts
rg -nP -C2 '\bexecuteFlow\s*\(' kits/automation/meeting-intelligence/actions/orchestrate.ts

Repository: Lamatic/AgentKit

Length of output: 3760


Your mission, should you choose to accept: fix this function contract before merging.

The call at lines 6–9 passes two arguments to executeFlow, but the function declared in kits/automation/meeting-intelligence/lib/lamatic-client.ts accepts only one parameter—payload: Record<string, string>. This is a TypeScript build-breaker.

The implementation reads the flow ID from lamaticConfig.flowId, not from the call site. Correct the call to match the contract:

-  const result = await executeFlow(
-    process.env.LAMATIC_FLOW_ID!,
-    { meetingNotes, recipientEmail }
-  );
+  const result = await executeFlow({ meetingNotes, recipientEmail });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const result = await executeFlow(
process.env.LAMATIC_FLOW_ID!,
{ meetingNotes, recipientEmail }
);
const result = await executeFlow({ meetingNotes, recipientEmail });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@kits/automation/meeting-intelligence/actions/orchestrate.ts` around lines 6 -
9, The call to executeFlow in orchestrate.ts incorrectly supplies two arguments
(process.env.LAMATIC_FLOW_ID! and the payload) while the declared function
signature in lamatic-client.ts is executeFlow(payload: Record<string,string>);
remove the first argument so the call becomes a single payload object (include
meetingNotes and recipientEmail) to match executeFlow's contract and avoid the
TypeScript build error.

return result ?? { error: "No result" };
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
41 changes: 41 additions & 0 deletions kits/automation/meeting-intelligence/app/api/analyze/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { NextRequest, NextResponse } from "next/server";

export async function POST(req: NextRequest) {
const { meetingNotes, recipientEmail } = await req.json();

const query = `
query ExecuteWorkflow($workflowId: String!, $meetingNotes: String, $recipientEmail: String) {
executeWorkflow(
workflowId: $workflowId
payload: { meetingNotes: $meetingNotes, recipientEmail: $recipientEmail }
) {
status
result
}
}
`;

const response = await fetch(process.env.LAMATIC_API_URL!, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`,
"x-project-id": process.env.LAMATIC_PROJECT_ID!,
},
body: JSON.stringify({
query,
variables: {
workflowId: process.env.LAMATIC_FLOW_ID,
meetingNotes,
recipientEmail,
},
}),
});

const data = await response.json();


const result = data?.data?.executeWorkflow?.result?.result;

return NextResponse.json(result ?? { error: "No result" });
Comment thread
AnuragDubey007 marked this conversation as resolved.
Comment on lines +6 to +40
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Mission cleanup: reuse the shared Lamatic flow client.

This route duplicates the GraphQL query, headers, variables, and result extraction already present in lib/lamatic-client.ts. After adding auth, call executeFlow() here to keep Lamatic request behavior in one place.

♻️ Proposed refactor
 import { NextRequest, NextResponse } from "next/server";
+import { executeFlow } from "@/lib/lamatic-client";

 export async function POST(req: NextRequest) {
   const { meetingNotes, recipientEmail } = await req.json();
-
-  const query = `
-    query ExecuteWorkflow($workflowId: String!, $meetingNotes: String, $recipientEmail: String) {
-      executeWorkflow(
-        workflowId: $workflowId
-        payload: { meetingNotes: $meetingNotes, recipientEmail: $recipientEmail }
-      ) {
-        status
-        result
-      }
-    }
-  `;
-
-  const response = await fetch(process.env.LAMATIC_API_URL!, {
-    method: "POST",
-    headers: {
-      "Content-Type": "application/json",
-      "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`,
-      "x-project-id": process.env.LAMATIC_PROJECT_ID!,
-    },
-    body: JSON.stringify({
-      query,
-      variables: {
-        workflowId: process.env.LAMATIC_FLOW_ID,
-        meetingNotes,
-        recipientEmail,
-      },
-    }),
-  });
-
-  const data = await response.json();
-  
-  
-  const result = data?.data?.executeWorkflow?.result?.result;
-
-  return NextResponse.json(result ?? { error: "No result" });
+  const result = await executeFlow({ meetingNotes, recipientEmail });
+  return NextResponse.json(result);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@kits/automation/meeting-intelligence/app/api/analyze/route.ts` around lines 6
- 40, Replace the in-file GraphQL fetch in analyze/route.ts with a call to the
shared Lamatic client: locate the duplicated logic that builds the query,
headers, variables (using workflowId, meetingNotes, recipientEmail) and the
response extraction, and instead call the exported executeFlow (or
executeWorkflow/executeFlowAsync) function from lib/lamatic-client.ts passing
meetingNotes and recipientEmail (and letting it supply auth/project/workflowId);
return the executeFlow result (or map its response to the same shape the route
expects) and remove the local fetch/query/response.json/result extraction so all
Lamatic request behavior is centralized in executeFlow.

}
Binary file not shown.
26 changes: 26 additions & 0 deletions kits/automation/meeting-intelligence/app/globals.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
@import "tailwindcss";

:root {
--background: #ffffff;
--foreground: #171717;
}

@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}

@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}

body {
background: var(--background);
color: var(--foreground);
font-family: var(--font-sans), Arial, Helvetica, sans-serif;
}
Comment thread
AnuragDubey007 marked this conversation as resolved.
34 changes: 34 additions & 0 deletions kits/automation/meeting-intelligence/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";

const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});

const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});

export const metadata: Metadata = {
title: "Meeting Intelligence Agent",
description:
"Transform chaotic meeting notes into structured action items, decisions, and follow-ups — delivered straight to your inbox.",
};
Comment thread
AnuragDubey007 marked this conversation as resolved.

export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html
lang="en"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">{children}</body>
</html>
);
}
Loading
Loading