FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Higangssh/ghostmeet: ๐Ÿ‘ป Your invisible AI meeting assistant โ€” self-hosted meeting transcription and summaries, like Otter.ai but open source. ยท GitHub

Repository files navigation

ghostmeet

Your invisible AI meeting assistant โ€” Live captions and smart summaries, right in your browser.

Quick Start โ€ข How It Works โ€ข Features โ€ข API


What is ghostmeet?

ghostmeet silently captures audio from any browser tab โ€” Google Meet, Zoom, Teams, or anything with sound โ€” and transcribes it in real-time using Whisper. When the meeting ends, click Summarize and AI extracts key decisions, action items, and next steps.

It runs as a Chrome Extension side panel. Other participants can't see it. Like a ghost in your meeting. ๐Ÿ‘ป

  • 100% local โ€” audio never leaves your machine
  • No accounts โ€” no sign-up, no cloud, no subscriptions
  • Works everywhere โ€” any tab that plays audio

Features

  • ๐ŸŽ™๏ธ Real-time transcription โ€” Whisper STT, updates every 10 seconds
  • โฑ๏ธ Built for long meetings โ€” cost per pass stays flat, so a 4-hour session behaves like a 4-minute one
  • ๐Ÿ“‹ AI-powered summaries โ€” Key decisions, action items, next steps
  • ๐Ÿ’พ Nothing is lost โ€” transcripts are written to SQLite as they happen and survive a restart
  • ๐ŸŒ Per-meeting language โ€” pick the language in the side panel, or let Whisper detect it
  • ๐Ÿ”’ Self-hosted โ€” your audio stays on your machine, and the server listens on loopback only
  • ๐Ÿณ One-command setup โ€” docker compose up and you're ready
  • ๐Ÿ‘ป Invisible โ€” side panel UI, no one in the meeting knows

How It Works

Browser Tab (Zoom / Meet / Teams)
    โ”‚ audio
    โ–ผ
Chrome Extension
    โ”œโ”€โ”€ service worker  โ€” asks Chrome for a tab stream id
    โ””โ”€โ”€ offscreen page  โ€” records it, and plays it back so you still hear the meeting
    โ”‚
    โ–ผ  WebSocket (webm/opus, 1s chunks)
Local Backend (FastAPI)
    โ”œโ”€โ”€ one demuxer per session  โ”€โ”€โ†’ PCM appended to disk
    โ”œโ”€โ”€ Whisper reads only the newest window, never the whole recording
    โ”œโ”€โ”€ segments โ”€โ”€โ†’ SQLite  +  live captions in the side panel
    โ””โ”€โ”€ Claude API (on demand) โ”€โ”€โ†’ Meeting Summary

Everything runs on your machine. The only external call is to Claude API when you click Summarize (optional โ€” transcription works without it).

Audio is decoded once as it arrives and kept on disk, and each transcription pass reads only a bounded window of it. That is what keeps a long meeting from getting slower and slower, and keeps memory flat no matter how long you record.

Quick Start

Prerequisites

  • Docker (recommended) or Python 3.10+
  • Chrome browser

1) Start the backend

git clone https://github.com/Higangssh/ghostmeet.git
cd ghostmeet

# Copy and edit config (add your Anthropic API key for summaries)
cp .env.example .env

# Start with Docker
docker compose up -d

Backend is ready when you see http://0.0.0.0:8877 in the logs.

Manual install (without Docker)
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m backend

Note: First run downloads the Whisper model (~150MB for base).

2) Install Chrome Extension

  1. Open chrome://extensions in Chrome
  2. Enable Developer mode (toggle in top-right)
  3. Click Load unpacked
  4. Select the extension/ folder from this repo
  5. Pin the ๐Ÿ‘ป icon in your toolbar

3) Use it

  1. Join a meeting โ€” Open Google Meet, Zoom, Teams (or any tab with audio)
  2. Click ๐Ÿ‘ป โ€” Side panel opens on the right
  3. Pick a language (optional) โ€” or leave it on Auto-detect
  4. Click โ–ถ Start โ€” Live captions appear as people speak. The tab stays audible.
  5. Click โ–  Stop โ€” The panel says "Transcription complete" once the last pass finishes
  6. Click ๐Ÿ“‹ Summarize โ€” AI generates a structured summary

Reopening the side panel mid-meeting brings the transcript so far back with it.

That's it. No sign-up, no config, no cloud.

Configuration

Set these in .env or docker-compose.yml:

Variable Default Description
GHOSTMEET_MODEL base Whisper model size (tiny / base / small / medium / large)
GHOSTMEET_DEVICE auto Compute device (auto / cpu / cuda)
GHOSTMEET_COMPUTE_TYPE float32 Precision (int8 is much faster on CPU)
GHOSTMEET_LANGUAGE auto-detect Default language (en / ko / ja / etc.) โ€” the side panel can override it per meeting
GHOSTMEET_CHUNK_INTERVAL 10 Seconds between transcription updates
GHOSTMEET_ANTHROPIC_KEY โ€” Required for AI summaries
GHOSTMEET_HOST 127.0.0.1 Server bind address (loopback โ€” the API has no auth)
GHOSTMEET_PORT 8877 Server port

