| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
Your invisible AI meeting assistant โ Live captions and smart summaries, right in your browser.
Quick Start โข How It Works โข Features โข API
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. ๐ป
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.
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 -dBackend 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 backendNote: First run downloads the Whisper model (~150MB for base).
Reopening the side panel mid-meeting brings the transcript so far back with it.
That's it. No sign-up, no config, no cloud.
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:
| 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.
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 helpersThe 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.
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
ghostmeet works as an OpenClaw skill. Control your meetings from chat.
# Install the skill
clawhub install ghostmeetThen just ask your AI assistant:
The skill handles session listing, transcript retrieval, and summary generation via the ghostmeet API. Recording start/stop is done through the Chrome Extension.
| Back | FazBrowse Home | New Git URL |