Automated on-call rotation and SMS notification system
WhoseOnFirst manages shift assignments and sends daily SMS notifications to on-call team members. The system uses a circular rotation algorithm to ensure fair, predictable shift distribution.
- Role-based access control — Admin and Viewer roles with session-based authentication
- Configurable shifts — 24-hour and 48-hour shifts with flexible day assignments
- Automated SMS — Daily 8:00 AM CST notifications via Twilio with customizable templates
- Schedule overrides — Manual coverage swaps for vacation, sick leave, or on-demand changes
- Drag-and-drop ordering — Reorder rotation priority with a simple drag interface
- Data portability — Full backup/restore for migration between environments
Secure session-based authentication with admin and viewer roles.
At-a-glance view of who's on call today, the escalation chain, and a color-coded monthly calendar showing the full rotation.
Manage the on-call roster. Each member gets a unique color for calendar visibility. Drag the grip icon to reorder rotation priority.
Define your weekly shift template. Each shift maps to a day (or days for 48-hour doubles). The coverage chart shows gaps at a glance.
Generate rotation schedules weeks in advance. Auto-renew keeps the schedule rolling. Export to CSV for offline reference.
SMS notification history with delivery status tracking. Customize the message template with dynamic placeholders for name, date, and time.
Swap coverage for vacation or sick days without disrupting the rotation. Override history tracks who covered for whom and why.
Export a full database backup or restore from a previous backup. The restore is atomic — if anything fails, no data is changed.
Step-by-step Twilio configuration walkthrough, environment variable reference, and troubleshooting FAQ.
| Component | Technology |
|---|---|
| Backend | FastAPI, Python 3.12 |
| Database | SQLite with SQLAlchemy ORM |
| Scheduler | APScheduler |
| SMS | Twilio |
| Frontend | Vanilla JS, Tabler CSS |
| Container | Red Hat UBI9 (OpenShift compatible) |
# Clone and start
git clone <repo-url>
cd WhoseOnFirst
docker-compose up -d
# Access at http://localhost:8000
# Default admin: admin / Admin123!
# Default viewer: viewer / Viewer123!Change passwords immediately after first login.
Version 1.6.1 · Changelog








