> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.meetstream.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server.

# Tutorials and Sample Apps

> Runnable MeetStream sample apps and starter templates: meeting bots, transcription, recordings, live streaming, MIA voice agents, calendar automation, webhooks, and CRM, Slack and Notion integrations.

Every template lives in [MeetStream Labs](https://github.com/meetstream-ai/labs) and runs on its own. No shared build, no framework to learn first: Node 18+, a `.env` file and one command.

> **Tip**
>
> Building with a coding agent? Point it at [llms.txt](https://docs.meetstream.ai/llms.txt), connect the [MeetStream MCP server](/build-with-ai/meetstream-mcp-server), and paste the guide from [Agent Quickstarts](/build-with-ai/agent-quickstarts). Or tell it to start from one of the templates below.

## Run any template

#### Clone Labs

```bash
git clone https://github.com/meetstream-ai/labs.git
cd labs/quickstart-first-bot
```

#### Add your API key

```bash
cp .env.example .env   # set MEETSTREAM_API_KEY
```

Create a key at [app.meetstream.ai](https://app.meetstream.ai/api-key). Each template's `.env.example` lists every variable it reads, with comments.

#### Install and run

```bash
npm install
node index.js
```

Templates that receive webhooks need a public HTTPS URL. [`webhook-local-tunnel`](https://github.com/meetstream-ai/labs/tree/main/webhook-local-tunnel) shows how to get one for your laptop.

## Popular starting points

#### [Your first bot](https://github.com/meetstream-ai/labs/tree/main/quickstart-first-bot)

Send a bot, poll its status, print the result. The hello world.

#### [AI notetaker that emails notes](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-notetaker-email)

Record, summarize and email the notes to every attendee.

#### [Real-time transcription](https://github.com/meetstream-ai/labs/tree/main/realtime-transcription)

Stream the transcript while the meeting is still running.

#### [Voice agent in a meeting](https://github.com/meetstream-ai/labs/tree/main/MIA-chat-agent)

Deploy a MIA agent that listens and talks back.

#### [Bots from the calendar](https://github.com/meetstream-ai/labs/tree/main/calendar-auto-schedule)

A bot joins every meeting on a connected calendar.

#### [Production webhook handler](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete)

Every event, deduped, with correct terminal handling.

## Start here

| Template                                                                                               | What it shows                                                                                    |
| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| [`quickstart-first-bot`](https://github.com/meetstream-ai/labs/tree/main/quickstart-first-bot)         | The hello world: send a bot into a meeting, poll status, print the result                        |
| [`post-call-transcription`](https://github.com/meetstream-ai/labs/tree/main/post-call-transcription)   | Bot joins, records, and saves the full transcript when the call ends                             |
| [`transcript-fetcher`](https://github.com/meetstream-ai/labs/tree/main/transcript-fetcher)             | The canonical transcript flow: resolve `transcript_id`, poll through HTTP 202, parse segments    |
| [`webhook-handler-complete`](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete) | The reference webhook receiver: every event, deduped redeliveries, correct `status_code` reading |

**Related guides:** [Create your first bot](/guides/get-started/create-your-first-bot), [Webhooks and events](/guides/webhooks/webhooks-and-events)

## Bots and lifecycle

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

**Related guides:** [How bots work](/guides/introduction/how-bots-work), [Scheduling bots](/guides/features/scheduling-bots), [Idempotency and deduplication](/guides/features/deduplication-idempotency-keys)

## Recording and media

| Template                                                                                                           | What it shows                                                                   |
| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
| [`audio-recording-downloader`](https://github.com/meetstream-ai/labs/tree/main/audio-recording-downloader)         | Wait for `audio.processed`, then download the audio                             |
| [`video-recording-downloader`](https://github.com/meetstream-ai/labs/tree/main/video-recording-downloader)         | Same for video, via `video.processed`                                           |
| [`per-participant-audio-recorder`](https://github.com/meetstream-ai/labs/tree/main/per-participant-audio-recorder) | One audio file per participant, with correct HTTP 202 handling                  |
| [`per-participant-video-recorder`](https://github.com/meetstream-ai/labs/tree/main/per-participant-video-recorder) | One video and audio stream per participant                                      |
| [`screenshot-capture`](https://github.com/meetstream-ai/labs/tree/main/screenshot-capture)                         | Download meeting screenshots and place them on the timeline                     |
| [`pause-resume-recording`](https://github.com/meetstream-ai/labs/tree/main/pause-resume-recording)                 | Open and close recording privacy windows mid-meeting                            |
| [`custom-s3-storage`](https://github.com/meetstream-ai/labs/tree/main/custom-s3-storage)                           | Bring your own bucket: point MeetStream at your own S3 via `PUT /admin/configs` |

**Related guides:** [Per-participant video](/guides/transcription-recordings/per-participant-video), [Custom storage (S3)](/guides/features/custom-storage-configurations/amazon-s3)

## Transcription

| Template                                                                                                       | What it shows                                                            |
| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`post-call-transcription`](https://github.com/meetstream-ai/labs/tree/main/post-call-transcription)           | Full transcript saved after the call                                     |
| [`realtime-transcription`](https://github.com/meetstream-ai/labs/tree/main/realtime-transcription)             | Streaming transcription over webhook or WebSocket while the meeting runs |
| [`transcript-fetcher`](https://github.com/meetstream-ai/labs/tree/main/transcript-fetcher)                     | Resolve `transcript_id` and fetch, handling 202 correctly                |
| [`re-transcribe-audio`](https://github.com/meetstream-ai/labs/tree/main/re-transcribe-audio)                   | Re-run transcription with a different provider, model or language        |
| [`multi-provider-transcription`](https://github.com/meetstream-ai/labs/tree/main/multi-provider-transcription) | All five post-call providers, switched by one env var                    |
| [`multilingual-transcription`](https://github.com/meetstream-ai/labs/tree/main/multilingual-transcription)     | Non-English meetings with the right provider and language code           |
| [`speaker-diarization`](https://github.com/meetstream-ai/labs/tree/main/speaker-diarization)                   | Deepgram diarization into clean per-speaker turns                        |
| [`live-captions-overlay`](https://github.com/meetstream-ai/labs/tree/main/live-captions-overlay)               | Rolling live captions in your terminal                                   |

**Related guides:** [Post-call transcription](/guides/transcription-recordings/post-call-transcription), [Live transcription](/guides/transcription-recordings/live-transcription), [Transcription providers](/guides/transcription-recordings/providers/transcription-providers)

## Meeting data and analytics

| Template                                                                                                     | What it shows                                                |
| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ |
| [`ai-meeting-summary`](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-summary)                   | MeetStream's native AI summary (`GET /bots/{id}/summary`)    |
| [`speaker-timeline-analytics`](https://github.com/meetstream-ai/labs/tree/main/speaker-timeline-analytics)   | Talk-time, turns, longest monologue, ASCII bar chart         |
| [`participant-tracker`](https://github.com/meetstream-ai/labs/tree/main/participant-tracker)                 | Who joined and left, live over webhooks                      |
| [`meeting-chat-logger`](https://github.com/meetstream-ai/labs/tree/main/meeting-chat-logger)                 | Export in-meeting chat to JSON and Markdown                  |
| [`meeting-analytics-dashboard`](https://github.com/meetstream-ai/labs/tree/main/meeting-analytics-dashboard) | Everything about one meeting in a single consolidated report |

**Related guides:** [API reference](/api-reference/introduction)

## Live interaction

| Template                                                                                                 | What it shows                                                                         |
| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| [`realtime-audio-streaming`](https://github.com/meetstream-ai/labs/tree/main/realtime-audio-streaming)   | Live PCM audio over a WebSocket you host                                              |
| [`realtime-video-streaming`](https://github.com/meetstream-ai/labs/tree/main/realtime-video-streaming)   | Live fMP4 video over WebSocket, with the ping/pong keepalive                          |
| [`send-chat-message`](https://github.com/meetstream-ai/labs/tree/main/send-chat-message)                 | Post chat messages into a live meeting, on demand or scheduled                        |
| [`send-image-bot`](https://github.com/meetstream-ai/labs/tree/main/send-image-bot)                       | Put an image or GIF into the chat, or make it the bot's camera feed                   |
| [`websocket-bot-control`](https://github.com/meetstream-ai/labs/tree/main/websocket-bot-control)         | The bring-your-own bridge: `sendaudio`, `sendmsg`, `sendchat`, `interrupt`, `sendimg` |
| [`interactive-meeting-agent`](https://github.com/meetstream-ai/labs/tree/main/interactive-meeting-agent) | Two-way loop: hear the room, decide, respond                                          |

**Related guides:** [Meeting control patterns](/guides/websockets/meeting-control-patterns)

## MIA voice agents

| Template                                                                                               | What it shows                                                 |
| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------- |
| [`MIA-chat-agent`](https://github.com/meetstream-ai/labs/tree/main/MIA-chat-agent)                     | Deploy a MIA into a meeting and watch it respond              |
| [`mia-voice-agent-pipeline`](https://github.com/meetstream-ai/labs/tree/main/mia-voice-agent-pipeline) | Pipeline mode: swap STT, LLM and TTS layers independently     |
| [`mia-realtime-agent`](https://github.com/meetstream-ai/labs/tree/main/mia-realtime-agent)             | Realtime mode: a single speech-to-speech model, lower latency |
| [`mia-agent-crud`](https://github.com/meetstream-ai/labs/tree/main/mia-agent-crud)                     | Admin CLI for saved agent configs                             |
| [`mia-wake-word-assistant`](https://github.com/meetstream-ai/labs/tree/main/mia-wake-word-assistant)   | Only answers when addressed: "hey acme, ..."                  |

**Related guides:** [What is MIA](/guides/mia/what-is-mia), [Create an agent](/guides/mia/create-an-agent)

## Calendar

| Template                                                                                                       | What it shows                                                 |
| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| [`google-calendar-integration`](https://github.com/meetstream-ai/labs/tree/main/google-calendar-integration)   | Connect Google Calendar, including a local OAuth helper       |
| [`outlook-calendar-integration`](https://github.com/meetstream-ai/labs/tree/main/outlook-calendar-integration) | Connect Outlook / Microsoft 365, including the Azure setup    |
| [`calendar-event-sync`](https://github.com/meetstream-ai/labs/tree/main/calendar-event-sync)                   | Sync upcoming events and find the ones with a join link       |
| [`calendar-schedule-bot`](https://github.com/meetstream-ai/labs/tree/main/calendar-schedule-bot)               | Schedule a bot for one event, handling the 409 duplicate case |
| [`calendar-auto-schedule`](https://github.com/meetstream-ai/labs/tree/main/calendar-auto-schedule)             | A bot joins every meeting automatically                       |
| [`calendar-recurring-events`](https://github.com/meetstream-ai/labs/tree/main/calendar-recurring-events)       | Whole series or single occurrence, plus auto-rescheduling     |
| [`calendar-disconnect`](https://github.com/meetstream-ai/labs/tree/main/calendar-disconnect)                   | Tear down an integration, with a preview of what is lost      |

**Related guides:** [Google Calendar setup](/guides/calendar-integrations/google-calendar-oauth-setup), [Outlook Calendar setup](/guides/calendar-integrations/outlook-calendar-setup)

## Platform specifics

| Template                                                                                                     | What it shows                                                                   |
| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
| [`zoom-meeting-bot`](https://github.com/meetstream-ai/labs/tree/main/zoom-meeting-bot)                       | Zoom's recording-permission flow and its timeout ranges                         |
| [`zoom-authenticated-joins`](https://github.com/meetstream-ai/labs/tree/main/zoom-authenticated-joins)       | Host the ZAK / OBF token URL so bots join Zoom as a signed-in user, not a guest |
| [`teams-meeting-bot`](https://github.com/meetstream-ai/labs/tree/main/teams-meeting-bot)                     | Microsoft Teams lifecycle and admission behaviour                               |
| [`gmeet-lobby-handling`](https://github.com/meetstream-ai/labs/tree/main/gmeet-lobby-handling)               | Google Meet waiting room: detect `NotAllowed` and `Denied`, then react          |
| [`google-signed-in-bots-setup`](https://github.com/meetstream-ai/labs/tree/main/google-signed-in-bots-setup) | SAML SSO, certificates and domain registration, end to end                      |
| [`google-login-management`](https://github.com/meetstream-ai/labs/tree/main/google-login-management)         | Admin CLI for signed-in bot domains and logins                                  |

**Related guides:** [Zoom](/guides/platforms/zoom), [Zoom authenticated bots](/guides/app-integrations/zoom-authenticated-bots), [Google signed-in bots](/guides/app-integrations/google-signed-in-bots)

## Webhooks and reliability

| Template                                                                                                   | What it shows                                                                   |
| ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| [`webhook-handler-complete`](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete)     | Every documented event, deduped, with correct status handling                   |
| [`webhook-local-tunnel`](https://github.com/meetstream-ai/labs/tree/main/webhook-local-tunnel)             | Get webhooks delivering to your laptop over a public HTTPS tunnel               |
| [`error-handling-and-retries`](https://github.com/meetstream-ai/labs/tree/main/error-handling-and-retries) | The whole error surface: 400, 401 vs 403, 409, 429 with `Retry-After`, 507, 202 |

**Related guides:** [Webhooks and events](/guides/webhooks/webhooks-and-events), [Local webhook server](/guides/webhooks/local-webhook-server), [Errors](/errors)

## Integrations and AI workflows

| Template                                                                                                   | What it shows                                                     |
| ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| [`ai-meeting-notetaker-email`](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-notetaker-email) | Record, summarize, and email the notes to attendees               |
| [`slack-meeting-summary`](https://github.com/meetstream-ai/labs/tree/main/slack-meeting-summary)           | Post the summary and action items into Slack                      |
| [`notion-meeting-notes`](https://github.com/meetstream-ai/labs/tree/main/notion-meeting-notes)             | One Notion page per meeting                                       |
| [`crm-hubspot-sync`](https://github.com/meetstream-ai/labs/tree/main/crm-hubspot-sync)                     | Attach the summary and transcript to the HubSpot contact and deal |
| [`action-item-extractor`](https://github.com/meetstream-ai/labs/tree/main/action-item-extractor)           | LLM-extracted action items with owners and due dates              |
| [`sentiment-and-insights`](https://github.com/meetstream-ai/labs/tree/main/sentiment-and-insights)         | Sentiment, topics and talk-time balance as a coaching report      |

**Related guides:** [Agent Quickstarts](/build-with-ai/agent-quickstarts)

## Agent and assistant integrations

Larger reference integrations that connect MeetStream MIA voice agents to other agent frameworks.

| Project                                                                                                      | What it shows                                                                                                       |
| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| [`mia-hermes-bridge`](https://github.com/meetstream-ai/labs/tree/main/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`](https://github.com/meetstream-ai/labs/tree/main/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`](https://github.com/meetstream-ai/labs/tree/main/openclaw-x-meetstream-skill) | An OpenClaw skill for operating MeetStream bots from the OpenClaw agent                                             |

## What every template gets right

The templates are written against behaviour verified on the live API, so they double as a reference for the details that most often go wrong:

* **REST auth is `Authorization: Token <key>`.** The [MCP server](/build-with-ai/meetstream-mcp-server) uses `Bearer`.
* **Terminals are two-layer.** Every ending arrives once as `event: "bot.stopped"`, and `bot_event` gives the reason: `bot.stopped`, `bot.kicked`, `bot.notallowed`, `bot.denied` or `bot.failed`. `bot.done` is the final event on every path.
* **Transcripts are fetched by `transcript_id`**, and segments carry `transcript`, not `text`.
* **`202` means not ready, `507` means an idempotent replay.** Every poll loop has a cap, and a replay counts as success.
* **Streaming-only providers produce no post-call transcript.** The live stream is the record, or re-transcribe the stored audio afterwards.
* **MIA bots take only `agent_config_id`.**

## Contribute a template

Have a use case the list is missing? Templates follow one layout (`README.md`, `.env.example`, `package.json`, `.gitignore`, `index.js`, `src/*.js`) and every endpoint they call is checked against the API before merge. Open a pull request on [MeetStream Labs](https://github.com/meetstream-ai/labs).