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.
Official Web API docs
Method reference
Official Node SDK
Distilled repository
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
slackapi/node-slack-sdk directly instead of generating from an abandoned schema.Inspect the method table
Preserve upstream types
Add the Effect boundary
Code Examples
Set SLACK_TOKEN, then install:
npm install @kevinmichaelchen/distilled-slack effectpnpm add @kevinmichaelchen/distilled-slack effectbun add @kevinmichaelchen/distilled-slack effectimport * 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.