devICT bot #
Our humble slack bot, with whatever functionality (useful or not) we decide to throw in here.
Set up as a simple slack app webhook receiver.
Tech Stack #
- TypeScript and Node with native TypeScript support
- Fastify and JSON schemas for request validation
- json-schema-to-ts for typed requed payloads
- Official Slack Web API client
Observability #
Traces are exported via OTLP when OTEL_EXPORTER_OTLP_ENDPOINT is set; OTEL_SERVICE_NAME sets the service name. Unset endpoint disables instrumentation (local dev). Traces only — logs are collected from the docker process by alloy.
Testing #
Test at the request level, mocking / intercepting HTTP requests made.
Slack invite approval flow #
The Google Form invite request posts to POST /invites/slack/request:
Authorization: Bearer $SLACK_INVITE_WEBHOOK_TOKEN
{ "name": "Jane Doe", "email": "jane@example.com", "reason": "community" }
The bot posts the request to the private $SLACK_INVITE_CHANNEL (members of
which are the only people allowed to invite). Approve by replying
@bot !invite in the request's thread — the bot looks up the email from the
parent message and sends the Slack invite, then replies in-thread with the
result.
!invite only works in the invite channel and must be in a thread.