Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
8bde88a
Initial marketplace draft
haydenbleasel Mar 1, 2026
3110173
Update language
haydenbleasel Mar 1, 2026
31db8ac
Add logos to cards
haydenbleasel Mar 1, 2026
ac51c74
Redesign cards
haydenbleasel Mar 1, 2026
09d3344
Update adapter-card.tsx
haydenbleasel Mar 1, 2026
abb5d34
Update adapter-card.tsx
haydenbleasel Mar 1, 2026
e0e7062
Migrate marketplace to adapters
haydenbleasel Mar 2, 2026
791ff97
Update meta.json
haydenbleasel Mar 2, 2026
770092d
Split adapters into new three groups
haydenbleasel Mar 2, 2026
3cf58c3
Add iMessage
haydenbleasel Mar 2, 2026
630ee94
Move adapter docs to READMEs
haydenbleasel Mar 2, 2026
117f7a7
Cleanup docs
haydenbleasel Mar 2, 2026
17dbbf7
Add more logos, implement shadcn ui components
haydenbleasel Mar 2, 2026
7db943e
Update adapters.json
haydenbleasel Mar 2, 2026
23c43a0
Add Streamdown
haydenbleasel Mar 2, 2026
7ffb788
Fetch vercel readmes from workspace
haydenbleasel Mar 2, 2026
cbe7cc7
Update readme-content.tsx
haydenbleasel Mar 2, 2026
976f5e6
Upgrade Streamdown
haydenbleasel Mar 2, 2026
92b6512
Update global.css
haydenbleasel Mar 2, 2026
1bf054d
Update adapters.json
haydenbleasel Mar 2, 2026
2a15d74
Update adapters.json
haydenbleasel Mar 2, 2026
ee8d4e3
Add links to docs
haydenbleasel Mar 2, 2026
3e67473
List upcoming official adapters
haydenbleasel Mar 2, 2026
cb859ab
Update adapters.json
haydenbleasel Mar 2, 2026
3442a53
Fix adapters links
haydenbleasel Mar 2, 2026
fa313e5
Fix typo
haydenbleasel Mar 3, 2026
7c5d757
Misc fixes
haydenbleasel Mar 3, 2026
a25f5bb
Update adapters.json
haydenbleasel Mar 3, 2026
8dabe09
Update adapters.json
haydenbleasel Mar 4, 2026
02a1b00
Migrate new info
haydenbleasel Mar 4, 2026
683bc76
Update pnpm-lock.yaml
haydenbleasel Mar 4, 2026
aa00f29
Update adapter-card.tsx
haydenbleasel Mar 4, 2026
624363c
Add postgres to adapters page
haydenbleasel Mar 8, 2026
2396aa0
Update adapter-card.tsx
haydenbleasel Mar 8, 2026
3709a9a
Migrate postgres docs
haydenbleasel Mar 8, 2026
2b79cef
Add pg to valid README imports
haydenbleasel Mar 8, 2026
ccca005
Move feature matrices from docs to package READMEs
haydenbleasel Mar 8, 2026
bb000f7
Remove packages tables from adapter/state docs
haydenbleasel Mar 8, 2026
f8e1f2c
Genericize adapter/state doc descriptions
haydenbleasel Mar 8, 2026
cfbaa17
fix: improve adapters page accessibility and empty state handling
bensabic Mar 9, 2026
2ab40cb
Add custom adapter building section to SKILL.md
bensabic Mar 9, 2026
cf1dfa2
Use currentColor for GitHub, Linear, and Memory icons
bensabic Mar 9, 2026
c505369
Use GitHub API for README fetch, add heading to fallback state
bensabic Mar 9, 2026
0ea29fa
Update adapters-grid.tsx
haydenbleasel Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,13 @@ See the [Getting Started guide](https://chat-sdk.dev/docs/getting-started) for a
| Package | Description |
|---------|-------------|
| `chat` | Core SDK with `Chat` class, types, JSX runtime, and utilities |
| `@chat-adapter/slack` | [Slack adapter](https://chat-sdk.dev/docs/adapters/slack) |
| `@chat-adapter/teams` | [Teams adapter](https://chat-sdk.dev/docs/adapters/teams) |
| `@chat-adapter/gchat` | [Google Chat adapter](https://chat-sdk.dev/docs/adapters/gchat) |
| `@chat-adapter/discord` | [Discord adapter](https://chat-sdk.dev/docs/adapters/discord) |
| `@chat-adapter/telegram` | [Telegram adapter](https://chat-sdk.dev/docs/adapters/telegram) |
| `@chat-adapter/github` | [GitHub adapter](https://chat-sdk.dev/docs/adapters/github) |
| `@chat-adapter/linear` | [Linear adapter](https://chat-sdk.dev/docs/adapters/linear) |
| `@chat-adapter/slack` | [Slack adapter](https://chat-sdk.dev/adapters/slack) |
| `@chat-adapter/teams` | [Teams adapter](https://chat-sdk.dev/adapters/teams) |
| `@chat-adapter/gchat` | [Google Chat adapter](https://chat-sdk.dev/adapters/gchat) |
| `@chat-adapter/discord` | [Discord adapter](https://chat-sdk.dev/adapters/discord) |
| `@chat-adapter/telegram` | [Telegram adapter](https://chat-sdk.dev/adapters/telegram) |
| `@chat-adapter/github` | [GitHub adapter](https://chat-sdk.dev/adapters/github) |
| `@chat-adapter/linear` | [Linear adapter](https://chat-sdk.dev/adapters/linear) |
| `@chat-adapter/state-redis` | [Redis state adapter](https://chat-sdk.dev/docs/state/redis) (production) |
| `@chat-adapter/state-ioredis` | [ioredis state adapter](https://chat-sdk.dev/docs/state/ioredis) (alternative) |
| `@chat-adapter/state-pg` | [PostgreSQL state adapter](https://chat-sdk.dev/docs/state/postgres) (production) |
Expand Down
221 changes: 221 additions & 0 deletions apps/docs/adapters.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
[
{
"name": "Slack",
"slug": "slack",
"type": "platform",
"description": "Build bots for Slack workspaces with full support for threads, reactions, and interactive messages.",
"packageName": "@chat-adapter/slack",
"icon": "slack",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-slack"
},
{
"name": "Microsoft Teams",
"slug": "teams",
"type": "platform",
"description": "Deploy bots to Microsoft Teams with adaptive cards, mentions, and conversation threading.",
"packageName": "@chat-adapter/teams",
"icon": "teams",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-teams"
},
{
"name": "Google Chat",
"slug": "google-chat",
"type": "platform",
"description": "Integrate with Google Chat spaces for team collaboration and automated workflows.",
"packageName": "@chat-adapter/gchat",
"icon": "google-chat",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-gchat"
},
{
"name": "Discord",
"slug": "discord",
"type": "platform",
"description": "Create Discord bots with slash commands, threads, and rich embeds.",
"packageName": "@chat-adapter/discord",
"icon": "discord",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-discord"
},
{
"name": "GitHub",
"slug": "github",
"type": "platform",
"description": "Build bots that respond to pull request and issue comment threads.",
"packageName": "@chat-adapter/github",
"icon": "github",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-github"
},
{
"name": "Linear",
"slug": "linear",
"type": "platform",
"description": "Automate Linear issue comment threads with bot responses and workflows.",
"packageName": "@chat-adapter/linear",
"icon": "linear",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-linear"
},
{
"name": "Telegram",
"slug": "telegram",
"type": "platform",
"description": "Connect to Telegram with support for groups, channels, and inline keyboards.",
"packageName": "@chat-adapter/telegram",
"icon": "telegram",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/adapter-telegram"
},
{
"name": "Redis",
"slug": "redis",
"type": "state",
"description": "Production-ready state adapter using Redis for persistence and distributed locking.",
"packageName": "@chat-adapter/state-redis",
"icon": "redis",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/state-redis"
},
{
"name": "ioredis",
"slug": "ioredis",
"type": "state",
"description": "Redis state adapter using ioredis with cluster and sentinel support.",
"packageName": "@chat-adapter/state-ioredis",
"icon": "ioredis",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/state-ioredis"
},
{
"name": "PostgreSQL",
"slug": "postgres",
"type": "state",
"description": "Production state adapter using PostgreSQL for persistence and distributed locking.",
"packageName": "@chat-adapter/state-pg",
"icon": "postgres",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/state-pg"
},
{
"name": "Memory",
"slug": "memory",
"type": "state",
"description": "In-memory state adapter for development and testing environments.",
"packageName": "@chat-adapter/state-memory",
"icon": "memory",
"beta": true,
"readme": "https://github.com/vercel/chat/tree/main/packages/state-memory"
},
{
"name": "Cloudflare Durable Objects",
"slug": "cloudflare-do",
"type": "state",
"community": true,
"description": "Cloudflare Durable Objects state adapter with SQLite-backed persistence, distributed locking, and caching.",
"packageName": "chat-state-cloudflare-do",
"author": "dcartertwo",
"readme": "https://github.com/dcartertwo/chat-state-cloudflare-do"
},
{
"name": "Beeper Matrix",
"slug": "matrix",
"type": "platform",
"community": true,
"description": "Matrix adapter for Chat SDK, built and maintained by Beeper.",
"packageName": "@beeper/chat-adapter-matrix",
"author": "Beeper",
"readme": "https://github.com/beeper/chat-adapter-matrix",
"vendorOfficial": true
},
{
"name": "Photon iMessage",
"slug": "imessage",
"type": "platform",
"community": true,
"description": "iMessage adapter for Chat SDK. Supports both local (on-device) and Photon iMessage integration.",
"packageName": "chat-adapter-imessage",
"author": "Photon",
"readme": "https://github.com/photon-hq/vercel-chat-adapter-imessage",
"vendorOfficial": true
},
{
"name": "Webex",
"slug": "webex",
"type": "platform",
"community": true,
"description": "Community Webex adapter for Chat SDK with support for spaces, threads, and adaptive cards.",
"packageName": "@bitbasti/chat-adapter-webex",
"author": "SebastianBodza",
"readme": "https://github.com/SebastianBodza/chat-adapter-webex"
},
{
"name": "Resend",
"slug": "resend",
"type": "platform",
"community": true,
"description": "Bidirectional email adapter for Chat SDK with threading, rich HTML emails, and attachment support via Resend.",
"packageName": "@resend/chat-sdk-adapter",
"author": "Resend",
"readme": "https://github.com/resend/resend-chat-sdk",
"vendorOfficial": true
},
{
"name": "Baileys WhatsApp",
"slug": "baileys",
"type": "platform",
"community": true,
"description": "Chat SDK adapter for Baileys (Unofficial WhatsApp API).",
"packageName": "chat-adapter-baileys",
"author": "rama-adi",
"readme": "https://github.com/rama-adi/chat-adapter-baileys"
},
{
"name": "WhatsApp",
"slug": "whatsapp",
"type": "platform",
"icon": "whatsapp",
"description": "Connect to WhatsApp Business for customer messaging and automated conversations.",
"comingSoon": true,
"prs": [
"https://github.com/vercel/chat/pull/102",
"https://github.com/vercel/chat/pull/104"
]
},
{
"name": "Instagram",
"slug": "instagram",
"type": "platform",
"icon": "instagram",
"description": "Build bots for Instagram direct messages and automated customer interactions.",
"comingSoon": true
},
{
"name": "Signal",
"slug": "signal",
"type": "platform",
"icon": "signal",
"description": "Integrate with Signal for private, encrypted bot messaging.",
"comingSoon": true,
"prs": ["https://github.com/vercel/chat/pull/169"]
},
{
"name": "X",
"slug": "x",
"type": "platform",
"icon": "x",
"description": "Build bots for X direct messages and automated interactions.",
"comingSoon": true
},
{
"name": "Messenger",
"slug": "messenger",
"type": "platform",
"icon": "messenger",
"description": "Build bots for Facebook Messenger with rich messages and automated customer interactions.",
"comingSoon": true,
"prs": ["https://github.com/vercel/chat/pull/156"]
}
]
111 changes: 111 additions & 0 deletions apps/docs/app/[lang]/(home)/adapters/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import { SiGithub } from "@icons-pack/react-simple-icons";
import type { Metadata } from "next";
import { notFound } from "next/navigation";
import adapters from "@/adapters.json";
import { ReadmeContent } from "../components/readme-content";

const LOCAL_PACKAGE_PATTERN = /github\.com\/vercel\/chat\/tree\/[^/]+\/(.+)/;
const GITHUB_REPO_PATTERN = /github\.com\/([^/]+)\/([^/]+)/;

const getAdapter = (slug: string) => adapters.find((a) => a.slug === slug);

const getReadme = async (repoUrl: string): Promise<string | undefined> => {
const localMatch = repoUrl.match(LOCAL_PACKAGE_PATTERN);
if (localMatch) {
const [, pkgPath] = localMatch;
const filePath = join(process.cwd(), "..", "..", pkgPath, "README.md");
try {
return await readFile(filePath, "utf-8");
} catch {
return undefined;
}
}

const repoMatch = repoUrl.match(GITHUB_REPO_PATTERN);
if (repoMatch) {
const [, owner, repo] = repoMatch;
const url = `https://api.github.com/repos/${owner}/${repo}/readme`;
const response = await fetch(url, {
headers: { Accept: "application/vnd.github.raw+json" },
next: { revalidate: 3600 },
});
if (response.ok) {
return response.text();
}
}

return undefined;
};

const AdapterPage = async ({
params,
}: PageProps<"/[lang]/adapters/[slug]">) => {
const { slug } = await params;
const adapter = getAdapter(slug);

if (!adapter?.readme) {
notFound();
}

const readme = await getReadme(adapter.readme);

return (
<div className="container mx-auto max-w-3xl">
{readme ? (
<article className="relative max-w-none px-4 py-16">
<a
aria-label="View on GitHub"
className="absolute top-18 right-4"
href={adapter.readme}
rel="noopener noreferrer"
target="_blank"
>
<SiGithub className="size-6" />
</a>
<ReadmeContent>{readme}</ReadmeContent>
</article>
) : (
<div className="px-4 py-16">
<h1 className="mb-4 font-bold text-2xl">{adapter.name}</h1>
<p className="text-muted-foreground">
README not available. Visit the{" "}
<a
className="text-primary underline"
href={adapter.readme}
rel="noopener noreferrer"
target="_blank"
>
GitHub repository
</a>{" "}
for documentation.
</p>
</div>
)}
</div>
);
};

export const generateStaticParams = () =>
adapters
.filter((adapter) => "readme" in adapter)
.map((adapter) => ({ slug: adapter.slug }));

export const generateMetadata = async ({
params,
}: PageProps<"/[lang]/adapters/[slug]">): Promise<Metadata> => {
const { slug } = await params;
const adapter = getAdapter(slug);

if (!adapter) {
return {};
}

return {
title: adapter.name,
description: adapter.description,
};
};

export default AdapterPage;
Loading