Skip to content
meetstream-aiPublic

About

Runnable sample apps for the MeetStream meeting bot API: record, transcribe and stream Zoom, Google Meet and Microsoft Teams meetings, webhooks, calendar auto-join, voice agents, CRM and Slack sync.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

58 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MeetStream Labs: meeting bot sample apps for Zoom, Google Meet and Microsoft Teams

Open source, runnable Node.js templates for the MeetStream API, the meeting bot API that joins Zoom, Google Meet and Microsoft Teams calls to record, transcribe, stream and act on them. Every template is a small, complete app: an AI notetaker, a real-time transcription server, a webhook handler, a calendar auto-join, a voice agent that talks in the meeting, a CRM or Slack sync, and so on.

64 templates plus three agent integrations covering every endpoint in the API. Each folder stands alone: clone it, add your API key, run it.

git clone https://github.com/meetstream-ai/labs.git
cd labs/quickstart-first-bot
npm install
cp .env.example .env      # add your MEETSTREAM_API_KEY
node index.js

Get an API key at app.meetstream.ai. Node 18+ required. Building with a coding agent? Point it at the Agent Quickstarts and the MeetStream MCP server, then tell it to start from one of the templates below.

What you can build with these

Goal Start with
Record a meeting and get a transcript and AI summary afterwards post-call-transcription, ai-meeting-summary, ai-meeting-notetaker-email
Live transcription, captions or audio while the meeting is running realtime-transcription, live-captions-overlay, realtime-audio-streaming
A bot on every calendar meeting automatically calendar-auto-schedule, google-calendar-integration, outlook-calendar-integration
An AI voice agent that listens and talks in the call MIA-chat-agent, mia-voice-agent-pipeline, mia-wake-word-assistant
Push meeting notes into HubSpot, Slack or Notion crm-hubspot-sync, slack-meeting-summary, notion-meeting-notes
Production-grade webhooks, retries and idempotency webhook-handler-complete, error-handling-and-retries, idempotency-and-dedup
Signed-in bots for locked-down Google Meet, Teams or Zoom meetings google-signed-in-bots-setup, teams-signed-in-bots-setup, zoom-authenticated-joins

Start here

Template What it does
quickstart-first-bot The hello world: send a bot into a meeting, poll status, print the result
post-call-transcription Bot joins, records, and saves the full transcript when the call ends
transcript-fetcher The canonical transcript flow: resolve transcript_id, poll through HTTP 202, parse segments
webhook-handler-complete The reference webhook receiver: every event, deduped redeliveries, correct status_code reading

Bots and lifecycle

Template What it does
quickstart-first-bot Create a bot, poll GET /bots/{id}/status until the session ends
bot-status-monitor Render the bot lifecycle as a live timeline in your terminal
list-and-manage-bots List every bot, filter and sort, make an active bot leave
bot-lifecycle-state-machine Webhook-driven state machine, persisted to disk, detects stuck and abandoned bots
scheduled-bot-join-at Schedule with join_at, then reschedule and cancel
manage-scheduled-bots Admin CLI for bots that have not joined yet
bot-retention-config Control how long recordings live with recording_config.retention
delete-bot-data Permanently erase a bot's data, behind a typed confirmation
idempotency-and-dedup Both anti-duplicate mechanisms: Idempotency-Key (507 replay) and deduplication_key (409)
bulk-bot-operations Run many bots concurrently with a bounded queue and per-job idempotency

Recording and media

Template What it does
audio-recording-downloader Wait for audio.processed, then download the audio
video-recording-downloader Same for video, via video.processed
per-participant-audio-recorder One audio file per participant, with correct HTTP 202 handling
per-participant-video-recorder One video and audio stream per participant
screenshot-capture Download meeting screenshots and place them on the timeline
pause-resume-recording Open and close recording privacy windows mid-meeting
custom-s3-storage Bring your own bucket: point MeetStream at your own S3 via PUT /admin/configs

Transcription

Template What it does
post-call-transcription Full transcript saved after the call
realtime-transcription Streaming transcription over webhook or WebSocket while the meeting runs
transcript-fetcher Resolve transcript_id and fetch, handling 202 correctly
re-transcribe-audio Re-run transcription with a different provider, model or language
multi-provider-transcription All five post-call providers, switched by one env var
multilingual-transcription Non-English meetings with the right provider and language code
speaker-diarization Deepgram diarization into clean per-speaker turns
live-captions-overlay Rolling live captions in your terminal

Meeting data and analytics

Template What it does
ai-meeting-summary MeetStream's native AI summary (GET /bots/{id}/summary)
speaker-timeline-analytics Talk-time, turns, longest monologue, ASCII bar chart
participant-tracker Who joined and left, live over webhooks
meeting-chat-logger Export in-meeting chat to JSON and Markdown
meeting-analytics-dashboard Everything about one meeting in a single consolidated report

Live interaction

Template What it does
realtime-audio-streaming Live PCM audio over a WebSocket you host
realtime-video-streaming Live fMP4 video over WebSocket, with the ping/pong keepalive
send-chat-message Post chat messages into a live meeting, on demand or scheduled
send-image-bot Put an image or GIF into the chat, or make it the bot's camera feed
websocket-bot-control The bring-your-own bridge: sendaudio, sendmsg, sendchat, interrupt, sendimg
interactive-meeting-agent Two-way loop: hear the room, decide, respond

