How to set up

From clone to first handoff.

Start in a throwaway Slack workspace or with two test channels. Relay reacts and posts immediately, so prove the loop before inviting it into a client conversation.

00

Before you start

You need Node.js 20 or newer and permission to install an app in your Slack workspace. Create two safe test channels such as #test-client and #test-eng.

Keep the first test private. Relay adds a seen reaction to incoming requests and writes status updates back into the client thread. Do not discover that behavior in front of a customer.
01

Create the Slack app

The repository's manifest.json declares the scopes, events, interactivity, and /relay command. The Slack CLI is the shortest repeatable route:

Terminal
git clone https://github.com/Kurama07a/relay.git
cd relay
npm install

slack login
slack install

You can also create an app “from a manifest” at api.slack.com/apps and paste manifest.json.

If you use the web dashboard, copy the bot token from OAuth & Permissions, then create an app-level token with the connections:write scope. Relay needs both the xoxb-… bot token and xapp-… app token.
02

Configure and start Relay

Copy the example environment file and add the two Slack tokens. Keep the editor API disabled for the first Slack-only test.

.env + terminal
cp .env.example .env

# edit .env
SLACK_BOT_TOKEN=xoxb-your-token
SLACK_APP_TOKEN=xapp-your-token
API_ENABLED=false

# start the socket connection
npm run dev

Invite Relay to every channel you plan to pair. In Slack, open each channel and use /invite @Relay.

03

Pair the client and team channels

Run /relay setup in Slack. Choose Add pairing, select the test client channel and engineering channel, then save.

Relay validates membership and rejects routes that would loop or double-post. Each client channel can route to its own team channel, or several clients can share one engineering channel.

CommandWhat it does
/relay setupOpen the setup card with channel, sheet, and permission controls.
/relay pair #client #teamCreate a pairing without the form.
/relay control #channelAnnounce configuration changes in one shared place.
/relay adminsShow who can configure Relay and where.
04

Verify the complete loop

Post “the export button is broken” in #test-client. Confirm that Relay adds an eyes reaction and creates a card in #test-eng.

  1. React with ✋ on the team card and confirm the client hears who picked it up.
  2. Run !start, then !ask which browser? in the card thread.
  3. Reply in the client thread and confirm the answer returns to the team thread.
  4. Run !done fixed the export and confirm both sides close cleanly.
Checks
# validate granted Slack scopes and live config
npm run doctor

# run the local smoke suites
npm test
05

Host the Relay bot on Coolify

Coolify runs the long-lived bot process. The static product website in website/ is separate and is not part of this deployment.

Relay uses an outbound Slack Socket Mode connection, so the bot needs no public domain. It does need exactly one instance and a persistent volume mounted at /data.

Coolify API helper
# add Coolify credentials and target ids to .env
COOLIFY_URL=https://coolify.example.com
COOLIFY_TOKEN=your-write-token
COOLIFY_SERVER_UUID=...
COOLIFY_PROJECT_UUID=...
COOLIFY_ENVIRONMENT=production

# inspect, create, configure, deploy
npm run coolify probe
npm run coolify create
# add the printed COOLIFY_APP_UUID to .env
npm run coolify env
npm run coolify deploy
npm run coolify status
Do not deploy before adding storage. In the Coolify resource, add persistent storage at /data. The database is the live mapping between every client message and engineering card; losing it breaks existing threads.

Set SLACK_BOT_TOKEN and SLACK_APP_TOKEN in the local .env before running npm run coolify env. The helper sends values without printing them. Keep replicas at one and leave the API port unexposed unless you have deliberately configured remote CLI authentication.

Need the exact edge cases?

The repository docs go all the way down.

Scopes, troubleshooting, editor integration, API tokens, Google Sheets, backups, and outage behavior are documented beside the code.