Skip to main content
The Slack transport is how ShoulderTap reaches real experts in production. It sends each ask as a direct message from a Slack app you install, and captures the expert’s reply through the Events API. The console transport is enough for local testing; switch to Slack when you’re ready to ask real people.
ShoulderTap only ever DMs experts directly. It does not read channels, post in channels, or index message history — it sends one well-formed DM per ask and listens for the reply in that DM thread.

Set up the Slack app

1

Create the app from the manifest

Go to api.slack.com/appsCreate New AppFrom an app manifest, and paste in the slack/manifest.yaml shipped in the repository. The manifest requests exactly the scopes ShoulderTap needs: chat:write, im:history, im:write, and users:read, plus the message.im event.
2

Copy the credentials into .env

From the app’s settings, copy the Bot User OAuth Token into SLACK_BOT_TOKEN and the Signing Secret into SLACK_SIGNING_SECRET in your .env file (copied from .env.example). .env is gitignored and never committed.
.env
These variable names are referenced by slack.bot_token_env and slack.signing_secret_env in shouldertap.yaml.
3

Point Event Subscriptions at your server

In the app’s Event Subscriptions, set the request URL to your server’s Slack endpoint:
Slack signs these requests itself, so this route is exempt from bearer-token auth. Your server must be reachable from Slack (use a tunnel like ngrok for local development).
4

Run with the Slack transport

ShoulderTap now DMs experts through Slack instead of printing to the terminal.

Expert IDs

With the Slack transport, each expert’s id in shouldertap.yaml must be their Slack user ID (for example U0123ABC), since that’s the channel ShoulderTap DMs. This is the same registry described in Experts and routing — only the meaning of id becomes concrete.

What experts see

The expert receives a direct message with the full safety-promise structure: self-identification, why it’s being asked, the question, effort framing, the attribution promise, and the mute / skip opt-outs. They reply in the DM thread; ShoulderTap captures that reply, structures it into a proposal, and sends it to the approval queue. Replies that aren’t in a direct-message thread, messages from bots, and message edits are ignored — only a human’s direct reply is captured.