Important
Repository Scope: This repo is dedicated exclusively to the Late Meet Chrome Extension. The website linked in project metadata is not part of this repository — please do not open issues about website UI/UX or bugs here.
Joining a Google Meet late — or losing focus for just a moment — leaves you scrambling for context. Traditional AI note-takers make it worse:
| Traditional AI Bots | Late Meet | |
|---|---|---|
| 🤖 Participant Visibility | ❌ "A Bot has joined" alert | ✅ Completely invisible |
| ☁️ Data Privacy | ❌ Transcripts on remote servers | ✅ Local-only, zero upload |
| 💸 Cost Model | ❌ Monthly subscription | ✅ BYOK — free to run |
| 📜 Output Quality | ❌ Unreadable text walls | ✅ Structured, punchy insights |
| 🔓 Open Source | ❌ Closed, audited by no one | ✅ MIT, fully auditable |
Late Meet is a privacy-first, open-source Chrome Extension that lives entirely inside your browser. No bots. No external servers. No subscriptions.
Join late ──▶ Instant AI briefing ──▶ Never miss context again
It uses Chrome's native tabCapture API to intercept audio without adding participants, feeds it through ElevenLabs Scribe v2 for state-of-the-art transcription, and uses OpenAI GPT to generate structured, actionable intelligence — stored locally in chrome.storage.local.
| Feature | What it does | |
|---|---|---|
| 🤫 | Invisible Audio Capture | Chrome's tabCapture + Offscreen Document APIs — no bot joins, no alert shown |
| 🔤 | ElevenLabs Scribe STT | Industry-leading multilingual transcription with OpenAI Whisper fallback |
| ⚡ | Late-Joiner Briefings | Join 10 min late → hit "Catch Me Up" → get a private AI summary of what you missed |
| 🧠 | Proactive Intelligence | Auto-detects Meet sessions, 1+N participant tracking, action-item extraction |
| 🔑 | BYOK Model | Your ElevenLabs + OpenAI keys — zero vendor lock-in, zero subscriptions |
| 💎 | Premium Glass UI | Deep-monochrome dashboard, glassmorphism, smooth animations |
| 🏠 | Local-First Storage | chrome.storage.local only — Save or Discard after each session, your choice |
| 🌍 | Multilingual | ElevenLabs Scribe handles multiple languages out of the box |
🎬 Workflow Demo — End-to-End Walkthrough
📊 Dashboard — Real-time Side Panel
⚡ Late-Joiner Briefing — Catch up Overlay
Floating meeting copilot injected cleanly onto Google Meet. Join late -> catch up instantly without adding noisy bots.
🔌 Extension Loaded in Chrome — Developer Mode Setup
⚙️ Options Page — BYOK Key Configuration
🔌 Extension Popup — Quick Action Control
💡 Want to add screenshots or GIFs? It's the single most impactful contribution you can make. Check out Issue #102 — beginner-friendly and fully guided.
graph TB
subgraph Browser["🌐 Google Chrome"]
subgraph Meet["📹 Google Meet Tab"]
Audio["🔊 Tab Audio Stream"]
end
subgraph Extension["🧩 Late Meet Extension"]
BG["🎼 background.ts\nThe Conductor\n─────────────────\nCentral state manager\nMeeting detection\nMessage routing"]
OFF["🎵 offscreen.ts\nAudio Engine\n─────────────────\nMediaRecorder API\nAudio chunk capture\nStream processing"]
CONTENT["🖥️ content.ts\nUI Injector\n─────────────────\nFloating buttons\nLate-joiner overlays\nChat automation"]
DASH["📊 dashboard.ts\nSide Panel\n─────────────────\nLive summary\nTopics & sentiment\nAction items & timeline"]
end
subgraph Storage["💾 chrome.storage.local"]
S1["📝 Transcripts"]
S2["📋 Summaries"]
S3["✅ Action Items"]
S4["🔑 API Keys"]
end
end
subgraph AI["🤖 AI Layer"]
EL["🎤 ElevenLabs\nScribe v2"]
OAI["🧠 OpenAI\nGPT-4o-mini"]
W["🔄 Whisper\nFallback"]
end
Audio -->|tabCapture| OFF
OFF -->|audio blobs| BG
CONTENT -->|UI events| BG
BG -->|chunks| EL
BG -.->|fallback| W
EL -->|transcript| BG
W -.->|transcript| BG
BG -->|text context| OAI
OAI -->|insights| BG
BG <-->|read/write| Storage
Storage -->|session data| DASH
BG -->|briefing| CONTENT
style Browser fill:#0d0d1e,stroke:#6C63FF,color:#c0c0f0
style Extension fill:#16213e,stroke:#6C63FF,color:#c0c0f0
style AI fill:#1a0d2e,stroke:#9B35FF,color:#c0c0f0
style Storage fill:#0d1a2e,stroke:#00C9A7,color:#c0c0f0
style BG fill:#6C63FF,color:#fff,stroke:#fff
style OFF fill:#4a43cc,color:#fff,stroke:#fff
style EL fill:#00897B,color:#fff,stroke:#fff
style OAI fill:#412991,color:#fff,stroke:#fff
sequenceDiagram
participant U as 👤 User
participant CS as 🖥️ Content Script
participant BG as 🎼 Background Worker
participant OD as 🎵 Offscreen Doc
participant EL as 🎤 ElevenLabs Scribe
participant GPT as 🧠 OpenAI GPT
participant DB as 📊 Dashboard
U->>CS: Clicks "Start Copilot"
CS->>BG: startCapture message
BG->>OD: Initialize audio engine
loop Every 30s
OD->>BG: Audio chunk (blob)
BG->>EL: POST /speech-to-text
EL-->>BG: Transcript segment
BG->>GPT: Summarize + extract insights
GPT-->>BG: JSON — topics, actions, sentiment
BG->>DB: Push live update
DB-->>U: Real-time dashboard refresh
end
Note over U,DB: User joins late
U->>CS: Requests "Catch Me Up"
CS->>BG: briefingRequest
BG->>GPT: Generate late-joiner summary
GPT-->>BG: Targeted briefing
BG->>CS: Inject overlay
CS-->>U: 📋 Private catch-up overlay
📖 Full technical deep-dive:
docs/ARCHITECTURE.md
Late-Meet/
├── .github/ ← 🤖 CI/CD & Issue templates
│ ├── ISSUE_TEMPLATE/
│ └── workflows/ ← Lint · format · stale management
│
├── docs/ ← 📚 Technical documentation
│ └── ARCHITECTURE.md
│
├── src/ ← 🧠 Extension source (TypeScript)
│ ├── icons/ ← Branding assets
│ ├── utils/
│ │ ├── api.ts ← ElevenLabs & OpenAI client wrappers
│ │ └── prompts.ts ← GPT prompt templates
│ ├── background.ts ← 🎼 The Conductor (service worker)
│ ├── content.ts ← 🖥️ UI injector (content script)
│ ├── dashboard.ts ← 📊 Real-time side panel
│ ├── offscreen.ts ← 🎵 Audio engine (offscreen doc)
│ ├── options.ts ← ⚙️ BYOK key configuration
│ ├── popup.ts ← Quick-action popover
│ └── types.ts ← Shared TypeScript interfaces
│
├── package.json
├── tsconfig.json
├── vite.config.ts
├── CHANGELOG.md
├── CONTRIBUTING.md
├── ROADMAP.md
└── SECURITY.md
No coding or terminal required! Get the extension running in under a minute.
- Go to the Releases page and download the latest
Late-Meet.zip(ordist.zip) file. - Extract/Unzip the downloaded file on your computer.
- Open Chrome and navigate to
chrome://extensions/. - Toggle Developer mode ON (top right corner).
- Click Load unpacked and select the unzipped folder.
- That's it! Proceed to the API Key Setup below.
Want to build from source or contribute to the codebase?
Prerequisites:
- Chrome 116+ (Native Side Panel API required)
- Node.js v18+ (LTS recommended)
- npm v9+
① Clone the repository
git clone https://github.com/shouri123/Late-Meet.git
cd Late-Meet
② Install & Build
npm install
npm run build
# Compiles TypeScript → bundles into dist/
③ Load into Chrome
chrome://extensions → Developer Mode ✓ → Load Unpacked → select dist/
⚠️ Always load thedist/folder — neversrc/or the project root.
Dev Scripts
npm run build # Production build → dist/
npm run dev # Watch mode (dev build)
npm run lint # ESLint checks
npm run format # Prettier auto-format
npm run type-check # TypeScript validation
💡 For a detailed developer setup guide with screenshots, check out the
docs/GETTING_STARTED.mdguide.
Late Meet uses a Bring Your Own Key (BYOK) model. You connect your own accounts — we never see your keys.
🔑 For provider checklists, troubleshooting, and detailed setup tips, read the full
docs/API_KEYS.mdintegration guide.
Step 1 — Get your ElevenLabs API Key (Speech-to-Text)
ElevenLabs powers high-accuracy multilingual transcription via Scribe v2.
1. Go to → elevenlabs.io → Sign up free
2. Click your avatar → Profile + API Key
3. Click "Generate API Key" → name it "late-meet" → copy it
💡 The free tier includes generous monthly transcription minutes. Most users never exceed it for regular meeting usage.
Step 2 — Get your OpenAI API Key (Summaries & Intelligence)
OpenAI powers meeting summaries, action item extraction, sentiment analysis, and late-joiner briefings.
1. Go to → platform.openai.com → Sign in
2. Left sidebar → API Keys → "+ Create new secret key"
3. Name it "late-meet" → copy the key immediately
💰 Cost estimate: Late Meet uses
gpt-4o-mini. A typical 1-hour meeting costs ~$0.01–$0.05 total.
Step 3 — Enter keys into the extension
1. Click the Late Meet icon in your Chrome toolbar
2. Click "Options" (or right-click icon → Options)
3. Paste your ElevenLabs API Key
4. Paste your OpenAI API Key
5. Click Save ✓
🔒 Keys are stored in
chrome.storage.localon your machine only. They are only ever sent to your own ElevenLabs / OpenAI endpoints — never to us.
%%{init: {'theme': 'dark', 'themeVariables': {'primaryColor': '#6C63FF', 'edgeLabelBackground': '#1a1a3e'}}}%%
gantt
title Late Meet — Project Roadmap
dateFormat YYYY-MM
axisFormat %b %Y
section ✅ Phase 1 · Core
Native Meet Integration :done, p1a, 2024-01, 2024-03
tabCapture Audio Engine :done, p1b, 2024-02, 2024-04
BYOK Key System :done, p1c, 2024-03, 2024-05
Premium Glass UI :done, p1d, 2024-04, 2024-06
section ✅ Phase 2 · Privacy
Strip Supabase Backend :done, p2a, 2024-06, 2024-08
ElevenLabs Scribe Integration :done, p2b, 2024-07, 2024-09
Local-First Storage :done, p2c, 2024-08, 2024-10
Rolling LLM Context :done, p2d, 2024-09, 2025-01
section 🔄 Phase 3 · Intelligence
Speaker Diarization :active, p3a, 2025-06, 2025-09
Offline Whisper via WebGPU :p3b, 2025-07, 2025-11
Meeting History Viewer :p3c, 2025-08, 2025-10
Real-Time Transcript Search :p3d, 2025-09, 2025-11
section 🔮 Phase 4 · Multi-Platform
Zoom Support :p4a, 2025-11, 2026-03
Microsoft Teams Support :p4b, 2026-01, 2026-05
On-the-fly Translation :p4c, 2026-02, 2026-06
Firefox Extension Port :p4d, 2026-04, 2026-08
✅ Phase 1 — Core Foundation (Complete)
- Native Google Meet integration — zero bot participants
- Real-time audio capture via Chrome Offscreen + tabCapture APIs
- Premium monochrome glassmorphism UI with side panel
- BYOK integration for ElevenLabs + OpenAI
- Late-joiner briefing overlays
✅ Phase 2 — Privacy Overhaul (Complete)
- Full removal of Supabase and all BaaS dependencies
- Local-first session management with
chrome.storage.local - ElevenLabs Scribe v2 STT integration
- Intelligent rolling LLM context prompting
- GSSoC 2026 contributor infrastructure
🔄 Phase 3 — Intelligence Expansion (In Progress)
- Speaker diarization — who said what, tracked precisely
- Offline transcription via local Whisper / WebGPU
- Meeting history viewer with export
- Real-time keyword search and highlighting
- API cost & token usage tracker (local-first)
- Action item assignee auto-routing
🔮 Phase 4 — Multi-Platform (Planned)
- Zoom support — full feature parity
- Microsoft Teams support — enterprise ready
- On-the-fly translation during calls
- Firefox extension port
Late Meet is proudly part of GirlScript Summer of Code 2026!
🟢 New to the project? Read the full
docs/CONTRIBUTOR_GUIDE.mdto understand onboarding, branch conventions, PR templates, and workflow diagrams.
⭐ Star this repo before contributing — it helps us grow!
# 1. Fork & clone your fork
git clone https://github.com/YOUR_USERNAME/Late-Meet.git && cd Late-Meet
# 2. Create a feature branch
git checkout -b feature/your-feature-name
# 3. Make your changes, then run all checks:
npm run format # auto-fix formatting
npm run lint # must return zero errors
npm run type-check # must compile cleanly
# 4. Commit with a descriptive message
git commit -m "feat: add real-time transcript search (#107)"
# 5. Push and open a PR on GitHub
git push origin feature/your-feature-name| # | Title | Skills |
|---|---|---|
| #402 | [FEATURE] Handle IndexedDB Connection Cleanup During Database Upgrades | General |
| #378 | [FEATURE] Add storage usage insights and session cleanup tools | General |
| #104 | [FEAT]: Show live recording duration timer in the popup UI | General |
| # | Title | Skills |
|---|---|---|
| #418 | [UI] Improve Responsiveness of Extension Popup Across Different Screen Sizes | General |
| #412 | [Enhancement] Add support for Google Meet breakout room transcription | General |
| #410 | [Bug] `background.ts` service worker fails to restart after Chrome updates extension | General |
| #409 | [Enhancement] Add meeting duration tracking to the summary view | General |
| #407 | [Bug] `popup.ts` throws uncaught error when opened outside a Google Meet tab | General |
| #406 | [Enhancement] Add export to Markdown format for meeting transcripts | General |
| #404 | [Bug] Meeting transcript continues recording after tab is navigated away from Google Meet | General |
| #401 | [FEATURE] Strengthen `asStoredSession()` Runtime Validation | General |
| #395 | [Bug] Speaker attribution breaks when participant names contain non-ASCII characters | General |
| #394 | [Enhancement] Add meeting summary export to PDF format | General |
| #391 | [Bug] Extension popup closes unexpectedly when switching between Google Meet tabs | General |
| #380 | [FEATURE] Add first-time onboarding and setup wizard | General |
| #374 | [FEATURE] feat: add timestamp-linked transcript references for summaries and action items | General |
| #363 | [BUG] Options page passphrase visibility toggle button missing `aria-label` — inconsistent with other toggle buttons | General |
| #362 | [BUG] Dashboard transcript re-renders entire list on every state update — destroys search highlights and scroll position | General |
| #361 | [A11Y] Accent color picker buttons never update `aria-pressed` — screen readers cannot identify the selected color | General |
| #359 | [BUG] TXT export uses `generateMarkdown()` — outputs markdown syntax instead of plain text | General |
| #354 | [PERF] `offscreen.ts` sends 20 `chrome.runtime.sendMessage` per second for waveform data — unnecessary service worker wake-ups and rejected messages | General |
| #353 | [BUG] `storageDashboard.ts` uses native `confirm()` dialog for delete — inconsistent with custom modal UX pattern | General |
| #352 | 📋 Issue 1: Individual Copy-to-Clipboard Buttons for Action Items and Decisions | General |
| #350 | [BUG] Dashboard capture ignores denied microphone permission and still requests mic in offscreen document | General |
| #289 | [BUG]persistMeetingSession silently discards transcript updates after MV3 service worker restart — duplicate ID guard causes permanent data loss | General |
| #238 | [Security] `credentials.ts` stores API keys in plaintext in chrome.storage.local | General |
| #236 | [Bug] `sessionStorage.ts` does not handle `chrome.storage` quota exceeded errors | General |
| #212 | UI/UX Feature: Implement a Professional Empty States Design System for Dashboard | General |
| #207 | Feature/UX: Add Delete Functionality and Confirmation Modal for Action Items | General |
| #200 | [FEATURE] Make dashboard insight sections collapsible | General |
| #198 | [FEAT]: Add one-click copy summary button in side panel | General |
| #138 | Feature: Implement One-Click Export to Markdown and PDF for Meeting Summaries & Transcripts | General |
| #112 | [SEC]: Implement API key rotation reminders and age tracking | General |
| # | Title | Skills |
|---|---|---|
| #411 | [Performance] `speakerAttribution.ts` allocates new arrays on every audio frame | General |
| #408 | [Security] No integrity validation on meeting data loaded from storage | General |
| #405 | [Performance] Dashboard renders all past meeting summaries at once without virtualization | General |
| #403 | [Security] Extension stores OpenAI API key in sync storage accessible across devices | General |
| #393 | [Performance] `audioChunkQueue.ts` processes audio chunks synchronously blocking the main thread | General |
| #392 | [Security] Meeting transcription data sent to external API without transport encryption validation | General |
| #356 | Graceful Error Handling and Actionable UX for Invalid/Expired API Keys | General |
| #346 | [BUG] Unscoped participant updates from background Meet tabs can leak late-joiner summaries into the wrong meeting chat | General |
| #235 | [Performance] `speakerAttribution.ts` does not debounce speaker detection, causing excessive processing | General |
| #234 | [Bug] `audioProcessing.ts` does not handle microphone permission denial gracefully | General |
Before submitting, verify all boxes:
-
npm run format— zero formatting issues -
npm run lint— zero ESLint errors -
npm run type-check— TypeScript compiles cleanly -
npm run build—dist/builds successfully - Issue number referenced in PR title (e.g.
fix: #73 validate past date inputs) - PR template filled out completely
- Screenshots/GIFs included for any UI changes
| Doc | Description |
|---|---|
README.md |
📖 Project overview & quick start (you are here) |
docs/GETTING_STARTED.md |
🚀 Getting Started & Installation Guide |
docs/API_KEYS.md |
🔑 API Keys Integration & BYOK Guide |
docs/PRIVACY.md |
🛡️ Privacy & Local-First Storage Details |
docs/TROUBLESHOOTING.md |
🔧 Troubleshooting Common Errors |
docs/WORKFLOW.md |
🎬 End-to-End Product Workflow & Journey |
docs/ARCHITECTURE.md |
🏗️ System design & technical deep-dive |
CONTRIBUTING.md |
🤝 Full contribution guidelines |
docs/CONTRIBUTOR_GUIDE.md |
🟢 GSSoC Contributor Onboarding Guide |
ROADMAP.md |
🗺️ Detailed feature roadmap |
CHANGELOG.md |
📝 Version history & release notes |
IMPROVEMENTS.md |
💡 Ideas & enhancement backlog |
SECURITY.md |
🔒 Security policy & responsible disclosure |
SUPPORT.md |
💬 How to get help |
CODE_OF_CONDUCT.md |
🌟 Community standards |
STATE.md |
📊 Extension state machine documentation |
| Status | Issue | Description |
|---|---|---|
| ✅ Resolved | #1 | Audio capture intermittent failure after migration from Whisper to ElevenLabs Scribe |
🐛 Found a new bug? Use our Bug Report template to open a structured report.
Control Late Meet without touching your mouse — perfect for accessibility and power users.
| Shortcut | Mac | Action |
|---|---|---|
Ctrl+Shift+S |
Cmd+Shift+S |
Toggle recording on/off |
Ctrl+Shift+P |
Cmd+Shift+P |
Open the side panel |
Shortcuts can be customized at
chrome://extensions/shortcuts.
╔═══════════════════════════════════════════════════════╗
║ ║
║ 🔑 BYOK — your keys, your data, your control ║
║ 💾 chrome.storage.local — zero cloud upload ║
║ 🤫 tabCapture — no bot joins the call ║
║ 🚫 No Supabase, no BaaS, no external DB ║
║ ✅ MIT licensed — fully auditable by anyone ║
║ ║
╚═══════════════════════════════════════════════════════╝
| Guarantee | How It's Enforced |
|---|---|
| 🔑 Bring Your Own Key | You supply API keys — we have no access to your credentials, ever |
| 💾 Local-only storage | All data stays in chrome.storage.local on your device — zero cloud |
| 🤫 No bots, no presence | chrome.tabCapture captures audio at browser level — other participants see nothing |
| 🚫 No telemetry | Zero analytics, zero usage reporting, zero tracking of any kind |
| 🗑️ You control deletion | Every session ends with Save or Discard — your explicit choice |
| 🌐 Minimal network | Only your own API key calls leave the browser (ElevenLabs / OpenAI) |
| 🔓 Fully auditable | MIT licensed — read every line of source code yourself |
Late Meet's Privacy-First Architecture guarantees:
🛡️ For detailed information on data flow, local encryption, and what data may leave the browser, check the
docs/PRIVACY.mddocument.
- BYOK — you supply your own API keys; they never leave your device
- Local-only storage —
chrome.storage.local, no third-party DB - Invisible capture —
tabCaptureoperates at browser level; other participants see nothing - No BaaS — Supabase removed completely in Phase 2
⚠️ Found a security vulnerability? Do not open a public issue. Email privately: chakrabortyshouri@gmail.com SeeSECURITY.mdfor our responsible disclosure policy.
Does Late Meet add a bot to my Google Meet call?
No. Late Meet uses Chrome's native tabCapture API to capture audio at the browser level. Other meeting participants will never see any bot, notification, or indication that Late Meet is active.
Where is my meeting data stored?
All meeting data — transcripts, summaries, action items — is stored exclusively in chrome.storage.local on your device. Nothing is uploaded to any server. At the end of each session, you choose to Save or Discard the data.
Do I need to pay for Late Meet?
Late Meet itself is 100% free and open-source (MIT). You only pay for your own API usage via your ElevenLabs and OpenAI accounts. ElevenLabs offers a free tier, and gpt-4o-mini is very affordable (~$0.01–$0.05 per 1-hour meeting).
Which Chrome version is required?
Chrome 116 or higher is required for the native Side Panel API. Check chrome://version/ if unsure — most users are already far beyond this version.
Does it support Zoom or Microsoft Teams?
Not yet. Late Meet currently supports Google Meet only. Zoom and Teams support are planned for Phase 4 of the roadmap. Contributions toward this are very welcome!
What languages does Late Meet transcribe?
ElevenLabs Scribe v2 handles multiple languages out of the box including English, Spanish, French, German, Hindi, Mandarin, Japanese, Portuguese, Arabic, and many more. The OpenAI Whisper fallback covers 50+ languages. See ElevenLabs documentation for the full list.
Transcription isn't starting — what should I check?
- Confirm Chrome 116+ → check at
chrome://settings/help - Verify your ElevenLabs API key is entered correctly in Options
- Make sure you clicked Start Copilot after joining the Meet — not before
- Reload the extension at
chrome://extensions/→ click the refresh icon → rejoin - Check the Issues board for known audio capture bugs
🔧 For a complete troubleshooting matrix with common setup, build, runtime, and provider issues, check out the
docs/TROUBLESHOOTING.mdguide.
How do I delete my meeting data?
After every session, Late Meet prompts Save or Discard. Choosing Discard immediately clears all transcripts and summaries from chrome.storage.local. You can also manually clear extension storage via chrome://settings/content/all → find Late Meet → Clear data.
How do I report a bug or request a feature?
Use our GitHub Issue templates:
For security issues, email privately to chakrabortyshouri@gmail.com.
I'm a GSSoC 2026 contributor — how do I start?
- ⭐ Star this repository
- Browse Issues for
gssoc-tagged issues - Comment on your chosen issue requesting assignment
- Wait for a maintainer to assign you before starting work
- Fork → Branch → Code → PR following our Contributing Guide
Distributed under the MIT License. See LICENSE for full details.
MIT License — Copyright (c) 2024 Shouri Chakraborty
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction...






