Custom rosters

Examples

A complete repository to start from, the smallest files that work, and recipes for the things you'll do most.

The example repository

Download example-repository.zip

It's the Pond League: the Pinecrest Porcupines against the Saltmarsh Sturgeon. Each team has a logo, four forward lines, three pairs and two goalies, with every rating filled in. There are two updates, and between them the teams make a trade. Import the zip as it is to see it in the game, or copy it and make it your own.

File What it shows
roster-repository.json The front page, with one set.
pond/roster-set.json Two updates, newest first, with their checksums.
pond/2026-10-01/roster-pack.json The opening rosters: two teams and 40 players.
pond/2026-10-05/roster-pack.json After a trade, with new lines and a rating change.
pond/2026-10-05/changes.md What changed, in words.
pond/2026-10-05/art/PIN.png, SAL.png The teams' logos, listed in the pack's files. Each update has its own copy.

The smallest pack

Download minimal-pack.json

Every field the game can do without is left out: no ratings, so everyone's average, and no lines, so the game dresses each team in the order its players are listed. It still plays a full game. Here it is trimmed (the download has all 32 players):

{
  "format": "bladeybiscuit.rosters",
  "formatVersion": 1,
  "league": "MINI",
  "teams": [
    { "id": "RED", "name": "Red Team", "colors": { "primary": "#B22222", "secondary": "#FFFFFF" } },
    { "id": "BLU", "name": "Blue Team", "colors": { "primary": "#1C3F94", "secondary": "#FFFFFF" } }
  ],
  "players": [
    { "id": 1, "firstName": "Ada", "lastName": "Redson", "team": "RED", "number": 1, "position": "C" },
    { "id": 2, "firstName": "Bo", "lastName": "Redson", "team": "RED", "number": 2, "position": "LW" },
    { "id": 3, "firstName": "Cy", "lastName": "Redson", "team": "RED", "number": 3, "position": "RW" },
    …
    { "id": 16, "firstName": "Pip", "lastName": "Redson", "team": "RED", "number": 30, "position": "G" },
    { "id": 17, "firstName": "Ada", "lastName": "Blueberg", "team": "BLU", "number": 1, "position": "C" },
    …
  ]
}

A team needs 15 skaters and a goalie to dress without call-ups: nine forwards, six defencemen and a goalie.

The smallest repository

To import a pack, wrap it in the two index files. These are as short as they can be:

mini/
  roster-repository.json
  mini/
    roster-set.json
    2026-10-05/
      roster-pack.json

roster-repository.json:

{
  "format": "bladeybiscuit.roster-repository",
  "name": "Mini",
  "sets": [{ "id": "mini", "index": "mini/roster-set.json" }]
}

mini/roster-set.json:

{
  "format": "bladeybiscuit.roster-set",
  "id": "mini",
  "name": "Mini League",
  "updates": [{ "date": "2026-10-05", "file": "2026-10-05/roster-pack.json" }]
}

Without a sha256 the game skips the checksum, which is handy while you're building it. Add one, with size, teams and players, before you share. The checker writes the whole update for you.

Recipes

Add a team

  1. Add the team to teams, with a new id.
  2. Add its players to players, each with "team" set to that id. Give each one an id no other player in the pack has.
  3. Give the team lines, or leave them out and let the game dress it.

Make a trade

In the example's October 5 update, Pinecrest trade Pascal Mossgrove (id 109) to Saltmarsh for Ike Dunmore (id 208). Two things change for each player:

  1. Their team: Mossgrove's becomes "SAL" and Dunmore's "PIN".
  2. The lines: each id moves into a spot on the new team, and out of the old one.

Their ids don't change: an id is the player's for good, in every update (why).

Pinecrest's forwards before:  [[102, 101, 103], [105, 104, 106], [108, 107, 109], [111, 110, 112]]
and after:                    [[102, 101, 103], [105, 104, 106], [208, 107, 108], [111, 110, 112]]

Forget the lines and nothing breaks: the game fills the hole a traded player leaves, and dresses a new arrival only if there's a hole for them. The checker shows you each lineup as the game will dress it.

Post a new date

  1. Copy the newest dated folder and rename it to today, like 2026-10-12.
  2. Make your changes to the pack in it, and write a changes.md if you like. Keep every player's id as it was, and give anyone new an id nobody's had.
  3. Add an update for it to roster-set.json (the checker writes it for you).
  4. Set latest in roster-repository.json to the new date.

Keep the old folders and their updates. People can go back to them.

Two leagues in one repository

Give each its own folder and set, and list both in roster-repository.json:

"sets": [
  { "id": "pond", "name": "The Pond League", "index": "pond/roster-set.json", "latest": "2026-10-05" },
  { "id": "beer-league", "name": "Tuesday Beer League", "index": "beer-league/roster-set.json", "latest": "2026-09-30" }
]

Each set installs on its own, and each is a league in team select.