AI-Powered Meeting Accountability Platform
Meetings End. Commitments Shouldn't.
"Average teams waste 31 hours a month in unproductive meetings."
Every organization faces the same pain points after meetings end:
| Problem | Impact |
|---|---|
| Commitments Evaporate | Verbal agreements vanish the moment the call ends. No record, no follow-up. |
| No One Knows Who Owes What | Shared responsibility = zero responsibility. Tasks go unclaimed and unfinished. |
| Managers Are Blind | Leaders chase status updates manually. No visibility into who's delivering vs. stalling. |
| Manual Note-Taking is Broken | Writing down tasks by hand is slow, error-prone, and people still forget to do it. |
MeetLoop solves this by using Google Gemini AI to automatically extract tasks, decisions, and owners from raw meeting notes β then tracking every commitment to completion with real-time dashboards and notifications.
Here is a step-by-step flow of how a user experiences MeetLoop:
-
Onboarding & Team Creation
- A Team Lead signs up and creates a new workspace (e.g., "Engineering Team").
- MeetLoop generates a unique 8-character invite code.
- Contributors (team members) sign up, enter the invite code, and instantly join the workspace.
-
Conducting a Meeting
- The Team Lead holds a meeting (e.g., a Sprint Planning session).
- Instead of manually assigning tasks, the Lead pastes the raw meeting notes or Zoom transcript into the New Meeting page.
- The Lead clicks Extract with AI.
-
AI Task Extraction & Review
- Gemini AI processes the text, understands the context, matches names to team members, and generates a structured list of Tasks and Decisions.
- The Team Lead reviews the preview, makes any minor adjustments, and clicks Save.
-
The Digital Handshake
- As soon as the meeting is saved, Socket.io triggers real-time notifications to all assigned Contributors.
- Contributors see their new tasks appear instantly on their My Workspace dashboard.
-
Tracking & Accountability
- Contributors update their task statuses (Open β Done).
- The Team Lead monitors the Command Center and Analytics pages to see who is delivering on time, who is stalling, and the overall reliability score of the team.
MeetLoop transforms chaotic meeting notes into structured, trackable accountability in three steps:
Drop your raw meeting transcript, Zoom notes, or any text into MeetLoop. Upload .txt, .vtt files directly. No manual cleanup required.
Google Gemini AI analyzes the notes and automatically identifies:
- Action Items β with assigned owners, due dates, and priority levels
- Strategic Decisions β permanent record of what was agreed upon
- Meeting Summary β a concise overview generated by AI
Every team member sees their commitments on a personal dashboard. Team Leads get a command center with live reliability scores, overdue alerts, and performance analytics.
- Uses Google Gemini AI (with multi-model fallback:
gemini-2.0-flashβgemini-1.5-flashβgemini-pro) - Intelligently matches nicknames to real team member names
- Converts relative dates ("by Friday", "tomorrow") to absolute dates
- Identifies first-person references ("I will", "me") and assigns to the Team Lead
- Supports preview-before-save workflow so leads can review and edit extracted tasks
- Create private team vaults with auto-generated 8-character invite codes
- Onboard members instantly β share the code or send email invitations
- Role-based access: Team Lead (create meetings, assign tasks) vs Contributor (view & complete tasks)
- Regenerate invite codes for security
- Contributor View β "My Workspace" with personal tasks, reliability score, upcoming deadlines, and overdue alerts
- Team Lead View β "Command Center" with team-wide metrics, member progress table, operational risks, and stalled task alerts
- Real-time updates via Socket.io β no page refresh needed
- Personal commitment cards with status management (Open β Done / Blocked / Overdue)
- Priority indicators (HIGH / MEDIUM / LOW)
- Due date tracking with overdue detection
- Completion rate and reliability score calculations
- Task Completion Rate β stacked bar chart across recent meetings
- Meeting Type Distribution β donut chart breakdown (Sprint Planning, Daily Standup, etc.)
- Priority Breakdown β visual distribution of HIGH/MEDIUM/LOW tasks
- Team Leaderboard β members ranked by reliability score, punctuality, and volume
- Estimated Hours Saved β calculated from AI-processed meeting count
- In-app notifications via Socket.io with sound alerts
- Notification types: Task Assigned, Task Completed, Task Reminder, Team Invite, Meeting Created
- Team Leads can send manual reminders to stalled task owners
- Respects user notification preferences
- Every strategic decision captured alongside tasks
- Permanent, searchable record of what was agreed upon
- Auto-extracted by AI from meeting context
- Profile management (name, job role, profile picture)
- Notification preferences (toggle in-app alerts, AI summaries)
- Account purge (GDPR-friendly complete data deletion)
- Password reset via email with secure tokenized links
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT (React + Vite) β
β Deployed on Vercel β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β β Landing β β Auth β βDashboard β β New Meeting β β
β β Page β β Pages β β Layout β β (AI Extract) β β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β β Meetings β β Teams β βAnalytics β β Commitments β β
β β Page β β Page β β Page β β Page β β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β β
β Context: AuthContext β NotificationContext β SearchContext β
β Real-time: Socket.io Client β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β REST API + WebSocket
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SERVER (Node.js + Express) β
β Deployed on Render β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Middleware Layer β β
β β JWT Authentication β CORS β Body Parser β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β β Auth β β Meeting β β Team β β Notification β β
β βControllerβ βControllerβ βControllerβ β Controller β β
β ββββββββββββ ββββββββββββ ββββββββββββ βββββββββββββββββ β
β β β
β βββββββββ΄ββββββββ β
β β Google Geminiβ β
β β AI Engine β β
β βββββββββββββββββ β
β β
β Utils: sendEmail (Nodemailer) β notificationHelper (Socket.io) β
β Real-time: Socket.io Server (Rooms: user, meeting, team) β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATABASE (MongoDB Atlas) β
β β
β Collections: Users β Teams β Meetings β Notifications β Contactβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Field | Type | Description |
|---|---|---|
name |
String | Display name |
email |
String | Unique, validated email |
password |
String | bcrypt hashed, not returned by default |
role |
Enum | Team Lead or Contributor |
profilePic |
String | Base64 encoded profile image |
jobRole |
String | e.g., "Product Manager" |
preferences |
Object | { emailNotifications, aiSummaries } |
resetPasswordToken |
String | SHA-256 hashed reset token |
| Field | Type | Description |
|---|---|---|
name |
String | Team name (max 50 chars) |
description |
String | Brief description |
creator |
ObjectId β User | Team Lead who created it |
members[] |
Array | { user, role, joinedAt } |
inviteCode |
String | Auto-generated 8-char hex code |
maxMembers |
Number | Default 10 (free tier) |
| Field | Type | Description |
|---|---|---|
title |
String | Meeting title (max 100 chars) |
team |
ObjectId β Team | Which team this belongs to |
date |
Date | Meeting date |
meetingType |
Enum | Sprint Planning, Daily Standup, etc. |
notes |
String | Raw meeting notes / transcript |
summary |
String | AI-generated meeting summary |
tasks[] |
Array | { description, assignedTo, dueDate, priority, status } |
decisions[] |
Array | { title, description } |
aiProcessed |
Boolean | Whether AI extraction was run |
| Field | Type | Description |
|---|---|---|
recipient |
ObjectId β User | Who receives it |
sender |
ObjectId β User | Who triggered it |
type |
Enum | TASK_ASSIGNED, TASK_COMPLETED, TASK_REMINDER, etc. |
title |
String | Notification title |
message |
String | Notification body |
link |
String | Deep link to relevant page |
read |
Boolean | Read/unread status |
| Method | Endpoint | Description | Access |
|---|---|---|---|
POST |
/api/auth/register |
Register new user | Public |
POST |
/api/auth/login |
Login & get JWT | Public |
GET |
/api/auth/profile |
Get current user profile | Private |
PUT |
/api/auth/profile |
Update profile & preferences | Private |
DELETE |
/api/auth/purge |
Delete account & all data | Private |
POST |
/api/auth/forgotpassword |
Send password reset email | Public |
PUT |
/api/auth/resetpassword/:token |
Reset password with token | Public |
| Method | Endpoint | Description | Access |
|---|---|---|---|
GET |
/api/teams |
List all user's teams | Private |
POST |
/api/teams |
Create a new team | Team Lead |
POST |
/api/teams/join |
Join team via invite code | Private |
GET |
/api/teams/:id |
Get team details | Member |
PUT |
/api/teams/:id |
Update team info | Creator |
DELETE |
/api/teams/:id |
Delete team | Creator |
DELETE |
/api/teams/:id/members/:userId |
Remove a member | Creator |
DELETE |
/api/teams/:id/leave |
Leave a team | Member |
PUT |
/api/teams/:id/regenerate-code |
Regenerate invite code | Creator |
POST |
/api/teams/:id/invite |
Send invite email | Creator |
| Method | Endpoint | Description | Access |
|---|---|---|---|
GET |
/api/meetings |
Get all meetings for user's teams | Private |
POST |
/api/meetings |
Create meeting (with AI extraction) | Team Lead |
GET |
/api/meetings/:id |
Get single meeting details | Member |
PUT |
/api/meetings/:id |
Update meeting | Creator |
DELETE |
/api/meetings/:id |
Delete meeting | Creator |
POST |
/api/meetings/extract-preview |
AI extraction without saving | Team Lead |
POST |
/api/meetings/:id/extract |
Re-run AI extraction on existing notes | Creator |
PUT |
/api/meetings/:id/tasks/:taskId |
Update task status/details | Assignee/Creator |
POST |
/api/meetings/:id/tasks/:taskId/remind |
Send reminder to task assignee | Creator |
GET |
/api/meetings/my-tasks |
Get all tasks assigned to current user | Private |
| Method | Endpoint | Description | Access |
|---|---|---|---|
GET |
/api/notifications |
Get user's notifications | Private |
PUT |
/api/notifications/:id/read |
Mark notification as read | Private |
PUT |
/api/notifications/read-all |
Mark all as read | Private |
DELETE |
/api/notifications/:id |
Delete a notification | Private |
| Method | Endpoint | Description | Access |
|---|---|---|---|
POST |
/api/misc/contact |
Submit contact form | Public |
meetloop/
βββ README.md
βββ client/ # Frontend (React + Vite)
β βββ public/ # Static assets & images
β βββ src/
β βββ components/ # Reusable UI & Layout components
β βββ context/ # React Context (Auth, Notifications, Search)
β βββ hooks/ # Custom React hooks (e.g., useDraft)
β βββ pages/ # Application pages (Dashboard, Meetings, etc.)
β βββ App.jsx # Routing configuration
β βββ main.jsx # Entry point
βββ server/ # Node.js + Express Backend
βββ controllers/ # Business logic (Auth, Meetings, Teams)
βββ middleware/ # Express middleware (Auth, Role checks)
βββ models/ # MongoDB Mongoose schemas
βββ routes/ # API endpoint definitions
βββ utils/ # Helpers (Email, Notifications)
βββ index.js # Server entry point & Socket.io setup
| Technology | Purpose |
|---|---|
| React 19 | UI component library |
| Vite 8 | Build tool & dev server |
| React Router v7 | Client-side routing |
| Axios | HTTP client for API calls |
| Socket.io Client | Real-time WebSocket connection |
| React Hot Toast | Toast notification system |
| Google Fonts | Space Grotesk + Inter typography |
| Material Symbols | Icon system |
| Technology | Purpose |
|---|---|
| Node.js + Express | REST API server |
| MongoDB + Mongoose | NoSQL database & ODM |
| Socket.io | Real-time bi-directional communication |
| Google Generative AI | Gemini AI for task extraction |
| JWT (jsonwebtoken) | Stateless authentication |
| bcryptjs | Password hashing |
| Nodemailer | Transactional emails (reset password, invites) |
| dotenv | Environment variable management |
- Node.js v18+
- MongoDB (Atlas cloud or local instance)
- Google Gemini API Key (Get one here)
- SMTP Email Credentials (for password reset & team invites)
git clone https://github.com/your-username/meetloop.git
cd meetloopcd server
npm installCreate a .env file in the server/ directory:
# Database
MONGODB_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/meetloop
# Authentication
JWT_SECRET=your_super_secret_jwt_key_here
# Google Gemini AI
GEMINI_API_KEY=your_gemini_api_key_here
# Email (Nodemailer)
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_app_password
FROM_NAME=MeetLoop
FROM_EMAIL=your_email@gmail.com
# Client URL (for password reset links & invite links)
CLIENT_URL=http://localhost:5173Start the server:
npm startThe server will start on http://localhost:5000.
cd ../client
npm installCreate a .env file in the client/ directory:
VITE_API_URL=http://localhost:5000/apiStart the development server:
npm run devThe client will start on http://localhost:5173.
MeetLoop uses Socket.io for real-time features:
| Event | Direction | Description |
|---|---|---|
join |
Client β Server | Join user's private notification room |
join_meeting |
Client β Server | Subscribe to meeting-specific updates |
join_team |
Client β Server | Subscribe to team-wide updates |
notification |
Server β Client | Push notification to specific user |
meeting_update |
Server β Client | Broadcast meeting data changes |
meeting_list_update |
Server β Client | Signal team dashboard refresh |
team_update |
Server β Client | Broadcast team membership changes |
Raw Meeting Notes
β
βΌ
ββββββββββββββββββββ
β Gemini AI Prompt β β Team member list + names + IDs
β (Structured) β β Current date for relative dates
β β β Team Lead identity for "me/I"
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β JSON Response β
β βββββββββββββββ β
β β summary β β
β β tasks[] β β β description, assignedTo, dueDate, priority
β β decisions[] β β β title, description
β βββββββββββββββ β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β Validation & β
β ObjectID Check β β Verify assignedTo is valid MongoDB ObjectId
β Date Parsing β β Convert string dates to Date objects
β Status Merge β β Preserve existing task statuses on re-extract
ββββββββββββββββββββ
Model Fallback Strategy:
gemini-2.0-flash(primary)gemini-1.5-flashgemini-flash-latestgemini-pro-latestgemini-1.5-pro
If one model hits rate limits (429) or is unavailable (404), the system automatically tries the next model.
| Role | Can Create Teams | Can Create Meetings | Can Extract with AI | Can Assign Tasks | Can Update Own Tasks | Can Send Reminders |
|---|---|---|---|---|---|---|
| Team Lead | β | β | β | β | β | β |
| Contributor | β | β | β | β | β | β |
Saloni Pawar





