Skip to content

MeetingOS is an agentic system that turns meetings into actions by transcribing conversations, reasoning on decisions, and autonomously executing follow-ups using connected tools.

License

Notifications You must be signed in to change notification settings

glorynino/SmartMeetOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

56 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

SmartMeetOS

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.


Table of Contents


Features

✨ 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

Requirements

  • Python 3.10+ (3.11+ recommended)
  • Google Calendar OAuth credentials (JSON file)
  • Nylas API account (API key + Grant ID)
  • SQLite or PostgreSQL database

Installation

  1. Clone the repository:
git clone https://github.com/glorynino/SmartMeetOS.git
cd SmartMeetOS
  1. Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
  1. Install dependencies:
pip install -r requirements.txt

Configuration

Create a .env file at the project root.

Required Variables

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_secret

Optional Variables

NYLAS_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.db

Runtime state (tokens, logs, transcripts) is written to .secrets/ (ignored by git).


Project Structure

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)

Usage

Calendar Watcher (Main Process)

python check_calendar.py \
  --nylas-notetaker \
  --nylas-grant-id <GRANT_ID> \
  --calendar primary \
  --window-minutes 120 \
  --poll-seconds 15

Options

  • --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

Interface

Minimalist interface

Navigation

Before Login

  • Recaply Logo
  • Log In
  • Sign In

After login

  • Recaply Logo
  • Meetings
  • Chat
  • Settings
  • Profile

Available Pages

/login -Login

  • Email / password form
  • Link to sign up

/signup β€” Sign Up

  • Name
  • Email
  • 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 messages
  • GET /api/meetings β€” fetch meetings
  • GET /api/bot/status β€” bot status
  • POST /api/bot/startβ€” start bot
  • POST /api/bot/stop β€” stop bot

Technical

  • Next.js 14 (App Router)
  • Tailwind CSS
  • Reusable components

Architecture

Architecture Diagram

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

Loading

Architecture Diagram β€” Explanation

This architecture is designed as a multi-stage, event-driven pipeline that transforms raw meeting data into structured knowledge and automated actions.


1. Input & Storage

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 meetings table stores transcripts along with metadata (meeting ID, participants, timestamps).

This separation ensures raw data is always preserved and can be reprocessed if needed.


2. Processing β€” Chunking & Parallel Fact Extraction

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_facts with group_label = NULL.

This design enables parallelism, scalability, and fault tolerance.


3. Semantic Grouping & Conflict Resolution

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.


4. Action Orchestration

This layer decides what to do with the resolved meeting context.

  • The Supervisor / Router analyzes meeting_inputs and 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_outputs
  • tasks
  • calendar_events

5. Delivery β€” User-Facing Outputs

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.


Operational Notes & Key Files

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

About

MeetingOS is an agentic system that turns meetings into actions by transcribing conversations, reasoning on decisions, and autonomously executing follow-ups using connected tools.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5