Apus has separate plugins for Google Meet, Microsoft Teams meetings, Slack huddles, and Zoom. All four can join through Chrome, use the same participation modes, and run Chrome either on the Gateway host or on a paired node. Their platform URLs, accounts, installation model, and extra capabilities differ.

These plugins participate in meetings. They are separate from messaging channels such as the Microsoft Teams channel and Slack channel, and from the Voice call plugin.

Choose a plugin

Platform Plugin Accepted meeting links Installation Participation paths Platform-specific capabilities
Google Meet google-meet meet.google.com/... Install from npm or ClawHub; enabled by default Local Chrome, Chrome on a paired node, or Twilio dial-in Can create meetings through the Meet API or a signed-in browser; can read supported Meet artifacts with OAuth
Microsoft Teams teams-meetings Work links under teams.microsoft.com/l/meetup-join/... and consumer links under teams.live.com/meet/... Install from npm or ClawHub; enabled by default Local Chrome or Chrome on a paired node Guest join for work and consumer meetings
Slack huddles slack-huddles Slack /huddle/<TEAM>/<CHANNEL> or /huddle/<CHANNEL> links, or a channel id Install from npm or ClawHub; enable explicitly Local Chrome or Chrome on a paired node Joins active huddles as a dedicated signed-in Slack user
Zoom zoom-meetings zoom.us/j/... and account subdomains such as example.zoom.us/j/... Install from npm or ClawHub; enabled by default Local Chrome or Chrome on a paired node Guest join through the Zoom Web App

Choose Google Meet when you need meeting creation, Google API artifacts, or a Twilio phone path. Choose Teams or Zoom for direct browser guest participation on those platforms. The Teams and Zoom plugins do not create meetings, dial in, call the vendor API, or capture audio/video recordings.

Choose Slack huddles to call the agent into an active huddle. It requires a dedicated Slack user signed into the Apus Chrome profile with membership in the conversation. Slack app and bot tokens cannot join huddles or read their audio. The plugin does not start huddles or answer incoming rings.

Choose a mode

The four plugins share the same modes:

Mode Behavior Audio requirements
agent Realtime transcription goes to the configured Apus agent; regular Apus TTS speaks the reply. Chrome talk-back requires a supported virtual-audio backend.
bidi A realtime voice model listens and replies directly, with Apus agent delegation when supported. Chrome talk-back requires a supported virtual-audio backend.
transcribe Joins observe-only and exposes a bounded live-caption transcript when the platform provides captions. No virtual-audio bridge.

Use transcribe when the agent only needs meeting text. Use agent for normal Apus reasoning and tools. Use bidi when low-latency direct voice is more important than routing each turn through the regular agent.

Google Meet, Teams, Slack huddles, and Zoom use one shared meeting audio engine. In bidi mode they support GPT-Live through the same provider selection, native agent delegation, and interruption policy used by Discord and Talk. GPT-Live owns interruptions; participant audio stays open while the model speaks.

In bidi mode, recoverable provider diagnostics are logged without stopping the audio bridge. Providers that support reconnecting own that recovery. Terminal provider closure, exhausted recovery, failed initial setup, and local audio-transport failures still stop the bridge; leaving the meeting also stops it.

Stopping a meeting requests cancellation of any active agent consult. In agent mode, Apus finishes active output and turn events before closing the session, then ignores late speech synthesis and audio delivery results.

Leaving also waits for audio startup already admitted by that session and stops the resulting runtime before reporting completion. If a join fails after attaching a runtime and cleanup cannot finish, status keeps the ended session visible so leave can retry. A replacement for the same meeting waits for pending audio startup or stop work and can reject if audio cleanup still fails; other meetings remain independent. Browser leave results remain separate: a settled browser-only leave failure remains retryable without permanently blocking another join.

The bounded live transcript remains available only in transcribe mode. In all three modes, browser joins also persist completed caption rows and meeting notes to the shared state database. Notes update about every five minutes when new speech is saved, using the meeting agent's utility model with primary-model and heuristic fallbacks. Leaving the meeting finalizes visible captions and writes the final summary; use apus transcripts to list, inspect, or export it. This durable notes path does not change the live agent-consult transcript or create an audio/video recording.

Automatic notes are on by default. Set transcripts.enabled: false to disable durable notes globally. An explicitly selected transcribe session retains its bounded live-caption tail without writing durable rows. Caption availability still depends on the meeting platform, account, language, and host policy.

Configure Teams or Zoom

The Teams and Zoom plugins share the same configuration shape for their common meeting runtime. Slack huddles uses these settings too, except that its Slack account supplies the display name. Add an entry only when you need to override a default. This example selects the normal agent path, changes the guest display name, and runs Chrome on a paired node:

{
  plugins: {
    entries: {
      "teams-meetings": {
        config: {
          defaultMode: "agent",
          chrome: { guestName: "Apus Agent" },
          chromeNode: { node: "meeting-node" },
        },
      },
    },
  },
}

Use "zoom-meetings" as the entry id for Zoom. Omit chromeNode to run Chrome on the Gateway host. For Slack, use "slack-huddles", enable the plugin explicitly, and follow its account setup.

