ghostmeet — the invisible AI meeting assistant

5 min read Original article ↗

sshlab — dispatch 001v0.1 · open source · MIT

The invisible
AI meeting
assistant.

Live captions and smart summaries for any meeting — captured silently from your browser tab, transcribed locally with Whisper, summarized with Claude on demand.

Your audio never leaves your machine.

§ 01a silent demo

Press play.
It works like this.

A fully scripted re-enactment of a real session. All speakers, names, and content are fictional.

meet.generic.invalid / weekly-syncrec 00:00

4 participants · audio-onlythe meeting does not know ghostmeet is here

👻 ghostmeetside panel

idle

no captions yet. press start to watch a live session unfold.

§ 02the capabilities

Six things it does,
quietly, on your laptop.

Real-time transcription

Whisper STT runs in a loop, updating captions every 10 seconds. tiny → large models, pick your size.

AI-powered summaries

Key decisions, action items, next steps. On demand — hit Summarize when the meeting ends.

Meeting context

Attach an agenda, a design doc, or a prior transcript. The summarizer actually reads them.

100% local audio

Audio is captured, streamed, and transcribed on your machine. Nothing is sent to a server you don't own.

One-command setup

docker compose up -d. Three services, one port, ready in 30 seconds once the image pulls.

Invisible to others

Runs as a Chrome side panel. No bot joins the call. No one in the meeting knows it's there.

§ 03the pipeline

From a tab playing audio,
to a structured summary,
without leaving your machine.

Browser tab

Any tab that plays audio — Meet, Zoom, Teams, a podcast, a training video.

chrome.tabCapture

Extension captures

Chrome side panel taps the tab's audio stream directly. No microphone, no screen.

manifest v3 · chrome extension

WebSocket → local

Audio frames stream to a FastAPI backend running on localhost:8877.

binary ws

Whisper transcribes

faster-whisper processes 10-second chunks. Captions appear in the side panel as they're ready.

faster-whisper · ctranslate2

Claude summarizes

When you click Summarize, the full transcript + any attached context goes to Claude. Structured output returns.

claude api · optional

the only external call

If you enable AI summaries, your transcript text (never audio) is sent to the Claude API using your own key. That is the complete list of times your data leaves your machine.

§ 04the install

Running in under
a minute.

Clone, start the backend, load the Chrome extension. That's the whole setup.

~/projects

1$ git clone https://github.com/Higangssh/ghostmeet.git

2$ cd ghostmeet

3$ cp .env.example .env # add your Anthropic key (optional)

4$ docker compose up -d

note.

First run downloads the Whisper model (~150MB for

base). Subsequent starts are instant.

01

Start the backend

docker compose up -d. Backend binds to localhost:8877. Health check returns model info.

02

Load the extension

chrome://extensions → Developer mode → Load unpacked → pick /extension from the repo.

03

Start a meeting

Click 👻 in the toolbar to open the side panel. Hit ▶ Start. Captions stream in real time.

04

Summarize when done

Click 📋 Summarize. A structured summary — decisions, action items, next steps — appears in the panel.

§ 05who this is for

Three meetings a week
you stop taking notes for.

Standups that write themselves.

Start the panel, join the daily. Walk away with structured notes and a list of action items tagged by owner. No copy-paste into Notion.

← no bot joins · no dial-in · no seat license

Coaching you actually re-read.

Private conversations deserve private tooling. Your weekly 1:1 transcript lives on your laptop, not in a vendor's S3 bucket.

← audio stays local · summaries only if you ask

User interviews, without the compliance review.

Customer conversations often come with NDAs that forbid third-party transcription services. ghostmeet sidesteps the entire category.

← self-hosted · no data processor agreements

§ 06the questions

Fair questions,
direct answers.

Is my audio really private?

Yes. Audio is captured by the Chrome extension, streamed over WebSocket to a backend running on localhost, and transcribed by Whisper on your machine. It is never uploaded. The only external call — and only if you opt in — is a Claude API request with the transcript text when you click Summarize.

Which meeting apps are supported?

Any browser tab that plays audio. Google Meet, Zoom Web, Microsoft Teams Web, Discord, Around, Whereby, as well as recorded talks, podcasts, or training videos. Native Zoom/Teams desktop apps are not supported — use the web client.

Do I need a GPU?

No. The default `base` Whisper model runs fine on CPU for most voices. Larger models (`small`, `medium`, `large`) benefit from CUDA, but `base` is surprisingly accurate and what most people run.

Why self-host at all?

Hosted transcription services are convenient, but they require uploading audio to a vendor's servers and trusting their data-handling policies. For internal meetings, customer calls under NDA, or any conversation where privacy matters, self-hosting removes the upload entirely. You set it up once and own the stack.

Can I host the backend on a separate machine?

Yes. The backend is a FastAPI + WebSocket server. Run it on a home server, a VM, a Raspberry Pi, or anywhere you can reach over the network. Set the extension's target URL accordingly.

What about speaker diarization?

Not yet. It's on the roadmap. Current captions stream with a single speaker label per chunk. If you need 'who said what', follow the repo — it's the next major feature.

Does it work offline?

Transcription, yes — Whisper runs locally. Summarization requires the Claude API, which needs internet. You can disable summaries entirely and use ghostmeet as a pure offline captioner.

sshlab — dispatch 001 · end

Keep your meetings
on your own machine.

ghostmeet is free, open source, and runs entirely on your machine. Clone it, run it, keep it.