SmartMeetOS watches Google Calendar for Google Meet events and automatically triggers a Nylas Notetaker workflow to join meetings, record transcripts, extract insights, and deliver actionable outputs.
It transforms meetings into structured knowledge: documentation, tasks, follow-ups, and calendar actions β delivered via Notion, Discord, SMS, or email.
β¨ Core Capabilities
- ποΈ Calendar Monitoring β Real-time polling of Google Calendar for Meet events
- π Automatic Transcription β Nylas Notetaker joins meetings and records transcripts
- π§ AI-Powered Processing β LLM extraction of facts, decisions, and action items
- π Semantic Grouping β Intelligent clustering and conflict resolution
- π Auto Documentation β Generate structured meeting notes in Notion
- β‘ Task Management β Automatic follow-ups and task creation
- π¬ Multi-Channel Delivery β Discord, SMS, email, or Notion
- π Webhook Integration β Real-time transcript ingestion via Nylas webhooks
- ποΈ Meeting History β SQLAlchemy-backed persistent storage
- Python 3.10+ (3.11+ recommended)
- Google Calendar OAuth credentials (JSON file)
- Nylas API account (API key + Grant ID)
- SQLite or PostgreSQL database
- Clone the repository:
git clone https://github.com/glorynino/SmartMeetOS.git
cd SmartMeetOS- Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txtCreate a .env file at the project root.
NYLAS_API_KEY=your_nylas_api_key
NYLAS_GRANT_ID=your_grant_id
GOOGLE_CLIENT_SECRET_FILE=secrets/google_credentials.json
NYLAS_WEBHOOK_SECRET=your_webhook_secretNYLAS_API_BASE=https://api.us.nylas.com
DISCORD_TOKEN=your_discord_bot_token
SMS_TO_API_KEY=your_sms_api_key
MISTRAL_API_KEY=your_mistral_api_key
DATABASE_URL=sqlite:///smartmeetos.dbRuntime state (tokens, logs, transcripts) is written to
.secrets/(ignored by git).
SmartMeetOS/
βββ check_calendar.py # Main calendar watcher entrypoint
βββ requirements.txt
βββ agents/ # Multi-agent orchestration
β βββ orchestrator.py
β βββ event_detection_agent.py
β βββ actions.py
β βββ documentation.py
β βββ scheduling.py
βββ smartmeetos/ # Core application logic
β βββ calendar/
β βββ notetaker/
β β βββ nylas_notetaker.py
β β βββ supervisor.py
β β βββ failure_codes.py
β βββ webapp/
βββ services/ # External API clients
β βββ calendar_client.py
β βββ discord_client.py
β βββ notion_client.py
β βββ nylas_client.py
βββ processing/
β βββ chunker.py
βββ database/
β βββ models.py
β βββ connection.py
β βββ init_db.py
βββ docs/
β βββ google_calendar_setup.md
β βββ nylas_notetaker_setup.md
β βββ nylas_webhooks.md
βββ .secrets/ # Runtime state (ignored by git)
python check_calendar.py \
--nylas-notetaker \
--nylas-grant-id <GRANT_ID> \
--calendar primary \
--window-minutes 120 \
--poll-seconds 15Options
--nylas-notetakerβ Enable Notetaker--nylas-grant-idβ Grant ID (or env var)--calendarβ Calendar ID (default: primary)--window-minutesβ Look-ahead window--poll-secondsβ Polling interval--dry-runβ No side effects
Minimalist interface
Before Login
- Recaply Logo
- Log In
- Sign In
After login
- Recaply Logo
- Meetings
- Chat
- Settings
- Profile
/login -Login
- Email / password form
- Link to sign up
/signup β Sign Up
- Name
- Password
- Link to login
/chat Main Interface
- Conversational interface
- Input field at the bottom with placeholder
- API connection indicator
meetings meetings list
- Data fetched via GET /api/meetings
- Mock data when API is unavailable
- Meeting cards including:
- Title
- Date
- Status
- Source (Zoom, Google Meetβ¦)
- View Details button
- Refresh button
- API connection indicator
/settings Settings
- Start / stop bot
- Real-time bot status
- API key field (simulated)
- Dark mode
- Danger Zone:
- Clear conversations
API Integration
- Used Endpoints
POST /api/users/{id}/promptβ save chat messagesGET /api/meetingsβ fetch meetingsGET /api/bot/statusβ bot statusPOST /api/bot/startβ start botPOST /api/bot/stopβ stop bot
Technical
- Next.js 14 (App Router)
- Tailwind CSS
- Reusable components
graph TB
%% =====================
%% Input & Storage
%% =====================
subgraph Input["Input & Storage"]
A[Nylas Webhook]
B[Raw Transcript]
C[(meetings table)]
A --> B --> C
end
%% =====================
%% Chunking & Parallel Fact Extraction
%% =====================
subgraph Processing["Chunking & Parallel Fact Extraction"]
D{Processing Pipeline}
E[Smart Chunker Node]
F[Chunk 1]
G[Chunk 2]
H[...]
I[Chunk Extractor LLM Node]
J[Chunk Extractor LLM Node]
K[...]
L[(extracted_facts<br/>group_label: NULL)]
C --> D --> E
E -->|Splits into| F
E -->|Splits into| G
E -->|Splits into| H
F --> I -->|Creates| L
G --> J -->|Creates| L
H --> K -->|Creates| L
end
%% =====================
%% Semantic Grouping & Conflict Resolution
%% =====================
subgraph Semantic["Semantic Grouping & Conflict Resolution"]
M{Aggregator Router}
N[Grouping Node]
O[Aggregator LLM Node<br/>for Group A]
P[Aggregator LLM Node<br/>for Group B]
Q[...]
R[(meeting_inputs table)]
L --> M
L -->|Labels facts with group_label| N
N -->|Queries ungrouped facts<br/>Clusters by context| N
M -->|Routes each group| O
M -->|Routes each group| P
M -->|Routes each group| Q
O -->|Writes final, resolved context| R
P -->|Writes final, resolved context| R
Q -->|Writes final, resolved context| R
end
%% =====================
%% Action Orchestration
%% =====================
subgraph Action["Action Orchestration"]
S[Supervisor / Router Node]
T[Documentation Agent]
U[Action Agent]
V[Scheduling Agent]
W[Notion API]
X[Discord / Twilio API]
Y[Google Calendar API]
Z[(document_outputs)]
AA[(tasks)]
AB[(calendar_events)]
R --> S
S -->|Routes by intent| T
S -->|Routes by intent| U
S -->|Routes by intent| V
T --> W --> Z
U --> X --> AA
V --> Y --> AB
end
%% =====================
%% User Delivery
%% =====================
subgraph Delivery["User Delivery"]
AC[User]
Z --> AC
AA --> AC
AB --> AC
end
This architecture is designed as a multi-stage, event-driven pipeline that transforms raw meeting data into structured knowledge and automated actions.
This layer is responsible for ingesting and persisting raw data.
- Nylas Webhook notifies the system when a meeting transcript is available.
- Raw Transcript represents the unprocessed meeting conversation.
- The
meetingstable stores transcripts along with metadata (meeting ID, participants, timestamps).
This separation ensures raw data is always preserved and can be reprocessed if needed.
Meeting transcripts can be long and exceed LLM context limits.
-
The Smart Chunker Node splits transcripts into smaller, context-aware chunks.
-
Each chunk is processed independently by Extractor LLM Nodes.
-
These nodes extract atomic elements such as:
- facts
- decisions
- action items
-
All extracted elements are stored in
extracted_factswithgroup_label = NULL.
This design enables parallelism, scalability, and fault tolerance.
Raw extracted facts are often fragmented or redundant.
-
The Grouping Node analyzes ungrouped facts and assigns semantic labels based on topic, intent, or participants.
-
The Aggregator Router routes each labeled group to a dedicated Aggregator LLM Node.
-
Each aggregator:
- merges related facts
- resolves contradictions
- produces a coherent representation
-
Final, resolved context is stored in
meeting_inputs.
This layer converts fragmented information into consistent, high-level understanding.
This layer decides what to do with the resolved meeting context.
-
The Supervisor / Router analyzes
meeting_inputsand infers user intent. -
Based on intent, it dispatches data to specialized agents:
- Documentation Agent β creates structured documents in Notion
- Action Agent β sends notifications or creates tasks (Discord, SMS)
- Scheduling Agent β schedules or updates events in Google Calendar
Outputs are persisted in:
document_outputstaskscalendar_events
The final layer delivers value to the user.
- Documents, tasks, and calendar events are delivered through configured channels.
- All outputs remain stored for auditing, history, and reuse.
This separation allows SmartMeetOS to scale delivery mechanisms without changing core logic.
- Google OAuth:
GOOGLE_CLIENT_SECRET_FILE - Webhook verification:
NYLAS_WEBHOOK_SECRET - Failure handling:
smartmeetos/notetaker/failure_codes.py - Runtime state:
.secrets/
SmartMeetOS β From meetings to decisions, automatically.