Setting Purpose
defaultMode agent (default), bidi, or transcribe
chrome.guestName Guest display name entered on the platform prejoin page
chrome.browserProfile Apus browser profile used for the meeting
chrome.audioBackend auto (default), blackhole-2ch, or pipewire-pulse
chromeNode.node Paired node id, name, or IP that owns Chrome and the native virtual-audio backend
realtime.transcriptionProvider Realtime transcription provider used by agent mode
realtime.voiceProvider Realtime voice provider used by bidi mode
realtime.model Optional realtime model override
realtime.agentId Agent consulted in agent mode
realtime.toolPolicy safe-read-only, owner, or none

For GPT-Live with Cove, set defaultMode: "bidi", realtime.voiceProvider: "openai", realtime.model: "gpt-live-1-codex", and realtime.providers.openai.voice: "cove". Sign in with apus models auth login --provider openai on the Gateway host. The Google Meet configuration example uses the same fields; substitute teams-meetings, slack-huddles, or zoom-meetings for the plugin entry. Unpinned configurations keep their provider's default model. agent mode continues to use regular Apus TTS.

Prepare Chrome and audio

Chrome can run on the Gateway host or on a paired node. A remote Chrome node must allow browser.proxy plus the platform command:

Plugin Node command
Google Meet googlemeet.chrome
Microsoft Teams teamsmeetings.chrome
Slack huddles slackhuddles.chrome
Zoom zoommeetings.chrome

For agent or bidi mode through Chrome, install the native audio dependencies on the host that runs Chrome. On macOS:

brew install blackhole-2ch sox
sudo reboot
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox

On a Linux desktop with PipeWire-Pulse, install the PulseAudio command-line tools. Apus creates and reuses an Apus Meeting Audio null sink and matching source in the desktop user's audio session:

# Debian/Ubuntu
sudo apt install pipewire-audio pulseaudio-utils
systemctl --user --now enable pipewire pipewire-pulse wireplumber
pactl info
command -v pactl pacat parec

Run the Gateway or paired node as the same desktop user that runs Chrome. A root service or headless service without that user's XDG_RUNTIME_DIR cannot access the PipeWire-Pulse socket and fails setup with an actionable error.

The Gateway host still owns the Apus agent and model credentials when Chrome runs on a paired node. Configure a realtime transcription provider and Apus TTS for agent mode, or a realtime voice provider for bidi mode. The platform guides contain the provider and audio-command options.

Chrome sessions without an explicit chrome.audioInputCommand capture participant audio directly from browser playback and keep that playback off the virtual microphone. The native output command injects assistant speech into the microphone; the native input command verifies that injection. Isolated participant input remains open during both realtime speech and TTS. A capture failure stops the bridge with an error; mixed loopback audio is not used as a fallback for Live.

Explicit input commands retain their existing provider-input behavior on both local and paired-node Chrome, including custom capture, filters, and mixers. They keep the existing echo protection. To select GPT-Live, remove the input override and use managed isolated capture; Live rejects a custom command path whose isolation cannot be verified instead of silently replacing it.

Install or disable plugins

Install the meeting plugins you need. Google Meet, Teams, and Zoom are enabled by default after installation. Slack huddles requires explicit enablement after setting up its dedicated user account:

apus plugins install @openclaw/google-meet
apus plugins install @openclaw/teams-meetings
apus plugins install @openclaw/slack-huddles
apus plugins enable slack-huddles
apus plugins install @openclaw/zoom-meetings

Disable any meeting plugin you do not use:

apus plugins disable google-meet
apus plugins disable teams-meetings
apus plugins disable slack-huddles
apus plugins disable zoom-meetings

These changes apply to a running Gateway automatically. If it is offline, start it before joining. Check the application result, then run the platform setup check below; see Apply changes and inspect.

Verify and join

Platform Setup check Join command
Google Meet apus googlemeet setup apus googlemeet join 'https://meet.google.com/abc-defg-hij'
Microsoft Teams apus teamsmeetings setup apus teamsmeetings join 'https://teams.microsoft.com/l/meetup-join/...'
Slack huddles apus slackhuddles setup apus slackhuddles join 'channel:C0123ABCD'
Zoom apus zoommeetings setup apus zoommeetings join 'https://zoom.us/j/1234567890'

Treat any failed setup check as a blocker for that transport and mode. For an observe-only smoke test, select transcribe mode and confirm that status reports an in-call session before expecting caption text.

For talk-back smoke tests, verified speech requires more than bytes accepted by the playback command. The shared command-pair bridge correlates a bounded waveform fingerprint from the current output generation with audio returning on the selected virtual microphone capture path; Google Meet, Teams, Slack huddles, and Zoom do not report speechOutputVerified: true when only the output-byte counter advances or unrelated participant audio is present.

That verifies local microphone injection. Use a controlled second participant to prove remote audibility and interruption during an actual meeting.

Handle platform policy prompts

Browser automation handles the normal guest-name, prejoin camera and microphone, join, in-call, and leave controls. It does not bypass platform or organizer policy.

When a join or status result includes manualAction, complete its reported step in the same Apus Chrome profile before retrying. Repeatedly opening new tabs does not resolve an account, tenant, lobby, or CAPTCHA gate.

Only join meetings where the operator is authorized to add an agent. Tell participants when local policy or consent rules require disclosure of automated participation, transcription, or synthesized speech.

Discord voice chat

Discord voice channels provide native, audio-only realtime conversation without browser meeting automation. Apus can join a voice channel, listen, route turns through an Apus agent or realtime voice model, and speak replies. It does not send or receive camera video or screen sharing, even when people use video in the same Discord channel, so Discord voice is a related live-conversation surface rather than a browser meeting plugin.

Platform guides