Skip to main content

Detect Teams / Zoom / Google Meet meetings and capture audio as WAV

Project description

side-huddle

Detect Teams, Zoom, and Google Meet meetings on your local machine and capture the audio as a WAV file. No cloud, no API keys, no bot joining the call — side-huddle runs invisibly using native OS audio APIs.

Supported platforms: macOS (full) · Windows (stub) · Linux (stub)

Quick start

# Build everything + run the Go demo
make run-demo

Pick your language:

GoPythonNode.js
listener := sh.New()
listener.On(func(e *sh.Event) {
    if e.Kind == sh.MeetingDetected {
        listener.Record()
    }
})
listener.Start()
listener = Listener()

@listener.on
def _(event):
    if event.kind == EventKind.MEETING_DETECTED:
        listener.record()

listener.start()
const listener = new Listener();
listener.on((event) => {
    if (event.kind === "MeetingDetected") {
        listener.record();
    }
});
listener.start();

Full guides: Go · Python · Node.js

How it works

  1. Detection — polls CoreAudio every 300 ms to find processes with active mic input matching known meeting apps (Teams, Zoom, Google Meet, browser-based). A 2-second sustain window avoids false positives.

  2. Window watcher (macOS) — once a meeting is detected, monitors the meeting window via CoreGraphics. Fires MeetingEnded immediately when the window closes rather than waiting for the mic to go quiet.

  3. Recording — uses a system audio tap (CATapDescription, macOS 14.2+) mixed with mic capture. Outputs a mono 16-bit PCM WAV file.

  4. Event emitter — all lifecycle events fire to registered handlers. Multiple handlers per event are supported.

Permissions (macOS)

Permission Required for Grant via
Screen Recording System audio tap (macOS 14.2+) System Settings → Privacy & Security → Screen Recording
Microphone Mic capture System Settings → Privacy & Security → Microphone

Detection alone requires no permissions.

Event lifecycle

Events fire in this order for a recorded meeting:

PermissionStatus × N       per-permission status on start()
PermissionsGranted         all required permissions OK
MeetingDetected            meeting mic sustained for 2 s
MeetingUpdated             window title identified (app + title)
RecordingStarted           audio capture began
MeetingEnded               meeting stopped
RecordingEnded             capture stopped, WAV being written
RecordingReady             WAV file written to disk

Additional events: CaptureStatus (audio/video capture interrupted or resumed), Error.

API

The API is the same across all three language bindings:

Method Description
new Listener() Create a new listener instance
listener.on(handler) Register an event handler (multiple allowed)
listener.autoRecord() Record every detected meeting automatically
listener.record() Opt in to recording the current meeting (call from MeetingDetected)
listener.setSampleRate(hz) Set sample rate (default: 16 000)
listener.setOutputDir(path) Set output directory for WAV files (default: cwd)
listener.start() Begin monitoring for meetings
listener.stop() Stop monitoring and cancel any active recording
version() Library version string

Repository structure

crates/
  side-huddle/            Rust core library (rlib + cdylib)
  side-huddle-node/       napi-rs Node.js native addon
bindings/
  go/                     Go CGo bindings (wraps cdylib)
  python/                 Python ctypes bindings (wraps cdylib)
  node/                   Node.js demo
cmd/
  demo/                   Go demo
include/
  side_huddle.h           C header (for C/C++ consumers)

Build requirements

Dependency Version Notes
Rust 1.78+ Targets: aarch64-apple-darwin, x86_64-apple-darwin
Go 1.22+ For Go bindings
Node.js 18+ For Node.js bindings
Python 3.9+ For Python bindings (pure ctypes, no compilation)
macOS 14.2+ Required for system audio tap; detection works on earlier versions

Makefile targets

make build               # Debug Rust build + verify Go
make release             # napi build --platform --release (also builds cdylib)
make run-demo            # Go demo
make run-demo-node       # Node.js demo
make run-demo-python     # Python demo
make clean

License

See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

side_huddle-0.2.1-cp314-cp314-macosx_11_0_arm64.whl (350.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

side_huddle-0.2.1-cp312-cp312-win_amd64.whl (165.5 kB view details)

Uploaded CPython 3.12Windows x86-64

side_huddle-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl (268.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

File details

Details for the file side_huddle-0.2.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for side_huddle-0.2.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9da7dc865561201443d9de4073bd6e15c90b3a7eb06ee890bcd72c6eeb5a68b1
MD5 949ca3043765583066cae0b8d024d1e2
BLAKE2b-256 4451105ba1993cec69588beb037afef8f4787d8e825b2bdf38ad6a73ad086d53

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.2.1-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: CI.yml on kenotron-ms/side-huddle

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file side_huddle-0.2.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: side_huddle-0.2.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 165.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for side_huddle-0.2.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e0c4d26c3f69f1165c3dea8a2c23b8786cba5fc991c837d9f8cdf802ab522f01
MD5 adfed7aef4df6dc86bbed24b745bdb1c
BLAKE2b-256 f9068d0eaf60fb914f5670225fb83409214e378490d2a81fddfaaeacd9d3e5eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.2.1-cp312-cp312-win_amd64.whl:

Publisher: CI.yml on kenotron-ms/side-huddle

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file side_huddle-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for side_huddle-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d4e1e1b8edfc4f084f509e1e1de31099a0f2fdddf5a9c6be0577c44d567e4d94
MD5 469da7d564fd489fc1153085c6a909e5
BLAKE2b-256 3c313717747e1e77866ea09978f5264c9ae9f00e270b6fac35670a0ce843ec41

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: CI.yml on kenotron-ms/side-huddle

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page