Looking for the chatbot template? It's now here.

Overview

Platform-specific adapters for Slack, Teams, Google Chat, Discord, Telegram, GitHub, and Linear.

Adapters handle webhook verification, message parsing, and API calls for each platform. Install only the adapters you need.

Feature matrix

Messaging

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinear
Post message
Edit message
Delete message
File uploads⚠️ Single file
Streaming✅ Native⚠️ Post+Edit⚠️ Post+Edit⚠️ Post+Edit⚠️ Post+Edit

Rich content

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinear
Card formatBlock KitAdaptive CardsGoogle Chat CardsEmbedsMarkdown + inline keyboard buttonsGFM MarkdownMarkdown
Buttons⚠️ Inline keyboard callbacks
Link buttons⚠️ Inline keyboard URLs
Select menus
Fields
Images in cards
Modals

Conversations

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinear
Mentions
Add reactions
Remove reactions⚠️⚠️
Typing indicator
DMs
Ephemeral messages✅ Native✅ Native

Message history

FeatureSlackTeamsGoogle ChatDiscordTelegramGitHubLinear
Fetch messages⚠️ Cached
Fetch single message⚠️ Cached
Fetch thread info
Fetch channel messages⚠️ Cached
List threads
Fetch channel info
Post channel message

⚠️ indicates partial support — the feature works with limitations. See individual adapter pages for details.

Packages

PlatformPackage
Slack@chat-adapter/slack
Microsoft Teams@chat-adapter/teams
Google Chat@chat-adapter/gchat
Discord@chat-adapter/discord
Telegram@chat-adapter/telegram
GitHub@chat-adapter/github
Linear@chat-adapter/linear

Community adapters

Beyond the Vercel-maintained adapters listed above, you can build adapters for any messaging platform. Community adapters use the same Adapter interface and get full access to Chat SDK features like cards, actions, streaming, and state management.

TierDescription
Vercel-maintainedPublished under @chat-adapter/* by Vercel
Community officialBuilt and maintained by the platform company itself (e.g., Resend building a Resend adapter)
CommunityBuilt by third-party developers

Community adapters are expected to meet the same testing bar as first-party adapters — unit tests for all public methods, integration tests for end-to-end message flows.

Ready to build one? Follow the building guide.

How adapters work

Each adapter implements a standard interface that the Chat class uses to route events and send messages. When a webhook arrives:

  1. The adapter verifies the request signature
  2. Parses the platform-specific payload into a normalized Message
  3. Routes to your handlers via the Chat class
  4. Converts outgoing messages from markdown/AST/cards to the platform's native format

Using multiple adapters

Register multiple adapters and your event handlers work across all of them:

lib/bot.ts
import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createTeamsAdapter } from "@chat-adapter/teams";
import { createGoogleChatAdapter } from "@chat-adapter/gchat";
import { createRedisState } from "@chat-adapter/state-redis";

const bot = new Chat({
  userName: "mybot",
  adapters: {
    slack: createSlackAdapter(),
    teams: createTeamsAdapter(),
    gchat: createGoogleChatAdapter(),
  },
  state: createRedisState(),
});

// This handler fires for mentions on any platform
bot.onNewMention(async (thread) => {
  await thread.subscribe();
  await thread.post("Hello!");
});

Each adapter auto-detects credentials from environment variables, so you only need to pass config when overriding defaults.

Each adapter creates a webhook handler accessible via bot.webhooks.slack, bot.webhooks.teams, etc.