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.1.0-cp314-cp314-macosx_11_0_arm64.whl (372.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

side_huddle-0.1.0-cp313-cp313-macosx_11_0_arm64.whl (399.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

side_huddle-0.1.0-cp312-cp312-win_amd64.whl (163.4 kB view details)

Uploaded CPython 3.12Windows x86-64

side_huddle-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl (267.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

File details

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

File metadata

File hashes

Hashes for side_huddle-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e1cd93217d63ac59267f44ace533369890a08bd960a828446c84af5ba4f054a
MD5 5a22cdf2be0eafda50b040ae0ff1873f
BLAKE2b-256 d89acfef33a0e791e56a8b02199cf360f3039f6d4b03b9110e60799d2e5c6749

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.1.0-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.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for side_huddle-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 806ed97095eea2950f3edcad13eacc4e41c61ad7b4c36931eb9bcba612b0a276
MD5 9606acaa9aa28e7e84c7bbba6e5a18cc
BLAKE2b-256 69e2b4067abc82f0a639f33763540af2c81eef45f346c06f8ab27e9b69d9932e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: side_huddle-0.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 163.4 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.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e89690622689393230972f87daec39573b2519e8b74e46d0e79d35b48755479c
MD5 7ecdb8d7a6c2a4a57ef01461095259ff
BLAKE2b-256 bd66152e312a5a5b41aa5d9a8bdfd9488e4dfd616652fe6d453224b1070203db

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.1.0-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.1.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for side_huddle-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 14e694ac6a32b4feff74fac0a006fdaf2074a91f25ee47bb384cb73cb147be43
MD5 3441b3034c6472d1e93223a5f6681402
BLAKE2b-256 19d359f7bf60e505171c44af760341bdbc2b3a3dc06d9cebf38d6a69323cd944

See more details on using hashes here.

Provenance

The following attestation bundles were made for side_huddle-0.1.0-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