Dev Diary

How We Built the Festival Circuit (and What Broke)

Oct 27, 20265 min read

A dev diary on festival circuit design: four tiers, season-long seeding, the timezone bug that cost a player his slot, and what we changed after.

The first premier final we ever ran did not resolve. It just sat there past midnight, a bracket with a gap in it where a champion should have been.

That is the honest version of shipping something new. So here is the dev diary: how our festival circuit design came together, what it got right on the first live season, and the three things that broke within hours of real bands touching it.

Why a circuit, and not just bigger gigs

Weekly shows are the heartbeat of the game. They are also, by design, a grind. You book, you play, you learn what a room does to a setlist, and the numbers creep up.

What we did not have was a peak. Real music years have a shape: you slog through the winter, and in July somebody puts you on a stage at four in the afternoon in a field.

We wanted that shape. A festival season inside the season.

The festival circuit design we landed on

Four tiers, from local stages up to a premier tent. Entry is automatic once the circuit opens partway through the season, which was a deliberate choice: we did not want a festival slot to go to whoever happened to be logged in at the right minute.

The rest of it works like this.

  • •Circuit points accumulate all season from your live and release activity, so the ranking reflects months of work rather than one lucky week.
  • •Seeding comes from those points, which means the tier you land in is earned, not picked.
  • •Brackets run over a few weeks of the season, one round at a time, resolved by the same weekly tick that runs everything else.
  • •Rewards are buzz and reputation, not money. That was on purpose. We did not want the circuit to become the fastest way to get rich, only the fastest way to get known.

That last point caused an argument in our own notes for about a week. Cash rewards are the obvious lever. They are also the fastest way to turn a prestige event into a farming route, and once that happens nobody remembers who won anything.

Seeding is where the design actually lives

Everything interesting about a bracket happens before the first match. Get seeding wrong and you either hand the trophy to the biggest band by default, or you produce chaos that feels arbitrary.

We went with strong seeding at the top and looser matching lower down. A dominant band should meet other dominant bands in the last rounds. But a band on its first circuit should still get a real match, not a ritual execution.

Odd numbers were the fiddly bit. Brackets want powers of two, and live player counts absolutely refuse to be one. Byes solve it, and byes are also where we introduced our worst bug.

Three things broke on the first live run

The first one was quiet and awful: the points source we read from was returning nothing. Every band was seeded at zero, which meant the bracket was effectively random. It looked like it worked. It did not work.

The second was the empty final. Our top tier ran in the last scheduled week, and the code that resolved a round assumed there was always a week after it. There was not. So the final never closed, and when the season rolled over it took a chunk of festival state with it.

The third was the byes. We handled a bye correctly in round one and then never again, so a band that advanced without an opponent in a later round quietly stopped advancing at all.

The timezone one that cost somebody a place

And then the one that still stings. Entry locked at a fixed hour, but the lock was computed against server local time while the countdown a player saw was rendered in their own. For most of the world the difference did not matter. For one player it was an hour, and he confirmed his entry an hour after a deadline he had no way of seeing correctly.

He had done everything right. He still missed the circuit.

We fixed it the boring way: every lock is stored and compared in UTC, the interface shows a live countdown rather than a wall-clock time, and the entry window now closes with a visible warning rather than silently. We also made the resolver idempotent, so a round that half-ran can be re-run without duplicating results.

You can read the full mechanics in the festivals section of the in-game guide, and there is a tactical companion piece on how to win a festival if you would rather play it than read about how it is wired. The original launch notes are in festivals are here.

What we took away from it

Systems that only run once a season are the hardest to test, because you get one attempt per season to be wrong in public. The fix was not more cleverness. It was building a way to fast-forward a whole festival cycle before anyone else sees it.

The circuit is live now and it does what we hoped: the middle of the season has a hill in it. Bands plan for it, which is exactly the behaviour we wanted.

If you want to see the thing from the inside, start a band free and play toward the next circuit. It runs in your browser, it costs nothing, and your first show can be booked in about five minutes.

#dev-diary