Integrations · Internal
Zoom rehearsal (one bot)
https://digital-delegate-api.fly.devBinds one Session + one stored ZoomConnection to a meeting id, validates the meeting over Zoom REST, then either (A) moves straight to LISTENING for browser-only rehearsal, or (B) with ZOOM_WORKER_SECRET on the API, stops at CONNECTED until a Meeting SDK worker reports in_meeting. TTS is produced on the API; piping it into the Zoom session requires your SDK + virtual mic setup (see apps/zoom-worker/README.md).
Home · Worker Control Center · Operator Console · Zoom OAuth · Demo
LiveSession save target
No LiveSession linked
Live Zoom Worker Checklist
Browser Demo Mode
Proves worker intelligence and voice locally with ElevenLabs in the browser. It does not put audio into Zoom.
Live Zoom Worker Mode
Requires the Meeting SDK worker to join and report in_meeting. Binding and worker must use the same API instance.
Phase 5C Native Runtime Proof
Populate native SDK assets, build the Linux worker image, run ldd, then prove CONNECTED becomes LISTENING after in_meeting.
Panelist Mode
Preserves Delegate, Analyst, and Provocationist rehearsal behavior for live content use cases.
- Zoom OAuth configured
- Checking
- Meeting SDK key configured
- Checking
- Meeting SDK secret configured
- Checking
- Worker secret configured
- Checking
- Public API base URL configured
- Checking
- ElevenLabs configured
- Checking
- Default voice configured
- Checking
- Database configured
- Checking
- Binding created
- Missing
- Worker status
- No binding
- Worker in meeting
- Not reported yet
- Audio output ready
- Waiting for worker in meeting
- Listening/STT status
- Not implemented yet
API needs DATABASE_URL and DIRECT_URL for sessions, bindings, OAuth tokens, responses, and warnings.
Next: Set database env vars in apps/api/.env and restart the API.
OAuth loads Zoom connections and obtains the ZAK needed for Meeting SDK join.
Next: Confirm Zoom app Client ID, Client Secret, and redirect URI.
Meeting SDK key/secret signs the SDKAuth JWT for the external worker.
Next: Set ZOOM_MEETING_SDK_KEY and ZOOM_MEETING_SDK_SECRET on API and worker.
Live Zoom requires apps/zoom-worker to join and report in_meeting to move CONNECTED to LISTENING.
Next: Run local worker against local API, or deployed worker against deployed API. Do not mix local API with Fly worker.
API generates ElevenLabs MP3; zoom-worker injects it through PulseAudio into the Meeting SDK client.
Next: Set ElevenLabs env and ensure worker has ffmpeg, PulseAudio, ZoomOut/ZoomIn, and native Zoom SDK runtime.
The worker does not yet capture Zoom meeting audio or stream it to STT.
Next: Use operator-entered prospect replies until STT capture, segmentation, and trigger policy are implemented.
A binding links one Session and Zoom connection to a Zoom meeting id.
Next: Create a session, setup a participant, paste a Zoom URL or meeting id, then create binding.
- Start API.
- Start web.
- Load Zoom connection.
- Create session.
- Setup worker.
- Paste Zoom join URL.
- Create binding.
- Click Join.
- Immediately run doctor or start worker with that binding.
- Wait for worker in_meeting.
- Only then use Speak.
Listening/STT is not implemented. Operator-entered replies are required.
Native runtime proof checklist
Create a binding first.
FLY API: https://digital-delegate-api.fly.dev
Create Join and run the worker against this same API base.
Run native layout and asset verification, place files under apps/zoom-worker/vendor/zoom, then build and run ldd. Do not commit vendor binaries.
Create binding and click Join to arm the bundle.
- Deploy API and zoom-worker from the same repo revision.
- Confirm API and worker Fly secrets use the same worker secret and Meeting SDK credentials.
- Use deployed web/app or local web configured to the deployed API.
- Create binding and click Join against that API.
- Start the worker with the current binding id immediately.
- Watch logs, admit the worker in Zoom, then confirm CONNECTED becomes LISTENING.
Direct Zoom TTS proof
Plays ElevenLabs audio in this browser only. It does not send audio into Zoom.
Requires the worker to be in the meeting, then API Speak emits TTS to the worker over Socket.IO for ffmpeg/PulseAudio injection.
Wait for worker in_meeting and binding LISTENING before using Speak for direct Zoom audio.
No worker audio proof event yet
- Run audio doctor in the same Linux/Docker/Fly environment as the worker.
- Use TTS dry-run to prove download and ffmpeg conversion without claiming Zoom output.
- After the worker reports in_meeting, click Speak or call the speak endpoint.
- Watch worker logs for tts_audio_ready_received, tts_audio_downloaded, ffmpeg injection start, and audio_complete.
- Have a human confirm whether the Zoom participant heard the audio.
Listening/STT proof
Not implemented or proven. The worker does not yet capture Zoom audio or transcribe it.
Ready for operator-entered, browser rehearsal, and future STT transcript segments on LiveSession.
ZOOM_CAPTURE_SOURCE / ZOOM_AUDIO_SOURCE / PULSE_SOURCE, defaulting to ZoomIn.
Worker TTS must be separated from prospect audio before automatic listening can trigger worker turns.
- Prove the capture source exists in Linux/Docker/Fly.
- Record short chunks without sending them to STT.
- Add a real STT provider and persist final segments.
- Suppress worker TTS feedback before automatic triggers.
- Keep manual operator-entered replies as the safe workaround.
Operator commands
1. Link ids
2. Session + panelist
3. Binding + join
4. Speak (invocation + TTS)
5. Demo cockpit
Ongoing Sales Discovery session
Result so far
- Budget
- Open question
- Timeline
- Open question
- Decision maker
- Open question
- Pain points
- Open question
- Qualification status
- Needs discovery
- Objections
- Open question
- Recommended next step
- Continue qualification.
- Follow-up email draft
- Open question