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

Overview

Platform-specific adapters for Slack, Teams, Google Chat, Discord, 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 ChatDiscordGitHubLinear
Post message
Edit message
Delete message
File uploads
Streaming✅ Native⚠️ Post+Edit⚠️ Post+Edit⚠️ Post+Edit

Rich content

FeatureSlackTeamsGoogle ChatDiscordGitHubLinear
Card formatBlock KitAdaptive CardsGoogle Chat CardsEmbedsGFM MarkdownMarkdown
Buttons
Link buttons
Select menus
Fields
Images in cards
Modals

Conversations

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

Message history

FeatureSlackTeamsGoogle ChatDiscordGitHubLinear
Fetch messages
Fetch single message
Fetch thread info
Fetch channel messages
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
GitHub@chat-adapter/github
Linear@chat-adapter/linear

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.