Luna is an AI-powered meeting bot that autonomously joins video calls, records audio, transcribes speech with Whisper, and generates structured summaries using Azure OpenAI GPT.
- Join — A headless Chromium browser navigates to the meeting URL and joins with mic/camera disabled.
- Record — FFmpeg captures system audio in 30-second WAV chunks via a virtual audio device.
- Transcribe — A local Whisper model converts audio chunks to text.
- Summarize — The transcript is sent to Azure OpenAI, returning a structured Markdown document with Summary, Key Decisions, Action Items, and Open Questions.
- Dashboard — A React web UI lets you dispatch the bot, watch live status, and browse past meetings.
- Google Meet
- Zoom
- Microsoft Teams
(Auto-detected from the meeting URL.)
- Node.js 18+
- Python 3 with a
.venvvirtual environment containingopenai-whisper - FFmpeg installed and on your
PATH - BlackHole 2ch virtual audio device (macOS) for capturing meeting audio
- A Google account for the bot to join meetings with
- An Azure OpenAI resource with a GPT deployment
# From the backend/ directory
npm install
cd ../frontend && npm installOr from backend/:
npm run install:allCreate backend/.env:
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_DEPLOYMENT=gpt-4o-mini
AZURE_OPENAI_API_VERSION=2025-01-01-preview
GOOGLE_EMAIL=your-bot-account@gmail.com
GOOGLE_PASSWORD=your-password
WHISPER_MODEL=base # base | medium | large
PORT=3000cd backend
python3 -m venv .venv
.venv/bin/pip install openai-whisperThis opens a real Chrome window so you can log in to Google. Cookies are saved to session.json for future headless runs.
node backend/save-session.js
# Log in to Google in the browser window, then press Enter in the terminalcd backend
npm run dashboardThis starts the Express API on http://localhost:3000 and the Vite dev server on http://localhost:5173.
cd backend
npm run build # builds the frontend
npm start # serves everything on port 3000node backend/luna.js "https://meet.google.com/abc-defg-hij"Luna/
├── backend/
│ ├── server.js # Express API, SSE real-time updates
│ ├── luna.js # Bot engine (join → record → transcribe → summarize)
│ ├── save-session.js # One-time Google login / cookie saver
│ ├── session.json # Persisted Playwright cookies (gitignored)
│ ├── .env # Secrets (gitignored)
│ └── meetings/ # Per-meeting output (audio, transcript, summary)
└── frontend/
└── src/
├── pages/
│ ├── Landing.jsx # Marketing hero page
│ ├── Dashboard.jsx # Dispatch bot + live status
│ ├── Meetings.jsx # Browse summaries and transcripts
│ └── Settings.jsx # Bot name, Whisper model, notifications
└── components/
├── AppLayout.jsx
└── Sidebar.jsx
| Layer | Technology |
|---|---|
| Bot automation | Playwright (Chromium) |
| Audio capture | FFmpeg + BlackHole 2ch |
| Transcription | OpenAI Whisper (local) |
| Summarization | Azure OpenAI GPT |
| Backend | Node.js, Express 5 |
| Frontend | React 19, Vite, Tailwind CSS |
| Real-time updates | Server-Sent Events (SSE) |