Free open source tool

roster-lint

Lint a shift roster CSV before you publish it: clopening shifts, overtime breaches, double bookings, uncovered required slots and unfair weekend distribution, in one clear report for ops and support team leads.

View source on GitHub

Run it in your browser

Runs fully in your browser, files never leave your device.

Drag and drop the file onto this box, or use the picker. Columns: person, date, start, end, role. Times are HH:MM, and an end before the start counts as overnight.
Minimum rest hours, maximum weekly hours and coverage rules. Leave empty to use the config below, which matches examples/config.json. Clear the box entirely to run on the built in defaults (11 hours rest, 40 hours per week, no coverage rules).

What it does

Clopen detection: rest between consecutive shifts below the configured minimum, 11 hours by default
Overlapping and double-booked shifts for the same person, including overnight shifts
Weekly hours breaches per person, with weeks starting on Monday and a configurable maximum
Coverage checks: required people per role per day, with per-date overrides in the config
A weekend fairness table in every report, and exit code 1 on error findings so the check can gate a publish step

Install and usage

Requires Node.js 20 or later. There are no dependencies to install.

git clone https://github.com/aamirtechs/roster-lint.git
cd roster-lint
node src/cli.js examples/roster.csv --config examples/config.json --out-dir out

The roster CSV needs person, date, start, end and role columns, with times in HH:MM format. If the end time is before the start time, the shift counts as overnight. Outputs are report.md and findings.csv.