Lightweight Python service to automatically update Slack status based on a schedule and configurable rules.
This project lets you define status messages, emojis, and schedule rules so a small scheduler updates your Slack presence automatically. It supports both a local Python setup and a Docker-based deployment.
Features
- Scheduled status updates using a configurable scheduler
- Day-of-week scheduling - Different statuses for weekdays, weekends, or specific days
- Time range constraints - Statuses that only apply during certain hours
- Read configuration from
config.yml(example provided) - Slack integration using a token-based API client
- Dockerfile and
docker-compose.ymlfor containerized deployment - Small, easy-to-read codebase (single module + package)
Quick Start
Prerequisites
- Python 3.10+ (recommended)
pipfor installing dependencies- A Slack user token with
users.profile:writescope
Install dependencies
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtCreate configuration
- Copy the example config:
cp config.example.yml config.yml
- Edit
config.ymland set your Slack token and schedules. At minimum setslack.tokenand oneschedulesentry.
Run locally
# run the small app which starts the scheduler
python slack_status.pyThe service will read config.yml from the repository root by default.
Configuration
Open config.example.yml (renamed to config.yml) to see available settings.
Basic Configuration
Simple time-based status updates with day constraints:
slack_token: "your-slack-token-here" intervals: - time: "07:30" days: "weekdays" presence: "auto" status_text: "Working" status_emoji: ":white_check_mark:" - time: "12:00" days: "weekdays" presence: "away" status_text: "Out for the day" status_emoji: ":x:"
Advanced Configuration
Schedule statuses for specific days or time ranges:
slack_token: "your-slack-token-here" intervals: # Weekday working hours - time: "09:00" days: "weekdays" presence: "auto" status_text: "Working" status_emoji: ":computer:" # Weekend status - time: "09:00" days: "weekends" presence: "away" status_text: "Out of Office" status_emoji: ":palm_tree:" # Specific days - time: "18:00" days: ["monday", "wednesday", "friday"] presence: "away" status_text: "Gym time" status_emoji: ":muscle:" # Time range constraints (only active during specific hours) - time: "10:00" days: ["friday"] time_range: start: "10:00" end: "16:00" presence: "auto" status_text: "Friday focus time" status_emoji: ":dart:"
Configuration Options
Each interval supports the following fields:
time(required): Time in HH:MM format when the status should be setdays(required): Day constraints - can be:"weekdays"- Monday through Friday"weekends"- Saturday and Sunday["monday", "tuesday", ...]- Specific days of the week
time_range(optional): Time range when the status is activestart: Start time in HH:MM formatend: End time in HH:MM format
presence: Slack presence ("auto"or"away")status_text: Custom status messagestatus_emoji: Status emoji (e.g.,:computer:)
Note: Time ranges can cross midnight (e.g., start: "22:00", end: "06:00").
Security note: Do not commit real tokens into git. Prefer environment variables or secrets.
Docker
Build and run with Docker Compose
docker compose build docker compose up -d
Environment variables
Set the token via environment variables or a mounted config.yml. Example docker-compose.yml in this repo demonstrates usage.
Troubleshooting
- Logs: If running with Docker Compose, use
docker compose logs -f. - Token errors: ensure the token has
users.profile:writescope. - Config load errors: ensure yml indentation is correct and required fields exist.
Author
👤 Filippo Finke
- Website: https://filippofinke.ch
- Twitter: @filippofinke
- Github: @filippofinke
- LinkedIn: @filippofinke
