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.
How to set up
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.
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.
The repository's manifest.json declares the scopes, events, interactivity, and /relay command. The Slack CLI is the shortest repeatable route:
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.
connections:write scope. Relay needs both the xoxb-… bot token and xapp-… app token.Copy the example environment file and add the two Slack tokens. Keep the editor API disabled for the first Slack-only test.
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.
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.
| Command | What it does |
|---|---|
/relay setup | Open the setup card with channel, sheet, and permission controls. |
/relay pair #client #team | Create a pairing without the form. |
/relay control #channel | Announce configuration changes in one shared place. |
/relay admins | Show who can configure Relay and where. |
Post “the export button is broken” in #test-client. Confirm that Relay adds an eyes reaction and creates a card in #test-eng.
!start, then !ask which browser? in the card thread.!done fixed the export and confirm both sides close cleanly.# validate granted Slack scopes and live config npm run doctor # run the local smoke suites npm test
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.
# 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
/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?
Scopes, troubleshooting, editor integration, API tokens, Google Sheets, backups, and outage behavior are documented beside the code.