Toggle Google Meet mute with your AirPods.
On iPhone, pressing the AirPods stem mutes and unmutes your call. On Mac, it just plays and pauses music. MeetPods fixes this — press your AirPods stem (or any media key) during a Google Meet call, and your microphone toggles. Outside of calls, media keys work normally.
- Grab the latest
.dmgfrom Releases - Open it, drag MeetPods to Applications
- Right-click → Open on first launch (the app is ad-hoc signed, not notarized)
- Grant Accessibility and Microphone permissions when prompted
- Install the Chrome extension — see Extension setup below
Requires macOS 12+, Node.js 22+, and Xcode Command Line Tools.
git clone https://github.com/vinimlo/meetpods.git
cd meetpods
make setup # Install deps + full build
make dev # Launch the appTo package your own .dmg:
make install # Build .dmg and open installerThe Chrome extension connects to the menu bar app via local WebSocket and controls Google Meet's mute button.
- Build the extension:
npm run build:ext - Open
chrome://extensions/in Google Chrome - Enable Developer mode (toggle in top-right)
- Click Load unpacked → select the
dist/extension/directory
When installed from a
.dmg, the extension files are bundled atMeetPods.app/Contents/Resources/extension/.
AirPods stem press
→ macOS media key event
→ MeetPods intercepts via CGEventTap
→ Asks Chrome extension: "Active Meet call?"
→ Yes → Toggle mute, consume the key event
→ No → Pass through (music plays/pauses normally)
Three components work together:
| Component | What it does |
|---|---|
| Menu bar app (Electron) | Intercepts media keys, orchestrates mute toggle, shows status in the menu bar |
| Native addon (C++/ObjC++) | Uses macOS CGEventTap to capture media key events at the system level |
| Chrome extension (Manifest V3) | Detects active Meet calls, clicks the mute button in the DOM |
The app also listens for AirPods stem-hold mute gestures via AVAudioApplication (macOS 14+), suppressing the "Cannot Control Mic" system notification.
You can also toggle mute directly from the extension popup by clicking the microphone status row during an active call — no media keys needed.
| Icon | Meaning |
|---|---|
| Gray microphone | No active call — media keys pass through |
| Microphone + signal arcs | In call, mic on |
| Microphone with slash | In call, muted |
The popup shows connection status, current call state, and a list of open Meet tabs. During an active call, click the microphone row to toggle mute. You can also pin a specific Meet tab to control when multiple calls are open.
| Permission | Why |
|---|---|
| Accessibility | Intercept media key events via CGEventTap — same as Karabiner or BetterTouchTool |
| Microphone | Detect AirPods mute gestures and suppress the "Cannot Control Mic" notification (macOS 14+) |
Chrome: tabs |
Detect which tabs have Google Meet open |
Chrome: meet.google.com |
Inject content script to control the mute button |
See CONTRIBUTING.md for setup, architecture, and PR workflow.
Quick reference:
make help # Show all targets
make dev # Launch app (fast — skips native rebuild)
make test # Run tests
make lint # Lint code
make build # Full build (TS + extension + native)Detailed documentation lives in docs/:
- Architecture — full system design and data flow
- Native addon — CGEventTap, AUHAL, and Darwin notifications
- Chrome extension — Manifest V3, content scripts, WebSocket bridge
- AirPods deep dive — how AirPods events work on macOS
- Google Meet only — by design; MeetPods is a focused tool, not a universal mute switch
- macOS only — the native addon uses CoreGraphics and CoreAudio frameworks
- Not on the Mac App Store — Accessibility permission is not allowed in sandboxed apps
- DOM-dependent — Google Meet UI changes may require content script updates
See SECURITY.md for the security model and how to report vulnerabilities.
Contributions are welcome! See CONTRIBUTING.md to get started.
Apache License 2.0 — see LICENSE for details.
