A reliable Slack bot for automated daily standup prompts and PTO/out-of-office announcements.
- Daily Standup Prompts - Schedule recurring standup reminders at specific times
- Interactive Submissions - Team members submit updates through easy-to-use modals
- PTO Management - Automatically announce team members who are out of office
- Multi-Schedule Support - Create multiple standup schedules per channel
- Timezone-Aware - Handles timezones and DST transitions correctly
- Reliable Scheduling - Custom asyncio-based polling scheduler ensures jobs fire on time
- Python 3.10+
- Slack workspace with admin access
git clone https://github.com/YOUR_USERNAME/standup-bot.git
cd standup-bot
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt- Go to api.slack.com/apps
- Create a new app (from manifest or scratch)
- Add OAuth scopes:
commands,chat:write,channels:read,users:read - Enable Socket Mode and create an App-Level Token
- Install the app to your workspace
Create a .env file with your Slack credentials:
# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
SLACK_SIGNING_SECRET=your-signing-secret
# Optional
DATA_DIR=./data
DATABASE_NAME=standup.db
DEFAULT_TIMEZONE=America/New_York
WORKDAY_START_TIME=09:00python scripts/init_db.py # First time only
python3 -m src.main| Command | Description |
|---|---|
/standup |
Create or manage standup schedules |
Creating a schedule:
- Run
/standupin a channel - Configure: name, time, timezone, active days, questions
- Click "Create"
Managing schedules:
- Edit - Modify configuration
- Pause/Resume - Temporarily disable/enable
- Delete - Remove permanently
| Command | Description |
|---|---|
/pto |
Add or manage PTO entries |
Adding PTO:
- Run
/ptofrom any channel - Set start date, end date, optional note
- Select channels for announcements
- Click "Add PTO"
Daily announcements post automatically at the configured time (default: 9 AM).
Built with:
- Python 3.10+ with asyncio
- Slack Bolt SDK (AsyncApp with Socket Mode)
- SQLite with WAL mode (PostgreSQL-ready)
- Custom polling scheduler for reliable job execution
standup-bot/
├── src/
│ ├── handlers/ # Slack event handlers
│ ├── models/ # Database models
│ ├── scheduler/ # Polling scheduler
│ ├── services/ # Business logic
│ └── utils/ # Helpers (blocks, formatters, timezone)
├── scripts/ # Database initialization
├── docs/ # Architecture & requirements docs
└── data/ # SQLite database (created at runtime)
V1 used APScheduler but jobs frequently missed their scheduled times by minutes or hours. V2 uses a custom asyncio polling scheduler that:
- Checks the database every 30 seconds for due jobs
- Fires jobs within a 15-second window or skips them (fail-fast)
- Uses database-backed execution logs to prevent duplicates
- Survives restarts with no missed jobs
See docs/architecture.md for details.
| Problem | Solution |
|---|---|
| Bot not starting | Check .env variables, verify tokens in Slack app settings |
| Schedules not firing | Verify schedule is active, check timezone, ensure bot is in channel |
| Modal errors | Run /standup from the target channel (not DMs) |
Useful logs:
=== STANDUP JOB TRIGGERED ===- Job fired successfullyScheduler tick:- Scheduler is running (every 30s)
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
See docs/product_requirements.md for feature specifications.
MIT License - see LICENSE for details.