Model size guide:

  • tiny โ€” fastest, least accurate (~75MB)
  • base โ€” good balance (recommended, ~150MB)
  • small โ€” better accuracy, slower (~500MB)
  • medium / large โ€” best accuracy, needs GPU

API

Endpoint Method Description
/api/health GET Health check + model info
/api/sessions GET List all sessions
/api/sessions/{id} GET Session details
/api/sessions/{id}/transcript GET Full transcript
/api/sessions/{id}/summarize POST Generate AI summary
/api/sessions/{id}/summary GET Get generated summary
/ws/audio WS Audio ingest (binary chunks; send stop as text to finish)
/ws/transcript/{id} WS Live transcript stream

Sessions, transcripts and summaries are stored in recordings/ghostmeet.db, so every endpoint above keeps working after the backend restarts.

Development

python -m venv .venv
./.venv/Scripts/python.exe -m pip install -r requirements-dev.txt

./.venv/Scripts/python.exe -m pytest tests/ -q       # backend suite
node --test tests/extension/shared.test.mjs          # extension helpers

The suite needs no Whisper model and no network โ€” real opus audio goes through the real decoder, and only inference is stubbed.

There is one thing tests cannot reach: chrome.tabCapture.getMediaStreamId() needs the activeTab grant that only a real toolbar click produces. Everything after that point is covered by node tests/extension/verify-capture.mjs, which drives the extension in a real browser against a running backend (needs npm install playwright && npx playwright install chromium). To check the last step by hand: start a capture on a tab with audio and confirm audio_bytes climbs in /api/sessions โ€” and that you can still hear the tab.

Project Structure

ghostmeet/
โ”œโ”€โ”€ extension/              # Chrome MV3 Extension
โ”‚   โ”œโ”€โ”€ manifest.json       # permissions + side panel config
โ”‚   โ”œโ”€โ”€ background.js       # service worker: gets a tab stream id, drives capture
โ”‚   โ”œโ”€โ”€ offscreen.html/js   # hidden page that actually records โ†’ WebSocket
โ”‚   โ”œโ”€โ”€ sidepanel.html/js   # live captions, language picker, summaries
โ”‚   โ”œโ”€โ”€ popup.html/js       # start/stop controls
โ”‚   โ”œโ”€โ”€ shared.js           # pure helpers shared by the above
โ”‚   โ””โ”€โ”€ icons/
โ”œโ”€โ”€ backend/                # Python backend (FastAPI)
โ”‚   โ”œโ”€โ”€ app.py              # HTTP + WebSocket server
โ”‚   โ”œโ”€โ”€ decoder.py          # streaming webm/opus โ†’ PCM (one demuxer per session)
โ”‚   โ”œโ”€โ”€ pcm_store.py        # append-only audio on disk, windowed reads
โ”‚   โ”œโ”€โ”€ incremental.py      # bounded-window transcription, absolute timestamps
โ”‚   โ”œโ”€โ”€ pipeline.py         # receive / decode / transcribe, decoupled
โ”‚   โ”œโ”€โ”€ transcriber.py      # shared Whisper model + per-session language
โ”‚   โ”œโ”€โ”€ store.py            # SQLite: sessions, segments, summaries
โ”‚   โ”œโ”€โ”€ summarizer.py       # Claude API integration
โ”‚   โ””โ”€โ”€ models.py           # session model
โ”œโ”€โ”€ tests/                  # pytest suite + extension tests
โ”œโ”€โ”€ assets/                 # logo, demo GIF
โ”œโ”€โ”€ docker-compose.yml      # one-command deployment
โ”œโ”€โ”€ Dockerfile              # backend container
โ””โ”€โ”€ requirements.txt        # Python dependencies

OpenClaw Integration

ghostmeet works as an OpenClaw skill. Control your meetings from chat.

# Install the skill
clawhub install ghostmeet

Then just ask your AI assistant:

  • "Summarize my last meeting" โ†’ generates AI summary from latest session
  • "How many meetings did I have today?" โ†’ lists all sessions
  • "What was discussed?" โ†’ fetches full transcript
  • "Extract action items" โ†’ pulls tasks from the summary

The skill handles session listing, transcript retrieval, and summary generation via the ghostmeet API. Recording start/stop is done through the Chrome Extension.

Roadmap

  • Real-time transcription (Whisper)
  • Chrome Extension side panel UI
  • AI meeting summaries (Claude)
  • Long meetings โ€” flat cost per pass, tested to 4h+ of audio
  • Transcripts survive a restart (SQLite)
  • Per-session language selection
  • Meeting context input + file attach
  • Speaker diarization (who said what)
  • In-person meetings (microphone capture)
  • Export to Markdown / PDF
  • Agent Mode โ€” AI speaks in the meeting for you

License

MIT

About

๐Ÿ‘ป Your invisible AI meeting assistant โ€” self-hosted meeting transcription and summaries, like Otter.ai but open source.

Resources

Stars

83 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages


Back | FazBrowse Home | New Git URL