Back to projects

Meeting Scheduler

How I Built a Fair Assignment Engine with Zero Side Effects

Next.js 16.2TypeScript 5Tailwind CSS 4LRU AlgorithmPure FunctionsCSV ParserPDF Generation

2

Assignment Modes

3

Meeting Types

5+

Publisher Roles

2

Printable Forms

The Problem

Congregation meetings require weekly assignment scheduling — assigning speakers, readers, and attendants across multiple meeting types. This was done manually with spreadsheets, leading to unfair distributions, conflicts, and hours of administrative work every week.

The Approach

The core challenge wasn't the UI — it was the assignment algorithm. I needed a system that could produce fair, conflict-free assignments automatically, while respecting eligibility rules, gender constraints, and role-based requirements. And it had to be deterministic and testable.

Key Decisions

Why a Pure Assignment Engine?

The assignment engine is a pure function: it takes input (publishers, meetings, constraints) and returns output (assignments) with zero side effects. No database access, no API calls. This makes it infinitely testable and completely predictable.

Why LRU Rotation?

Fairness isn't random — it's systematic. The LRU (Least Recently Used) algorithm ensures that whoever hasn't been assigned recently gets priority. Combined with priority ordering (most restrictive parts first), the algorithm guarantees fair distribution across all participants.

Two-Pass Assignment System

The engine runs two passes: main assignees first, then helpers. This prevents conflicts where a helper assignment might block a more critical main assignment. The priority ordering ensures the most constrained parts get filled first.

The Build

Built with Next.js 16.2, TypeScript 5, and Tailwind CSS 4. The application handles midweek meetings, weekend meetings, and attendant/microphone rotation — all with automatic assignment and full manual override capability. It generates printable S-140 and S-89 forms and supports CSV import/export for easy migration.

The Result

What used to take hours of manual spreadsheet work now happens in seconds. The algorithm produces conflict-free, fair assignments every time. Publishers see their assignments clearly, history is tracked, and workload distribution is transparent.