Open it
There is nothing to install and no login. Open trc-scheduler.pages.dev in any browser and start working.
Your schedule is stored in your own browser, not on a server. Nobody else can see it, and it will not appear on your other laptop. It survives closing the tab and restarting the machine, but it will not survive clearing your browsing data.
To get a schedule to anyone else — or to your own second machine — you must download a file and send it. That is the only way it travels.
A new board starts completely empty — no days, no pitches, no age groups — because every event is a different shape. Your first stop is Global settings, to say how many days the event runs and which pitches you have. Until there is at least one of each, the Schedule tab has nothing to draw.
After that the tool opens on the Schedule tab, which is the board itself. The other tabs hold everything that feeds it, and the tab you were last on is remembered.
| Tab | What lives there |
|---|---|
| Schedule | The board, the unscheduled tray, block details, warnings, pitch usage |
| Age groups | Every age group and all its settings. The main setup screen |
| Teams | Names for each team, pool slot by pool slot |
| Fixtures | The full match list, grouped by age group |
| Fees | Entry fee per group, and what it works out to per match and per player |
| Global settings | Operating hours, turnarounds, changeovers, auto-arrange |
| Save & share | Files, saved versions, exports |
Set up your age groups
Do days and pitches first if you have not already — age groups produce blocks, and blocks need lanes to sit on.
Go to Age groups. Everything the schedule derives from starts here — how many blocks exist, how long each one runs, how many games it contains.
Start from a preset
Four buttons add a whole competition at once. Each adds only what is missing, so pressing one twice does nothing and pressing several combines them.
| Preset | Adds |
|---|---|
| Add seniors | U10, U11, U12, U13, U14, U15, U17 |
| Add juniors | U5, U6, U7, U8, U9 |
| Add GC | U10G, U12G, U14G, U16G, U18G |
| Add touch | U10T, U12T, U14T, U16T, U19T |
You can also type any name into Add an age group — the tool reads the number in
it to decide sensible defaults, so U16 starts on a full pitch and U8 on a
half. Remove a single group with the × at the end of its row, or start over with
Clear all age groups. Both ask first.
Then set each group up
The row for each age group carries every setting for it. The ones that change the shape of the competition most are Teams, Pools and Pitch.
Odd team counts are fine. Pools are filled as evenly as possible, so seven teams in two pools gives you 4 + 3 — and the short pool carries a rotating bye each round.
Where pools are uneven, the tool lists which team sits out which round, and states that a bye counts as a win. It does not enforce that, because it does not hold results — the note is there so whoever sets the competition up in Tournify carries the rule across.
Name the teams
Optional, but it turns the fixture list from something only you can read into something you can send a visiting club.
On the Teams tab, each age group shows its pools with a box per slot. Type a
club name into A1 and every fixture involving A1 shows that name — on the board, in
the match rundown, in the fixture list, and in every export. Leave a slot blank and it keeps its
code.
The pool code stays visible next to the name, faded. That is deliberate: it lets you check the draw is right and lets anyone reading a schedule work out which pool a team is in.
Knockout matches stay as W QF1 v W QF2 and similar. Who plays in them is not known
until the pool results are in, so there is no name to show yet.
Build the schedule
Every age group produces either two blocks — pool phase and knockout phase — or one combined block, depending on its Split blocks setting. Blocks start in the tray under the board and you place them on a lane. A lane is one pitch on one day, so the board is pitches × days — two pitches across Saturday and Sunday is four lanes; a third pitch makes six, and a third day makes nine. Both are editable in Global settings.
Move things
- Drag a block sideways to change its kick-off, or onto another lane to change its venue or day.
- Click a block to open its details. Click it again to close them.
- Keyboard — see the shortcuts.
Put one block down
Selecting an unscheduled block gives you Place on the board. It finds the earliest spot the block actually fits — stepping over what is already on each lane, leaving the changeover you asked for on both sides, and refusing to start a knockout before its own pools have finished. It tells you where it landed. If nothing on the board can take it, it says so rather than dropping it somewhere that immediately clashes.
Or let it have a go
Global settings holds three auto-arrange buttons: pools on Saturday with knockouts on Sunday, complete age-group blocks, and tidy lanes.
Auto-arrange packs the longest block first. That balances the lanes, but it knows nothing about heat, age, or which games you want as showpieces. Treat what it produces as a first draft.
Change the competition from the block
Selecting a block opens its details, which show the block length in hours and minutes, how it is made up, and when it runs. Below that, every setting for that age group is editable in place — so you can shorten U13's pool games and watch the block resize without leaving the board. Those changes apply to the whole age group, not just the block you clicked.
Check the warnings
The status panel above the tabs is always live. It reports one of four states.
CLASH means something is genuinely wrong and must be fixed. TIGHT means it will work but something is close to the bone. PARTIAL means blocks are still sitting in the tray.
Things it treats as errors
- Two blocks overlapping in the same lane.
- A block starting before doors open or running past close.
- A knockout scheduled before its own pool games have finished.
- One age group at both venues at the same time.
Things it only warns about
- Not enough changeover between two blocks on the same pitch. If the two need different pitch markings, it says so and expects the longer changeover.
- Not enough recovery between an age group's pools and its knockout.
The Peak live games figure in the status panel is worth watching. It counts how many matches are on at once across both venues, which is what your referee supply has to cover — two half-pitch age groups running in parallel puts four games live at the same moment.
Reading a block
Three things are encoded into every block on the board.
Same age group, pool then knockout · a narrower block abbreviates rather than truncating
- The fill colour is the age group. It stays the same wherever that group appears, so you can follow one group across every lane. The legend at the top of the page lists them, grouped by pitch layout.
- Diagonal stripes mean knockout. Solid means pool play.
- The pill shows the pitch layout and game length. A full pitch runs one game at a time, half runs two, quarter runs four.
Narrow blocks shorten their own detail rather than cutting it off, so a short knockout block might
show only 8g. Hover any block for the full description, or click it for everything.
Fixture IDs
Every match has a permanent handle: the age group, then its number within that age group —
U13-P07 for a pool match, U13-K03 for a knockout one. It appears in the
Fixtures tab, the match rundown, both CSVs, the running order and the Tournify sheets, so a match
can be referred to the same way everywhere.
The number never changes. Drag a block to another pitch, another day, another
time, gang the pools, reschedule the whole weekend — U13-P07 is the same fixture.
That is the point: a printed running order stays correct after you move something.
The trade is that IDs do not run in order down the page, because the page is in kick-off order while the ID follows the fixture's place in its own pool. Pool A's matches are numbered first, then pool B's, but they are played alternately. Switch on Run each pool straight through and the two orders coincide.
Reading a fixture
In the Fixtures tab and in a selected block's rundown, every match is one line: kick-off, pitch,
fixture ID, round, then the two sides either side of a centred v. Games that kick off
together share the time cell and are marked P1 / P2.
- The team pill carries the pool code and the club name as one object. The code shows its pool as both a colour and a shape — pool A a circle, B a square, C a diamond, D a triangle — so the seed stays traceable once names are in. With no name entered it is just the code.
- A round pill appears on knockout matches. Quarter-finals, semi-finals, placing matches and the final each have their own colour, and a final is a filled star.
- Pool matches get a quiet round marker instead — Round 2 — and only where the round changes. Naming the pool would be the same fact already on both team pills. The effect is deliberate: pool matches read calm, knockout matches read loud.
- A knockout side carries the fixture it comes from.
W BQF1names a slot, not a match, so the ID of the match that fills it sits alongside — you never have to scan back up the list to find which fixture that was.
The two views
Above the list, Kick-off order and Grouped.
- Kick-off order is the run sheet, and the default. Every match in the order the day plays out.
- Grouped splits the list up — pool matches by round, knockout matches by competition, so Cup, Plate, Bowl and Shield read as the four separate tournaments they are. An age group with only one competition looks exactly the same in both views.
They are not interchangeable, and the reason is worth knowing: grouping breaks kick-off order. A Bowl quarter-final can sit under the Bowl heading or at 09:00 between two Cup matches, not both. Each group is in kick-off order internally, but the groups interleave. Use kick-off order to run the day and grouped to understand or explain the format. The choice is remembered per browser.
How the rounds feed each other
Above a knockout list there is a How the rounds feed each other disclosure. Open it for a diagram of the whole knockout: one box per match, a solid line where the winner advances and a dashed one where the loser drops a tier, with the trophy tracks as horizontal bands.
It is drawn from the fixtures themselves rather than from a template per format, so it is correct for anything the scheduler can produce. It appears only where there is a flow to draw — the two placement formats and both second-phase pool formats generate no progression at all, so nothing is shown rather than an empty diagram. The same diagram appears on the Tournify handover page, open, in the step where you rebuild the format.
Age groups you add yourself are given their own colour automatically.
Every age group field
Each age group is a card on the Age groups tab, with every setting labelled. The line beside the name summarises what those settings add up to — teams, how they divide into pools, the pitch layout, and how many matches it produces — and updates as you change things. All of it is also editable from a selected block's details.
| Field | What it does |
|---|---|
| Teams | How many teams entered, 4 to 16. Odd numbers are fine |
| TRC | How many of those are TRC's own. They play, but pay no entry fee |
| Pool sizes | Read-only. How the teams divide, e.g. 4+3. Flags a bye where uneven |
| On pitch | Players a side: 10, 12 or 15 |
| Squad | Maximum players a team may register. Never below the on-pitch count |
| Pitch | Full, Half ×2 or Quarter ×4 — how many games run at once |
| Pools | 1, 2 or 4. Three is deliberately not offered — filling an eight-team knockout from three pools has to take third-placed teams, which can pair two teams from the same pool in a quarter-final |
| Pool min | Length of a pool game in minutes, 4 to 60. There is an Apply to all below the table for setting every age group at once |
| KO min | Length of a knockout game in minutes, same range and same Apply to all |
| Finals format | What happens after the pools. Nine options, grouped by what they cost a team in extra games — see Finals formats below |
| Split blocks | On, pools and knockout are separate blocks you can place apart. Off, one block |
| Gang pools | On, each pool runs straight through. Off, the pools alternate round by round |
| Entry fee | Per team, in Singapore dollars |
| Games | Read-only. Total matches this group generates |
Finals formats
Every age group picks its own. The choice sets how many games each team plays, so it drives both the block length on the board and the cost per match in the fee table. The dropdown groups the nine options by what they cost a team.
Placement — one extra game each
Nobody is eliminated and nobody is idle. The cheapest way to give every team a meaningful last match.
| Format | What it does | Needs |
|---|---|---|
| Position playoff | Every team plays the same-placed team from the other pool — A1 v B1 for the final, A2 v B2 for 3rd/4th, and so on down. No mismatches, because both teams finished level in their own pool | Two equal pools |
| Merged-table seeding | All teams ranked on one table across both pools, then adjacent seeds paired: 1 v 2 is the final, 3 v 4 plays for third. The final is genuinely the best two rather than two pool winners of possibly unequal standard | An even number of teams, and a published cross-pool ranking rule |
Knockout
| Format | What it does | Needs |
|---|---|---|
| Semi-finals | Top two from each pool. Four teams play on; everyone else is finished after the pools. Four matches | Four teams available to qualify |
| Cup and Plate | Top two of each pool into a Cup bracket, bottom two into a Plate. Every team plays two more against opposition of similar standard, and there are no first-round mismatches. Eight matches | Two equal pools of four |
| Single bracket | All eight into one bracket from the quarter-finals. Half the field is out after one game. Eight matches | Four teams in every pool |
| Single bracket + full plate | As above, with a full plate for the quarter-final losers, so everyone plays three more. Twelve matches | Four teams in every pool |
| Cup / Plate / Bowl / Shield | The sevens format. All sixteen enter, one round splits the draw, and every team plays exactly four. Round-one winners chase the Cup with their quarter-final losers dropping to the Plate; round-one losers chase the Bowl with their quarter-final losers dropping to the Shield. Twenty-eight matches, four trophies, nobody goes home early | Exactly sixteen teams |
Second-phase pools — nobody eliminated
Re-pool by position after the group stage: A1, A2, B1, B2 into a championship pool and A3, A4, B3, B4 into a plate pool. There is no final — final standings come from the second-phase table.
| Format | What it does | Needs |
|---|---|---|
| Carry forward head-to-head | Plays only the fixtures the teams have not already had, carrying each existing result forward. Two more games each, eight matches | Two equal pools of four |
| Full round robin | Each new pool plays a complete round robin, replaying pool-mates. Three more games each, twelve matches — the most rugby per travelling team of any option here | Two equal pools of four |
When a format does not fit
An option the current team count cannot support is greyed out in the dropdown. If a saved setup or a later change to the team count leaves a group on a format that no longer fits, the scheduler falls back to semi-finals and says so — in amber under the dropdown, on the age group card, and in the issues panel. It never silently changes the number of games a team plays.
Three pools are not offered, and tiering at pools of three or five is deliberately unsupported: both need best-third comparisons, which is a competition decision rather than a scheduling one.
Global settings
These apply to every age group at once.
| Setting | What it does |
|---|---|
| Clear everything | Removes every age group, team name, pitch and day, and empties the board. Timing settings are kept. Asks first, names what will go, and can be undone |
| Days | Add, rename, date and remove days. A date is optional; set one and it shows on the board and carries into the Tournify handover. Add, rename and remove days. A day’s number is its position in the list, so removing one renumbers the days after it and whatever is scheduled on them moves with the renumbering. Blocks on the removed day go back to the tray |
| Pitches | Add, rename and remove pitches. Each one becomes a lane on both days. Give pitches at the same ground the same venue — exports group by venue, the board keeps them apart. Removing a pitch sends anything scheduled on it back to the tray |
| Doors open / close | The operating window. Anything outside it is an error |
| Turnaround between games | Dead time between matches inside a block. Included in block length |
| Snap increment | What dragging snaps to |
| Gap wanted between pools and knockout | Recovery time. Below it, a warning |
| Changeover — same pitch layout | Wanted between consecutive blocks that use the same markings |
| Changeover — different pitch layout | Wanted when the pitch has to be re-marked between blocks |
| Separator after competition points | How teams from different pools are ranked on one table — points difference, points scored or tries scored. The full order is competition points, then this, then tries scored, then a drawn lot. Merged-table seeding cannot be drawn without it, so publish it with the draw. It does not affect any other format |
Fees
Set an entry fee per age group, or use Apply to all. The tab then answers two questions: what a visiting club pays for what it gets, and whether the event covers itself.
What each club pays
The table is split by a rule. Left of it is what a club is charged; right of it is what that buys.
- TRC's own teams are excluded from revenue. They count toward fixtures, pitch time and peak games, but not income. The Free entries card puts a figure on what those places forgo.
- Per match is a range only where the format makes it one. With semi-finals or a single bracket the high end is a team knocked out first and the low end a team that reaches the final, and that spread is what a visiting club feels. The placement, tiered and second-phase formats give every team the same number of games, so they show a single figure.
- Per player uses that group's own squad size, so groups with bigger squads show a lower per-player cost.
- The bar under each revenue figure is that group's share of entry revenue, so you can see which age groups are carrying the event.
- The All groups per-match figure is not an average of the column above it. It is total revenue over every match in the event, counting both teams — a different question, and usually a much lower number.
Running costs
Four rates. You enter the rate; the quantity comes from the schedule, which is the point of having this here rather than in a spreadsheet — the shape of the day is priced in.
| Item | Rate you enter | Quantity taken from |
|---|---|---|
| Referees | Per referee, per day | Peak live games × days. Running four games at once needs four referees on the whistle, so a denser schedule costs more here |
| Pitch hire | Per pitch, per day | Number of pitches × days |
| Medical cover | Per day | Number of days |
| Everything else | Flat | Nothing — kit, prizes, catering, admin |
Leave all four at zero and nothing appears; the tab stays a revenue sheet exactly as before.
The bottom line
Once any cost is entered you get entry revenue, running costs, and the net — which turns red and reads Shortfall if the costs win. Beside it, break even at is how many teams would have to enter at today's average fee to cover the costs. It moves as you change fees, so it is a quick way to test whether a fee ladder works before you publish it.
All of it travels: the money summary is written into the exported markdown, and the rates are saved inside the file, so reopening a saved event restores them.
These are planning figures, not accounts. There is no tax, no deposit handling, and no per-club invoicing — the tool is deciding whether a shape works, not running the books.
Keyboard
With a block selected:
| Key | Does |
|---|---|
| ← → | Nudge the kick-off by one snap increment |
| ↑ ↓ | Move to another lane — venue or day |
| Del | Send the block back to the tray |
| Esc | Cancel a confirmation dialog |
Anywhere in the tool:
| Key | Does |
|---|---|
| ⌘Z | Undo — steps back through the last 60 changes |
| ⇧⌘Z | Redo |
Where it stops
It lays out a tournament: how many games, how long they take, which pitch and when. Running the competition — results, standings, tie-breaks, what happens when a day is washed out — happens in Tournify, which is the standard tournament management app for rugby in Singapore. Plan here, hand the schedule over, run it there.
That is why knockout fixtures stay as W QF1 v W QF2 and never turn into team names:
the thing that knows who won is Tournify, not this.
Beyond that boundary, worth knowing:
- Undo does not survive a reload. It covers the last 60 changes in this session. Close the tab and that history is gone — a saved version is what persists.
- Nothing is shared. Two people cannot edit the same schedule. One person owns the file and circulates it.
- Phones and tablets are untested. Dragging may or may not behave. Use a laptop.
- A phase-split format has no slack. Pools on one day and knockouts on the next means a washed-out first day has nowhere to go — the second day is already full. Worth seeing on the board before you commit to the format. What you then do about it is a competition rule, decided by the organisers and applied in Tournify.