Skip to main content
The Tuteliq Slack bot monitors channels for grooming, bullying, and unsafe content in real time using the Tuteliq API. Add it to your workspace with one click or self-host on your own infrastructure.

Installation

Click the Add to Slack button above to install the bot into your workspace. No code required — configure everything with slash commands. The bot requests the following permissions:
ScopePurpose
channels:joinJoin public channels selected for monitoring
channels:historyRead messages in monitored public channels
channels:readList available channels
groups:historyRead messages in monitored private channels
groups:readList available private channels
chat:writePost safety alerts to the alert channel
im:historyRead direct messages (when opted in)
im:writeSend DM notifications to admins
commandsRegister slash commands
users:readResolve user display names in alerts

Self-host

git clone https://github.com/Tuteliq/slack.git
cd slack
npm install
cp .env.example .env
# Fill in your values (see Self-Hosting section below)
npm run build
npm start

Quick start

1

Install the bot

Click Add to Slack and authorize the bot in your workspace.
2

Configure your API key

Run /tuteliq setup — a modal dialog will open where you enter your Tuteliq API key (starts with tq_) and select the alert channel. The key is encrypted at rest with AES-256.
3

Select channels to monitor

Choose which channels to monitor during setup. Leave empty to monitor all channels.
4

Verify the setup

Run /tuteliq status to confirm the bot is active and view your current configuration.

How it works

Messages in monitored channels flow through a multi-stage pipeline:
  1. Crisis keywords — Messages containing crisis phrases (e.g. self-harm, exploitation) trigger an immediate API call for instant analysis.
  2. Grooming buffer — Messages are accumulated per channel. When the buffer has enough context from multiple senders, a conversation analysis is sent for grooming detection.
  3. Batch queue — All other messages are batched and sent to the Tuteliq API for efficient bullying and unsafe content detection.
  4. Alert — When a risk score exceeds your sensitivity threshold, an alert is posted to your configured alert channel with severity, risk score, message excerpt, and recommended action.
  5. Act — Admins take action directly from the alert using interactive buttons.

Slash commands

All commands live under the /tuteliq prefix and require workspace admin permissions.
CommandDescription
/tuteliq setupConfigure the bot with your Tuteliq API key via modal dialog
/tuteliq statusView current configuration, stats, and quota usage
/tuteliq sensitivity <level>Set detection sensitivity level
/tuteliq resetRemove all Tuteliq configuration from the workspace
/tuteliq helpDisplay the help message

Alert actions

When a threat is detected, the alert message includes interactive buttons:
ActionEffect
DeleteRemoves the flagged message from the channel
TimeoutRemoves the user from the channel
ReportShows the full incident report with rationale and context
DismissMarks the alert as reviewed without action

Sensitivity levels

LevelThresholdBest for
low70%+Minimal alerts, only clear violations
medium50%+Balanced — good default for most workspaces
high30%+Stricter monitoring, catches more subtle threats
maximum10%+Maximum protection — useful for testing or high-risk communities
Set the level with /tuteliq sensitivity <level>.

Self-hosting

Requirements

  • Node.js 20+
  • Slack app with Bot Token and Signing Secret
  • Tuteliq API key
  • Firebase project with Firestore enabled
  • Firebase service account key (JSON)

Environment variables

# Slack App
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_SIGNING_SECRET=your-signing-secret
SLACK_APP_TOKEN=xapp-your-app-token         # Optional, for Socket Mode
SLACK_SOCKET_MODE=false                       # Set to true for Socket Mode

# Tuteliq API
TUTELIQ_API_URL=https://api.tuteliq.ai

# Encryption (generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
ENCRYPTION_KEY=your-64-hex-char-encryption-key

# Firebase
GOOGLE_APPLICATION_CREDENTIALS=./service-account.json

# Server
PORT=8080
NODE_ENV=production
LOG_LEVEL=info

Docker

docker compose up -d

Cloud Run

gcloud builds submit --config=slack/cloudbuild.yaml .
Cloud Run deployment uses 512 MiB memory, 1 CPU, and keeps 1 minimum instance running for low-latency responses.

Health check

The bot exposes a health endpoint at GET /health on the configured port (default 8080). It returns 200 with { "status": "ok" } when the bot is running.

Next steps