Skip to content
Eight Effect-native API SDKs are live.Explore the catalog
Distilled
Esc
navigateopen⌘Jpreview
On this page

Announcing the Distilled Slack SDK

Send messages and automate Slack workspaces with an Effect-native client generated from Slack's maintained TypeScript SDK.

Slack is often the human edge of an automation: the place a deployment reports back, an incident asks for attention, or a workflow becomes interactive. @kevinmichaelchen/distilled-slack exposes Slack’s Web API as traced, typed Effect operations.

Slack, at a glance

Slack is a collaboration platform with APIs for apps and workflow automation. The Web API queries information from a workspace and enacts changes through HTTP methods such as conversations.list and chat.postMessage. Slack maintains its current Node implementation in slackapi/node-slack-sdk.

Why Effect and Distilled?

A notification is easy; a dependable notification pipeline is not. It needs redacted tokens, typed Slack failures, rate-limit handling, structured retries, tracing, and testable client substitution. Effect gives those concerns one composable model, while Distilled turns every generated method into an operation whose requirements and errors are present in its type.

The SDK retains Slack’s official request and response types, so it stays familiar to users of @slack/web-api while gaining Effect-native orchestration.

How we made the SDK

Slack is the instructive exception in the collection. Its old OpenAPI repository is archived, but its official TypeScript SDK is active and authoritative.

Choose the maintained source

Following Alchemy’s non-OpenAPI strategy, the SDK pins slackapi/node-slack-sdk directly instead of generating from an abandoned schema.

Inspect the method table

A small TypeScript AST generator reads Slack’s official Web API method definitions and emits 268 Effect operations.

Preserve upstream types

Inputs and outputs import Slack’s own public TypeScript types; no parallel model layer is fabricated.

Add the Effect boundary

Handwritten layers own token redaction, client construction, mapped Slack errors, and tracing spans.

Code Examples

Set SLACK_TOKEN, then install:

npm install @kevinmichaelchen/distilled-slack effect
pnpm add @kevinmichaelchen/distilled-slack effect
bun add @kevinmichaelchen/distilled-slack effect
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import {
  CredentialsFromEnv,
  SlackClientLive,
  chatPostMessage,
  conversationsHistory,
  usersInfo,
} from "@kevinmichaelchen/distilled-slack";

const SlackLive = SlackClientLive.pipe(Layer.provide(CredentialsFromEnv));

Send a channel message

Post a release, incident, or workflow notification to a known channel.

const sendAnnouncement = chatPostMessage({
  channel: "C01234567",
  text: "distilled-slack is live :tada:",
}).pipe(Effect.provide(SlackLive));

Read recent channel history

Fetch the latest conversation context for a digest, support workflow, or bot.

const readRecentHistory = conversationsHistory({
  channel: "C01234567",
  limit: 50,
  inclusive: true,
}).pipe(Effect.provide(SlackLive));

Look up a user

Resolve a Slack user ID before routing a notification or enriching an audit record.

const lookUpUser = usersInfo({
  user: "U01234567",
  include_locale: true,
}).pipe(Effect.provide(SlackLive));

Each operation carries a Slack.<method> tracing span, making multi-step workspace automation visible without wrapping every call manually.

Available now

Read the Slack SDK guide, inspect the implementation and pinned upstream source, or install @kevinmichaelchen/distilled-slack.

Last updated on July 15, 2026

Was this page helpful?