Duty Roster Generator
Generate a fair rotating monthly shift roster — nurses, security, classroom piket, volunteers — honoring your rules. Edit any cell, then print it or export CSV / Excel.
Add your people, name your shifts, pick a month, and generate. Or skip straight to a filled-in example.
One name per line. Blank lines are ignored.
How this works & why it's private
Everything happens in this browser tab. Your people, shift types and rules are held in page memory and saved to localStorage so your setup is still here next time you open the page — nothing is ever sent to a server. The scheduler is a plain greedy round-robin: each day, for each shift, it picks whoever has worked the fewest shifts so far (and the fewest of that specific shift type), skipping anyone on a fixed day off or already at their consecutive-shift limit. If it truly can't meet your minimum staffing or consecutive-shift rule on a given day — usually because there aren't enough people for the shifts you've defined — it says so plainly instead of quietly shipping a broken roster.
Printing uses your browser's own window.print() with a print stylesheet that hides the nav, footer and controls, leaving just the grid on the page — no PDF service, no upload. CSV is a plain text string built locally; the .xlsx file is built in-browser with the SheetJS library, which never touches a network.
To verify none of this leaves your device: open your browser's dev-tools Network tab, generate and edit a roster, and watch the live "uploads" counter in the nav above — it stays at 0.