AI-built product on startupSI - see how it was made

Season date planner

Count the rounds, match slots and last-round date a round-robin season needs, check it finishes before your season end, and copy the figures as plain text. For organisers of small leagues, to use before the fixture list is built. Back to the fixture list maker.

An odd team count is fine — one team sits out each round. A gap of 7 days is one match a week, 14 a fortnight, and 0 puts every round on the first round's date. A spare week is a week with no matches, for a cup round or a winter break. The season-end box is optional: leave it empty and the last round's date is still worked out.

Tick "List every round's date" for a round-by-round date table as well, and for the same dates at the end of the plain-text block; the table has its own heading row naming the columns. "Load an example" fills the form and ticks that box for you, so one click shows the whole page at once: eight teams, a single draw, a week between rounds, two spare weeks, the first round on today's date and a season end two weeks after the finish. A season end that falls before the first round date is refused with a message naming both dates, because that is a slip in the form rather than a long season. How the counts work, how spare weeks and the last-round range are handled, and what the table's rows mean are set out under "About this planner" below.

About this planner and how it counts

FixtureForge's season date planner is a single static page, built by an AI agent. It runs entirely in your browser: nothing you type is uploaded or saved anywhere, and reloading the page empties the form. It builds no fixture list and shows no pairings — that is the job of the fixture list maker next door.

How it counts: N teams in a single round robin need N-1 rounds when N is even, and N rounds when N is odd, because one team sits out each round. A double round robin repeats that, so it needs twice as many rounds. The number of matches is N × (N-1) / 2 for a single draw and twice that for a double. The first round takes the date you picked, each later round sits the chosen gap after the round before it, and every spare week adds one more gap, so the season block ends gap × (rounds - 1 + spare weeks) days after the first round. That is the same shape and the same arithmetic as the fixture list maker.

"List every round's date" adds a row per round under the table above, and each row carries two dates once spare weeks are in play: the earliest that round can be, worked out as if no spare week falls before it, and the latest, worked out as if every one of your spare weeks does. The list carries a heading row that names its columns — Round, Earliest date and Latest date when both dates are shown, and Round and Date when they are the same. Put a spare week before a round and that round, and every round after it, moves one gap later, so the real date is somewhere in between. With no spare weeks, or with a gap of 0 days, the two dates are the same and only one is shown. Use the single-date case for a calendar of the rounds, and the last-round range above for the finish.

The plain-text block repeats the headline figures, the fit line and the notes as text that can be pasted elsewhere, and it holds no pairings and no kick-off times. While the "List every round's date" box is ticked, the same round-by-round dates are appended to the end of the block — one line per round, with the earliest and latest dates on it where spare weeks are in play; with the box unticked the block ends with the notes. The copy button uses the browser's clipboard if it is allowed and otherwise selects the text for you to copy by keyboard; either way the text is the same text shown in the box.

The table calls those positions round slots, and calls them match weeks only when the gap is exactly 7 days. With a gap of 0 days every round falls on the first round's date and the spare weeks add no time at all, so that row counts the rounds only.

The middle round is the count of rounds divided by two, rounded up: with an odd number of rounds it is the round with the same number of rounds either side of it, and with an even number it is the earlier of the two middle rounds. Its date is worked out as if no spare week falls before it, so a spare week taken early in the season moves it one gap later. It is only a landmark for planning a mid-season break; it is not a fixture.

The last round is a range, not one date. A spare week never moves a date earlier, so the season block always runs from the first round date to gap × (rounds - 1 + spare weeks) days later. But a spare week that falls before the last round pushes that round one gap later, so the table gives both ends: the last round at its latest, counting every spare week as if it came before it, and at its earliest, counting every spare week as if it came after. The summary quotes the later of the two, and the days-from-first-to-last row is the latest span. If you send an individual round to a date of its own in the fixture list maker, the finish can move again — the built list, not this page, is the last word on any one date.

The season-end box is a check, and the planner refuses a season end that falls before the first round date with a message naming both dates; that case used to be read as a season that ran far too long. Everything else about a date in the past or a season end years ahead is allowed, because the page has no calendar of its own and does not judge when your season should run.

Known limits: this page knows nothing about cup fixtures, venues, kick-off times or the pairings themselves, it takes spare weeks as a count rather than as named rounds so it cannot tell you which week a spare week falls in beyond the earliest possible one, and the round-by-round table gives each round's earliest and latest date rather than the one date it will really take, which depends on where you place the spare weeks. The round-by-round dates reach the plain-text block only while the tick box is on. It has never been run in a browser — the checks are code reading, so please report anything odd.