MIA (MeetStream Infrastructure Agents)

MIA agents run on MeetStream's own hosted bridge. Attach one by passing only agent_config_id on create_bot.

Template What it does
MIA-chat-agent Deploy a MIA into a meeting and watch it respond
mia-voice-agent-pipeline Pipeline mode: swap STT, LLM and TTS layers independently
mia-realtime-agent Realtime mode: a single speech-to-speech model, lower latency
mia-agent-crud Admin CLI for saved agent configs
mia-wake-word-assistant Only answers when addressed: "hey acme, ..."

Calendar

Template What it does
google-calendar-integration Connect Google Calendar, including a local OAuth helper
outlook-calendar-integration Connect Outlook / Microsoft 365, including the Azure setup
calendar-event-sync Sync upcoming events and find the ones with a join link
calendar-schedule-bot Schedule a bot for one event, handling the 409 duplicate case
calendar-auto-schedule A bot joins every meeting automatically
calendar-recurring-events Whole series or single occurrence, plus auto-rescheduling
calendar-disconnect Tear down an integration, with a preview of what is lost

Platform specifics

Template What it does
zoom-meeting-bot Zoom's recording-permission flow and its timeout ranges
zoom-authenticated-joins Host the ZAK / OBF token URL so bots join Zoom as a signed-in user, not a guest
teams-meeting-bot Microsoft Teams lifecycle and admission behaviour
gmeet-lobby-handling Google Meet waiting room: detect NotAllowed and Denied, then react
google-signed-in-bots-setup SAML SSO, certificates and domain registration, end to end
google-login-management Admin CLI for signed-in bot domains and logins
teams-signed-in-bots-setup Microsoft Teams signed-in bots: tenant checklist, domain and account registration, then a signed-in join

Webhooks and reliability

Template What it does
webhook-handler-complete Every documented event, deduped, with correct status handling
webhook-local-tunnel Get webhooks delivering to your laptop over a public HTTPS tunnel
error-handling-and-retries The whole error surface: 400, 401 vs 403, 409, 429 with Retry-After, 507, 202

Integrations and AI workflows

Template What it does
ai-meeting-notetaker-email Record, summarize, and email the notes to attendees
slack-meeting-summary Post the summary and action items into Slack
notion-meeting-notes One Notion page per meeting
crm-hubspot-sync Attach the summary and transcript to the HubSpot contact and deal
action-item-extractor LLM-extracted action items with owners and due dates
sentiment-and-insights Sentiment, topics and talk-time balance as a coaching report

Agent and assistant integrations

Larger reference integrations that connect MeetStream MIA voice agents to other agent frameworks. Each has its own README and quickstart.

Project What it does
mia-hermes-bridge Bridge a self-hosted Hermes Agent into a live meeting through MIA, with ngrok tunnelling and a one-command launcher
MIA-poster-design A wake-word MIA assistant that turns a spoken event brief into a poster through the Canva bridge
openclaw-x-meetstream-skill An OpenClaw skill for operating MeetStream bots from the OpenClaw agent

Things every template gets right

These are the details that most commonly go wrong when integrating. Every template here handles them the same way:

  • Auth is Authorization: Token <key> - the literal word Token, not Bearer.
  • Every webhook carries event, and most also carry bot_event with the specific name.
  • Terminals are two-layer. Every ending arrives once as event: "bot.stopped", and bot_event says why: bot.stopped, bot.kicked, bot.notallowed (waiting room timeout), bot.denied (host refused), bot.failed. Lobby timeouts, denials and failures carry status_code: 500. Branch on bot_event: a kick and a clean exit both report bot_status: "Stopped".
  • Over REST, transcripts are fetched by transcript_id, not bot_id. Segments carry speaker and transcript (not text).
  • HTTP 202 means "not ready, poll again" - and streaming-only providers return 202 forever, so every poll loop is capped.
  • HTTP 507 is an idempotent replay and should be treated as success, not an error.
  • Streaming-only providers produce no post-call transcript (no transcription.processed), but bot.done still fires. bot.done is the final event on every path.
  • Recording defaults are product policy, not API defaults. Video is off unless you ask for it: every template sends video_required: false explicitly, because the REST API treats an omitted video_required as true. When video is on, the payload also carries recording_config.video_layout: "speaker_view", because grid_view is the API default and speaker view is what people want for review and clipping; grid is used only when you ask for it. And no template sets video_separate_streams unless per-participant video is the point of it, which today means only per-participant-video-recorder (per-participant audio is a separate switch and is unaffected). The exceptions that keep video on by design are video-recording-downloader, per-participant-video-recorder and screenshot-capture, whose screenshots are cut from the video capture.
  • MIA needs only agent_config_id. socket_connection_url and live_audio_required are for bring-your-own-bridge templates and point at your server.

Prerequisites

  • Node.js 18 or newer (templates use built-in fetch and ESM)
  • A MeetStream API key - get one here
  • For webhook templates: a public HTTPS URL (see webhook-local-tunnel)

Contributing

Have a use case to share? Open a pull request. Templates follow a consistent layout: README.md, .env.example, package.json, .gitignore, index.js, and src/*.js.

License

MIT, see LICENSE.

Resources

About

Runnable sample apps for the MeetStream meeting bot API: record, transcribe and stream Zoom, Google Meet and Microsoft Teams meetings, webhooks, calendar auto-join, voice agents, CRM and Slack sync.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages