← ALL PROJECTS
RosterFlow calendar mascot

RosterFlow

A scheduling tool that builds fair monthly rosters for 60+ volunteer musicians across 7 care homes, with backups and carpools built in.

BACKEND
PythonFastAPIpandas
OPTIMIZATION
OR-Tools (CP-SAT)
FRONTEND
ReactTypeScriptViteLeafletRecharts
DATA & HOSTING
Postgres (Neon)Vercel

The Problem

Music for the Golden Age is a volunteer group of 60+ musicians who play live shows at 7 long-term care homes across the GTA. Every month, we had to decide who plays which show, who drives, and who steps in when someone cancels, all by hand.

Availability came in through a group chat and was copied into a spreadsheet, so schedules were built on information that was already out of date.
The rules stack up: every show needs at least 3 musicians including a pianist, everyone plays at least one song, nobody plays twice in a day, and musicians under 17 need a guardian to drive them.
Roughly one musician late-cancels per show, so without a backup plan a cancellation means a short-staffed show.
Musicians who live near each other still drove separately to the same home, wasting a lot of gas and money.

We were left cross-checking a chat, a spreadsheet and a list of rules to guess at a fair, workable schedule.

Approach

RosterFlow takes the upcoming shows, everyone’s availability and limits, and the group’s rules, then builds a draft schedule the coordinator reviews, tweaks and publishes. The pipeline runs in three stages: collect, build and review.

RosterFlow pipeline: shows and musicians feed collect, build and review, then Postgres, the web app and show day

The build step is a constraint programming model made with Google OR-Tools. Musicians mark which shows they can make through self-service links, and nothing changes for them until the coordinator publishes.

Rules every schedule must follow
Only people who said they’re free get booked, and nobody plays two shows in one day.
Nobody goes over their monthly limit.
Every show has at least 3 musicians including a pianist, and everyone plays at least one song.
Musicians under 17 only get shows close enough for a guardian to drive them.
What the solver optimizes, in order of importance
1.Every show has enough music to fill its time.
2.Everyone gets a fair share of chances to play.
3.Less driving, with carpooling counted so sharing a car helps.
4.Musicians play at different homes instead of the same one every time.
Planning for cancellations

Each show gets ranked backups, sized to the day. Cancellations usually come about two days ahead, so the first backup can be called in. A backup counts toward their monthly limit only if they are called in, and they play the songs they already know instead of taking over the cancelled musician’s songs.

M3 cancels, so B1 plays; B2 and B3 stay on standby
Built for the coordinator
Draft before publishing. Lock or block people from shows, then publish when it looks right.
Planning tools. Test new show dates, extra cancellations and growing demand.
Carpool groups. Musicians who live near each other are grouped to share a car.
Activity log. Every change and who made it, with undo.

Live demo: rosterflow-phi.vercel.app (made-up sample data that resets on refresh).

Outcome

77% → 96%
shows fully staffed after cancellations (simulated)
8 → 3
musicians driving per show, on average

RosterFlow now schedules 60+ musicians across 7 care homes, and the group uses it in real life. Adopting the backup policy raised the share of fully staffed shows from 77% to 96% in simulation, and carpool grouping cut the average number of musicians driving to each show from 8 to 3.

MeasureBeforeWith RosterFlow
Shows fully staffed after cancellations77% (no backups)96% (with backups)
Musicians driving per show, on average83 (62% fewer vehicles)

The fill-rate figures come from a Monte Carlo simulation of 5,000 runs with a fixed 1-in-8 chance that any musician cancels. They estimate the effect of the backup policy under that assumption and are not a measured season of real shows.

Personal Takeaways

Solved a problem I live with

Being part of the group meant I already understood the day-to-day constraints, like who needs a ride, why every show needs a pianist and how often people cancel. That helped me build a model that matches how the group actually works.

Simple rules beat clever ones

I treat every musician equally with no reliability scoring, and a backup only counts toward their monthly limit if they are called in. Those choices keep the schedule fair and easy to explain.

Built to be tried safely

The public demo runs on made-up data that resets on refresh, so anyone can test it without exposing real musicians. Fixing the bugs that testing surfaced taught me what it takes to keep a live tool reliable.

NEXT PROJECT
FSAE Telemetry Tracker
→
TORONTO, ONGITHUB · LINKEDIN · EMAIL
← BACK TO LINE