An AI-powered meeting assistant that joins Google Meet meetings, transcribes conversations in real-time, and provides intelligent responses when activated. Built with Recall.ai for meeting integration and OpenRouter for LLM capabilities.
Reduce number of HTTPS endpoint requests and TCP connections causing ngrok free plan to get overloaded
- Real-time Meeting Transcription: Automatically transcribes Google Meet conversations
- AI Chat Integration: Responds to questions directly in meeting chat
- Context-Aware Responses: Uses meeting context and company information for relevant answers
- Activation Control: "Hey AI" to activate, "Thanks AI" to deactivate
- Meeting Critique: Generates insights and analysis about meeting discussions
- Flexible Authentication: Optional user accounts with secure session management
- Configurable Access: Disable auth for personal use or enable for teams
- Session Security: HTTP-only cookies with secure settings
- Input Validation: Comprehensive validation and XSS protection
- Webhook Integration: Real-time data processing from Recall.ai
- Context Management: Maintains conversation history and key topics
- Web Interface: Simple dashboard for monitoring and control
- Session Management: Start/stop bot sessions with full cleanup
- Database Support: SQLite database for user accounts and sessions
- Node.js 14+ installed
- Recall.ai API key
- OpenRouter API key
- Google Meet access
# Clone and setup
cd NexMeet
npm install
# Configure environment
cp .env.example .env
nano .env
# Edit .env with your API keysFor local development, you'll need to expose your localhost to the internet for Recall.ai webhooks. Use ngrok or similar:
# Install ngrok (if not already installed)
npm install -g ngrok
# In a separate terminal, expose your local server
ngrok http 3000
# Copy the HTTPS URL (e.g., https://abc123.ngrok.io) and update .env:
WEBHOOK_URL=https://abc123.ngrok.io/webhook/transcriptnpm startOpen your browser to http://localhost:3000
With Authentication Enabled:
- Visit
http://localhost:3000 - Create an account (if registration is enabled) or login
- Access the main dashboard
With Authentication Disabled:
- Visit
http://localhost:3000 - Go directly to the dashboard
- Enter your Google Meet URL
- Optionally add meeting context (e.g., "Q4 planning meeting")
- Optionally add company context (e.g., "Tech startup, 25 employees")
- Click "Start AI Assistant"
- The bot will join your meeting automatically
- It starts in passive listening mode (transcribing only)
- Transcripts appear in real-time on the dashboard
In the meeting chat, type:
Hey AI- Activates the assistant- Ask questions directly in chat
Thanks AIorBye AI- Deactivates the assistant
Or use the dashboard:
- Send manual messages to the meeting
- Generate meeting critiques and insights
- View live transcripts
- Send custom AI messages
- Generate meeting analysis
- Stop session when done
| Endpoint | Method | Description |
|---|---|---|
/api/start-session |
POST | Start a new bot session |
/api/stop-session |
POST | Stop the current session |
/api/status |
GET | Get session status |
/api/transcripts |
GET | Get meeting transcripts |
/api/send-message |
POST | Send message to meeting |
/api/critique-meeting |
POST | Generate meeting critique |
/webhook/transcript |
POST | Webhook for Recall.ai data |
| Endpoint | Method | Description |
|---|---|---|
/auth/register |
POST | Create new user account |
/auth/login |
POST | User login |
/auth/logout |
POST | User logout |
/auth/me |
GET | Get current user info |
/auth/profile |
PUT | Update user profile |
/auth/password |
PUT | Change password |
/api/auth-config |
GET | Get authentication configuration |
# Required
RECALL_API_KEY=your_recall_api_key
OPENROUTER_API_KEY=your_openrouter_api_key
# Required for webhooks
WEBHOOK_URL=https://your-domain.com/webhook/transcript
# Optional: Server Configuration
PORT=3000
FRONTEND_URL=http://localhost:3000
NODE_ENV=development
# Optional: Authentication Configuration
AUTH_ENABLED=true # Set to 'false' to disable authentication
REGISTRATION_ENABLED=true # Set to 'false' to disable user registration
SESSION_SECRET=your_session_secret # Change in productionNexMeet supports flexible authentication modes to suit different use cases:
Perfect for personal use or trusted environments.
AUTH_ENABLED=false- No login required
- Direct access to dashboard
- No database needed
- Fastest setup
Best for teams and shared environments.
AUTH_ENABLED=true
REGISTRATION_ENABLED=true
SESSION_SECRET=your_secure_random_string- Users must create accounts and login
- Secure session management
- Full user profiles with names
- Registration open to new users
Ideal for controlled access with pre-created accounts.
AUTH_ENABLED=true
REGISTRATION_ENABLED=false
SESSION_SECRET=your_secure_random_string- Authentication required
- No new user registration
- Admin-controlled user creation
- Existing users can login
The webhook URL must be publicly accessible for Recall.ai to send real-time data. For production, use a proper domain. For development, use ngrok or similar tunneling service.
βββββββββββββββββββ ββββββββββββββββ βββββββββββββββββββ
β Frontend β β Backend β β Google Meet β
β (Dashboard) βββββΊβ (Node.js) βββββΊβ (via Recall) β
βββββββββββββββββββ ββββββββββββββββ βββββββββββββββββββ
β
βΌ
ββββββββββββββββ
β OpenRouter β
β (LLM) β
ββββββββββββββββ
- recallService.js: Recall.ai API integration
- aiService.js: OpenRouter LLM integration
- contextManager.js: Meeting context and history
- transcriptHandler.js: Webhook processing
- botManager.js: Bot lifecycle management
Bot not joining meeting:
- Verify Recall.ai API key is correct
- Check meeting URL format
- Ensure meeting is public or bot has access by setting meeting access settings to "Trusted" and "Anyone with this meeting link can join"
Webhooks not working:
- Verify webhook URL is publicly accessible
- Check ngrok is running for local development
- Confirm webhook endpoint is responding
AI not responding:
- Verify OpenRouter API key
- Check activation phrases in chat
- Ensure bot is in active mode
Transcripts not appearing:
- Wait 30-60 seconds after bot joins
- Check browser console for errors
- Verify webhook is receiving data
Authentication issues:
- Check AUTH_ENABLED setting in .env
- Verify SESSION_SECRET is set for production
- Clear browser cookies if login fails
- Check database connection (when auth enabled)
- Check browser console for Content Security Policy errors
Add debug logging by setting environment variable:
DEBUG=nexmeet* npm start- Public domain with HTTPS
- Process manager (PM2, Docker, etc.)
- Environment variable management
- Log monitoring
# Install PM2
npm install -g pm2
# Start with PM2
pm2 start src/server.js --name nexmeet
# Environment setup
export WEBHOOK_URL=https://yourdomain.com/webhook/transcript
export NODE_ENV=production
# Monitor logs
pm2 logs nexmeet- Sign up at recall.ai
- Navigate to API settings
- Generate a new API key
- Add to
.envasRECALL_API_KEY
- Sign up at openrouter.ai
- Go to API Keys section
- Create a new key
- Add to
.envasOPENROUTER_API_KEY
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
Copyright (C) 2025 zzylos
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
For issues and questions:
- Check the troubleshooting section
- Review the Recall.ai documentation
- Review the OpenRouter documentation
- If you have trouble with the Recall API, make sure your account is on the us-west-2 region.
- Open a GitHub issue for bugs or feature requests