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/apps → Create New App → From 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 These variable names are referenced by
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
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
Expert IDs
With the Slack transport, each expert’sid 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 themute / 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.