Writing the cycle
A cycle is a string of letters, one per day: D day shift, E evening, N night, O off. DDNNOO is two days, two nights, two off on a six-day repeat, which three crews cover. DDEENNOO is the eight-day, three-shift version that four crews cover. The presets are common arrangements, but the engine has no opinion: write your own string and it will be spread the same way.
Crew offsets are the other half. With an even spread, crew 2 starts at the point in the cycle one crew-share along, so on a six-day cycle with three crews the offsets are 0, 2 and 4. That is what puts a different crew on nights each block while keeping every position covered. If the cycle length does not divide by the crew count there is no even spread available, and the tool falls back to placing crews one day apart and tells you so — the resulting coverage will have holes and doubles, and the fix is upstream, in the cycle length.
What "three months" means at a month end
The window runs from your start date up to the day before the same day-of-month N months later, with the day number clamped down to the target month's last day when it does not exist. One month after January 31 is February 28, or February 29 in a leap year, so a one-month roster starting January 31 ends February 27. Two months is computed from the original date in one step, not by adding one month twice — that distinction matters, because January 31 plus one month plus one month is March 28, while January 31 plus two months is March 31.
The rotation itself does not notice month ends at all. Each crew's shift on a given day is the pattern letter at index (day number since start plus that crew's offset) modulo the cycle length, so the sequence runs unbroken from January 31 into February 1 exactly as it runs from the 14th into the 15th. Splitting the calendar into month tables is a display decision, not an arithmetic one.
Reading the totals
The per-crew table is where a roster is actually judged. Over a window that is not a whole number of cycles, crews will not have identical counts — one will be a night or two ahead. That is not unfairness in the pattern, it is a sampling artifact of where you cut the calendar, and it converges as you extend the window. If you want to see it converge, run three months instead of one and watch the spread shrink.
The longest unbroken run is the number worth checking against whatever rule set you operate under. A cycle can look short and gentle while producing a seven-day run at the seam between two repeats, and that seam is easy to miss reading the string alone.
Where this stops
This lays a pattern onto dates. It does not know about vacation, training days, sick cover, swaps, or the person who always takes the Christmas night shift. It does not compute overtime, night differential, rest periods between shifts, or consecutive-day limits, and it does not check the result against any law or agreement. Holidays and your own closure dates are marked on the grid but the rotation runs through them, because that is what a rotation does; whether people are actually called in is a policy question the grid cannot answer.
Print the grid, then edit it by hand as reality arrives — that is how rosters have always survived contact with a real crew, and a printed sheet with pen marks on it is a more honest record than a generated one that quietly no longer matches.
Questions people ask
Can I do a simple every-other-day rotation?
Yes. Choose "Write my own", enter DO for a day-on day-off pattern, and set the crew count to 2. The two crews land on opposite days. For a 24-hour on, 24-hour off arrangement the arithmetic is identical; use whichever letter matches how you label the shift, since the letters only affect the display and the per-shift counts.
Can I put people's names in instead of crew names?
Yes — one name per line in the crew names box, in order. If you list fewer names than crews the rest fall back to Crew A, Crew B and so on, and extra names are ignored. When a crew is several people, one line reading "Blue — Ana, Dev, Sam" keeps the row height sane and still shows who is on.
Why do two crews have different numbers of nights?
Because the window you asked for is not a whole number of cycles. Each crew enters the window at a different point in the pattern, so a partial cycle at either end favors whoever happens to be sitting on the nights. Over complete cycles every crew works exactly the same counts. Extend the window and the spread shrinks; if it does not shrink, the cycle length and the crew count do not divide evenly and that is the real problem.
Are holidays removed from the rotation?
No. They are marked on the grid with a dot and colored in the header, and that is all. Removing them would break the cycle for every crew downstream of the holiday, which is the opposite of what a continuous-coverage rotation is for. Whether a holiday is worked, paid at a premium or swapped is decided by your agreement, and the usual practice is to leave the pattern alone and handle the holiday as pay rather than as schedule.
Does this check my schedule against labor rules?
It does not, at all. There is no rule engine here — no consecutive-day cap, no minimum rest between shifts, no weekly hour ceiling, no minor or medical restrictions. The longest-run figure is provided so you have the number to check against your own rules, not because the tool has checked it. Anything that will be posted as a real roster needs review by whoever is responsible for that compliance where you are.