Skip to content

DevSaloni/MeetLoop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

19 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MeetLoop Logo

MeetLoop

AI-Powered Meeting Accountability Platform
Meetings End. Commitments Shouldn't.

React Node.js MongoDB Gemini AI Socket.io Vite


πŸ“Œ The Problem

"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.


πŸš€ User Walkthrough (Demo Flow)

Here is a step-by-step flow of how a user experiences MeetLoop:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

πŸ’‘ Visual Walkthrough

MeetLoop Dashboard

MeetLoop transforms chaotic meeting notes into structured, trackable accountability in three steps:

Step 1 β†’ Paste Notes

Drop your raw meeting transcript, Zoom notes, or any text into MeetLoop. Upload .txt, .vtt files directly. No manual cleanup required.

Paste Meeting Notes

Step 2 β†’ AI Extracts Tasks & Decisions

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

AI Task Extraction

Step 3 β†’ Track Accountability & Analytics

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.

Analytics Overview

Analytics Leaderboard


✨ Key Features

πŸ€– AI-Powered Task Extraction

  • 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

πŸ‘₯ Team Workspaces

  • 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

πŸ“Š Dual-View Dashboard

  • 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

βœ… Commitment Tracking

  • 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

πŸ“ˆ Analytics & Leaderboard

  • 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

πŸ”” Real-Time Notifications

  • 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

πŸ“ Decision Log

  • Every strategic decision captured alongside tasks
  • Permanent, searchable record of what was agreed upon
  • Auto-extracted by AI from meeting context

βš™οΈ Settings & Preferences

  • 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

πŸ—οΈ System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         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β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ—ƒοΈ Data Models

User

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

Team

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)

Meeting

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

Notification

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

πŸ”Œ API Reference

Authentication

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

Teams

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

Meetings

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

Notifications

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

Miscellaneous

Method Endpoint Description Access
POST /api/misc/contact Submit contact form Public

πŸ“ Project Structure

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

πŸ› οΈ Tech Stack

Frontend

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

Backend

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

πŸš€ Getting Started

Prerequisites

  • Node.js v18+
  • MongoDB (Atlas cloud or local instance)
  • Google Gemini API Key (Get one here)
  • SMTP Email Credentials (for password reset & team invites)

1. Clone the Repository

git clone https://github.com/your-username/meetloop.git
cd meetloop

2. Setup the Server

cd server
npm install

Create 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:5173

Start the server:

npm start

The server will start on http://localhost:5000.

3. Setup the Client

cd ../client
npm install

Create a .env file in the client/ directory:

VITE_API_URL=http://localhost:5000/api

Start the development server:

npm run dev

The client will start on http://localhost:5173.


πŸ”„ Real-Time Architecture

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

πŸ€– AI Extraction Pipeline

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:

  1. gemini-2.0-flash (primary)
  2. gemini-1.5-flash
  3. gemini-flash-latest
  4. gemini-pro-latest
  5. gemini-1.5-pro

If one model hits rate limits (429) or is unavailable (404), the system automatically tries the next model.


πŸ‘₯ User Roles

Role Can Create Teams Can Create Meetings Can Extract with AI Can Assign Tasks Can Update Own Tasks Can Send Reminders
Team Lead βœ… βœ… βœ… βœ… βœ… βœ…
Contributor ❌ ❌ ❌ ❌ βœ… ❌

Author

Saloni Pawar


About

MeetLoop helps teams turn meeting discussions into clear tasks with confirmations, tracking, and accountability

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors