Vercel Open-Sources Chat SDK - One Codebase for Slack, Teams, Discord, and Four More Platforms
Vercel releases the Chat SDK, a TypeScript library installable via 'npm i chat' that lets developers write chatbot logic once and deploy to Slack, Microsoft Teams, Google Chat, Discord, GitHub, and Linear. MIT licensed, AI-provider agnostic, now in public beta.

Vercel shipped the Chat SDK on February 23 - a TypeScript library that claims to solve one of the most tedious problems in chatbot development: writing the same bot logic six times for six different platforms. Install it with npm i chat, write your handlers once, and deploy to Slack, Microsoft Teams, Google Chat, Discord, GitHub, and Linear from a single codebase. MIT licensed. Public beta.
The SDK is the work of Vercel CTO Malte Ubl, Hayden Bleasel, and Fernando Rojo, and it slots in alongside the Vercel AI SDK (ai) as a complementary product - the AI SDK handles model connectivity, the Chat SDK handles platform delivery.
TL;DR
npm i chat- TypeScript library for building bots that deploy to 6 platforms from one codebase- Adapter architecture: core logic + platform-specific adapters (Slack, Teams, Discord, Google Chat, GitHub, Linear)
- AI-provider agnostic via Vercel AI SDK integration - supports streaming to Slack natively, post+edit fallback on others
- JSX-based cross-platform UI components (Cards, Modals, Buttons) that render natively per platform
- MIT license, not tied to Vercel hosting, Redis-backed state management
How it works
The architecture is straightforward: a Chat class orchestrates platform adapters and routes events to handlers. You write event handlers (onNewMention, onReaction, onAction, onModalSubmit) once, and each adapter translates them into platform-native API calls.
import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createRedisState } from "@chat-adapter/state-redis";
const bot = new Chat({
userName: "mybot",
adapters: { slack: createSlackAdapter() },
state: createRedisState(),
});
bot.onNewMention(async (thread) => {
await thread.subscribe();
await thread.post("Hello from a unified bot.");
});
Add more adapters and the same handler fires on Teams, Discord, or any other supported platform. The adapters auto-detect credentials from environment variables (SLACK_BOT_TOKEN, DISCORD_TOKEN, etc.), so setup is mostly zero-config.
Platform capabilities are not equal
This is where it gets real. Not every platform supports every feature, and the SDK makes this explicit:
| Platform | Cards | Modals | Streaming | DMs | Reactions |
|---|---|---|---|---|---|
| Slack | Yes | Yes | Native | Yes | Yes |
| Microsoft Teams | Yes | No | Post+Edit | Yes | Read-only |
| Google Chat | Yes | No | Post+Edit | Yes | Yes |
| Discord | Yes | No | Post+Edit | Yes | Yes |
| GitHub | No | No | No | No | Yes |
| Linear | No | No | No | No | Yes |
Slack is the first-class citizen with native streaming, modals, and full card support. Teams, Google Chat, and Discord get cards and streaming via a post-then-edit-as-tokens-arrive pattern. GitHub and Linear are limited to text mentions and reactions - no rich UI, no streaming, no DMs.
JSX for cross-platform UI
The SDK uses a JSX runtime for rich message components:
<Card title="Build Status">
<Section>
<Field title="Branch">main</Field>
<Field title="Status">Passing</Field>
</Section>
<Actions>
<Button action="deploy">Deploy Now</Button>
<Button action="logs">View Logs</Button>
</Actions>
</Card>
This renders as a Block Kit layout in Slack, an Adaptive Card in Teams, a Google Chat card, or a Discord embed - each using the platform's native format. On GitHub and Linear, which lack card support, the SDK falls back to formatted text.
What It Does Not Tell You
The "chat" package name
Vercel now owns three of the most generic package names on npm: next, ai, and chat. The chat name has a 13-year history - it was originally registered in 2013 as a CRDT-based chat room library, then transferred to Fernando Rojo (now a Vercel employee) around 2020 for a React Native chat library. The version jumped from 1.0.8 to 3.0.0 to 4.14.0 as it transformed into the current Chat SDK. No public controversy yet, but squatting premium npm names through employee acquisitions is a pattern worth noting.
Maturity gap
The SDK is at version 4.14.0 with 362 commits and 244 releases, but only 67 GitHub stars at launch. By comparison, the Vercel AI SDK has over 20 million monthly npm downloads. The Chat SDK is brand new in production terms. The adapter coverage is uneven - Slack is polished, while GitHub and Linear feel like afterthoughts with no cards, no streaming, and no DMs.
Framework support is narrow
This is a Next.js-first tool. The reference implementation is a Next.js app, the webhook handlers use Next.js route handlers, and the serverless-ready architecture (Redis state, message deduplication) is designed for Vercel's deployment model. It runs on any Node.js 20+ environment in theory, but the developer experience outside the Vercel/Next.js ecosystem will require more manual wiring.
Competitors exist
Botpress offers a visual flow builder with broader platform support (Telegram, WhatsApp, SMS). Microsoft Bot Framework (which absorbed Botkit) has deep Teams integration and a mature ecosystem. The Chat SDK's differentiator is TypeScript ergonomics, JSX components, and first-class AI streaming integration - but it enters a space that is already served, not empty.
AI integration is the real pitch
The post() function accepts an AI SDK text stream directly. You call Claude, GPT, or Gemini through the Vercel AI SDK, pipe the streaming response into the Chat SDK, and it handles platform-specific delivery - native streaming on Slack, post+edit on others. The changelog demo specifically uses anthropic/claude-4.6-sonnet. This is not just a chatbot framework. It is an AI agent deployment layer for messaging platforms.
The Chat SDK solves a real pain point. Anyone who has built the same Slack bot, then rebuilt it for Teams, then again for Discord, knows the wasted effort. The adapter pattern is clean, the TypeScript types are thorough, and the JSX component model is genuinely clever. But it is a public beta with uneven platform support, a narrow framework focus, and the kind of aggressively generic npm name that tends to generate opinions. Ship it to Slack first. Add the other adapters when they catch up.
Sources:
