A Slack bot built with slack-edge running on Cloudflare Workers for Team 1317 Digital Fusion. Features a full web dashboard for managing meetings, RSVPs, team members, and syncing with existing TeamSnap rosters.
You can either:
Option A: Use the App Manifest (Recommended)
- Go to Slack API and click "Create New App"
- Choose "From an app manifest"
- Select your workspace
- Copy the contents of
manifest.yamland paste it - The manifest is already configured to use
https://turnout.bore.dunkirk.sh/slack - Create the app
Option B: Manual Setup
- Go to Slack API and create a new app
- Under "OAuth & Permissions", add these bot token scopes:
chat:write.publicchannels:joinchannels:readchat:writecommandsusergroups:readusergroups:writeusers:read
- Add these user token scopes:
usergroups:readusergroups:writeusers.profile:readusers.profile:writeusers:read
Create a .dev.vars file for local development:
cp .dev.vars.example .dev.vars
# Edit .dev.vars with your actual valuesFor production deployment, set secrets using Wrangler:
# Set your Slack signing secret (required)
bun wrangler secret put SLACK_SIGNING_SECRET
# Set your bot token (optional but recommended)
bun wrangler secret put SLACK_BOT_TOKENAdd slash commands in your Slack app:
-
Command:
/meetings -
Request URL:
https://turnout.bore.dunkirk.sh/slack -
Description: "Manage meetings (admin only)"
-
Command:
/setrole -
Request URL:
https://turnout.bore.dunkirk.sh/slack -
Description: "Set a user's role (admin only)"
-
Usage hint:
[@user] [student|parent|alumni|mentor] -
Command:
/cdt -
Request URL:
https://turnout.bore.dunkirk.sh/slack -
Description: "Manage Component Design Teams (admin only)"
Enable event subscriptions:
- Request URL:
https://turnout.bore.dunkirk.sh/slack - Subscribe to bot events:
app_mentionmessage.im
Enable interactive components:
- Request URL:
https://turnout.bore.dunkirk.sh/slack
Install dependencies:
bun installStart local development server:
bun devDeploy to Cloudflare Workers:
bun deployTurnout can be deployed by any FRC team using Cloudflare Workers.
- Create a Cloudflare account
- Initialize a D1 database:
bunx wrangler d1 create turnout - Update
wrangler.jsoncwith your new database ID - Apply the schema:
bunx wrangler d1 execute turnout --local --file=schema.sqlandbunx wrangler d1 execute turnout --remote --file=schema.sql - Configure your Slack App following the setup steps above
- Add your secrets:
bunx wrangler secret put SLACK_SIGNING_SECRET
bunx wrangler secret put SLACK_BOT_TOKEN- Since custom profile fields (like Role and CDT) have unique IDs per workspace, you need to configure these for your team. Find the field IDs by calling
users.profile.getfor a user and inspecting the keys underprofile.fields(they look likeXf040HCJKNJZ). - Add these to your environment variables:
bunx wrangler secret put SLACK_PROFILE_FIELD_CDT
bunx wrangler secret put SLACK_PROFILE_FIELD_ROLE- Deploy:
bun run deploy
├── src/
│ ├── index.ts # Main worker code with Slack bot logic
│ └── features/ # Modular feature implementations
│ ├── index.ts # Feature exports
│ ├── hello.ts # Hello command feature
│ └── attendance.ts # Attendance tracking feature
├── wrangler.jsonc # Cloudflare Workers configuration
├── manifest.yaml # Slack app configuration manifest
├── .dev.vars.example # Example environment variables
└── package.json # Dependencies and scripts
- Install the bot in your Slack workspace
- Sync the bot via the web dashboard admin panel
- Use the slash commands:
/meetings- Open meeting management modal/setrole [@user] [student|parent|alumni|mentor]- Assign roles to members/cdt- Manage CDT assignments
- Cloudflare Workers - Serverless compute platform
- slack-edge - Slack bot framework for edge computing
- Bun - JavaScript runtime and package manager
© 2026-present Team 1317 Digital Fusion
