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:
| Go | Python | Node.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
-
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.
-
Window watcher (macOS) — once a meeting is detected, monitors the meeting window via CoreGraphics. Fires
MeetingEndedimmediately when the window closes rather than waiting for the mic to go quiet. -
Recording — uses a system audio tap (
CATapDescription, macOS 14.2+) mixed with mic capture. Outputs a mono 16-bit PCM WAV file. -
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file side_huddle-0.1.0-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: side_huddle-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 372.1 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e1cd93217d63ac59267f44ace533369890a08bd960a828446c84af5ba4f054a
|
|
| MD5 |
5a22cdf2be0eafda50b040ae0ff1873f
|
|
| BLAKE2b-256 |
d89acfef33a0e791e56a8b02199cf360f3039f6d4b03b9110e60799d2e5c6749
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
side_huddle-0.1.0-cp314-cp314-macosx_11_0_arm64.whl -
Subject digest:
8e1cd93217d63ac59267f44ace533369890a08bd960a828446c84af5ba4f054a - Sigstore transparency entry: 1339366754
- Sigstore integration time:
-
Permalink:
kenotron-ms/side-huddle@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/kenotron-ms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
CI.yml@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Trigger Event:
push
-
Statement type:
File details
Details for the file side_huddle-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: side_huddle-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 399.5 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
806ed97095eea2950f3edcad13eacc4e41c61ad7b4c36931eb9bcba612b0a276
|
|
| MD5 |
9606acaa9aa28e7e84c7bbba6e5a18cc
|
|
| BLAKE2b-256 |
69e2b4067abc82f0a639f33763540af2c81eef45f346c06f8ab27e9b69d9932e
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e89690622689393230972f87daec39573b2519e8b74e46d0e79d35b48755479c
|
|
| MD5 |
7ecdb8d7a6c2a4a57ef01461095259ff
|
|
| BLAKE2b-256 |
bd66152e312a5a5b41aa5d9a8bdfd9488e4dfd616652fe6d453224b1070203db
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
side_huddle-0.1.0-cp312-cp312-win_amd64.whl -
Subject digest:
e89690622689393230972f87daec39573b2519e8b74e46d0e79d35b48755479c - Sigstore transparency entry: 1339366736
- Sigstore integration time:
-
Permalink:
kenotron-ms/side-huddle@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/kenotron-ms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
CI.yml@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Trigger Event:
push
-
Statement type:
File details
Details for the file side_huddle-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: side_huddle-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 267.5 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14e694ac6a32b4feff74fac0a006fdaf2074a91f25ee47bb384cb73cb147be43
|
|
| MD5 |
3441b3034c6472d1e93223a5f6681402
|
|
| BLAKE2b-256 |
19d359f7bf60e505171c44af760341bdbc2b3a3dc06d9cebf38d6a69323cd944
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
side_huddle-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl -
Subject digest:
14e694ac6a32b4feff74fac0a006fdaf2074a91f25ee47bb384cb73cb147be43 - Sigstore transparency entry: 1339366779
- Sigstore integration time:
-
Permalink:
kenotron-ms/side-huddle@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/kenotron-ms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
CI.yml@b6ce92cddd64fbb45c26ad6d92c3bfd64c304069 -
Trigger Event:
push
-
Statement type: