v0.1.0  · early access
§02.f / Instrument · auto-arm

The listener idles until you're in a call.

MeetPing isn't a constant background recorder. It sleeps until Core Audio reports the mic is in use AND a meeting app is foregrounded. When both conditions go true, it arms — runs Parakeet, scans for keywords. When either flips false, it disarms. The transcript only exists while you're in a meeting.

Plenty of "always-listening" Mac apps exist. None of them are on our work laptops, because IT will not approve a process that holds a microphone handle 24/7. Auto-arm is the answer: MeetPing reads two cheap signals — Core Audio's mic-in-use bit and the bundle ID of the foreground app — and only opens the audio tap when both line up.

Mic-in-use comes from the Core Audio HAL property kAudioDevicePropertyDeviceIsRunningSomewhere — Apple's own way of telling the orange-dot indicator when to light up. We poll it on a 500 ms cadence; the cost is negligible. Foreground app comes from NSWorkspace.frontmostApplication with a fallback to Chromium tab URLs (so Google Meet in a browser tab counts even though the browser is the foreground app).

idleno mic · no meeting apparmedtap open · streaming asrwatchingkeyword scan livemic + appmeeting endsfirst partial
idle → armed → watching · two debounced signals, one transition each

What counts as a meeting app

Out of the box: Zoom, Microsoft Teams, Google Meet (Chrome, Arc, Safari, Firefox), Slack huddles, Discord, Webex, GoTo, Around, Whereby. The list is a static plist inside the .app — you can override it from Settings → Auto-arm if your team uses something exotic, or disable auto-arm entirely and just arm/disarm by clicking the menubar icon.

What "armed" actually does

Armed means: open the audio input tap, start the FluidAudio streaming session, and run the keyword scanner against confirmed Parakeet output. That's it. Nothing else changes. The menubar icon shifts to phosphor lime, the corner of the popover shows ● ARMED, and the rolling 30-second buffer starts filling. When the meeting ends, the buffer is dropped and the tap closes.

Pair auto-arm with profiles and you have a listener that picks the right keyword set, arms for the meeting, and disappears when the meeting ends — with no interaction from you at all.

The fallbacks for edge cases

Headphone-only meeting where the mic isn't in use? Toggle "arm on meeting app foreground" — drops the mic-in-use requirement. Background podcast you don't want pinged? Add the podcast app to the disarm list. Long focus session you don't want interrupted? Click the menubar icon to set a 60-minute "do not arm" window.

No always-on recording. Ever.

The listener idles until you're in a call. Disarms when you leave. Pair with profiles and forget it's installed.