# Build custom Slack runtimes

**Published:** June 2, 2026 | **Authors:** Josh Singh, Ben Sabic

---

Chat SDK now ships the [Slack adapter](https://chat-sdk.dev/adapters/official/slack)'s primitives as standalone imports for apps that already handle their own routing, state, or workflow execution.

Use only what you need:

- Request verification and payload parsing (`@chat-adapter/slack/webhook`)
- Markdown formatting (`@chat-adapter/slack/format`)
- Fetch-based Web API calls (`@chat-adapter/slack/api`)
- Block Kit conversion (`@chat-adapter/slack/blocks`)

Each subpath skips the full `Chat` runtime, so your imports stay clean.

**lib/bot.ts**
```typescript
import { readSlackWebhook } from "@chat-adapter/slack/webhook";
import { postSlackMessage } from "@chat-adapter/slack/api";
export async function POST(request: Request) {
  const payload = await readSlackWebhook(request, {
    signingSecret: process.env.SLACK_SIGNING_SECRET!,
  });
  if (payload.kind === "app_mention") {
    await postSlackMessage({
      channel: payload.continuation.channelId,
      markdownText: `received: ${payload.text}`,
      token: process.env.SLACK_BOT_TOKEN!,
    });
  }
  return new Response(null, { status: 200 });
}
```

To get started, read the [Slack primitives](https://chat-sdk.dev/docs/slack-primitives) documentation.

**The Complete Guide to Chat SDK**
Learn how Chat SDK works end-to-end: from core concepts to building your first chatbot to deploying it across platforms.
[Read the guide](https://vercel.com/kb/guide/the-complete-guide-to-chat-sdk)

---

📚 **More updates:** [View all changelog entries](/changelog/sitemap.md) | [Blog](/blog/sitemap.md)