Daily Challenges and Shareable Seeds, No Server Required
A deterministic, seeded simulation gave my draft game a daily challenge and shareable challenge links for free, with no backend at all. Here is how a single integer unlocks both.
I build games on nights and weekends, solo, which means every feature has a cost I feel personally. A backend is the most expensive thing I can sign up for. It is a database to keep alive, an API to secure, a server bill that arrives whether anyone played today or not. So when two of the features I wanted most for World 11 turned out to need no backend at all, I sat there grinning at my editor like I had gotten away with something.
World 11 is my World Cup draft roguelike. It is free in the browser, built in Godot 4. You spin up a nation and a year, draft eleven real players from a pool, and then a simulation plays out a fourteen match gauntlet to see how far your squad goes. The two features I am talking about are a global daily challenge and shareable challenge links. Both of them fell out of one decision I made on day one, which was to make the entire simulation deterministic from a single integer.
What Deterministic Actually Means Here
Deterministic is one of those words that sounds heavier than it is. All it means in practice is this. Same seed in, same entire run out. If I hand the simulation the number 12345, I get the same draft pool, the same opponents in the same order, and the same match results every single time. Not similar. Identical, down to the last goal in the last minute of the last match.
That property is the whole foundation. Once a run is fully described by one number, that number becomes a portable, tiny, copy and paste version of an entire game session. You stop thinking about a run as a sprawling tree of random events and start thinking about it as a value you can put in a variable, write to a URL, or derive from the calendar.
The Single Integer Is the Whole Run
Here is the part that still feels a little magic to me. A complete World 11 run, the draft, the gauntlet, the final placement, is reproducible from a number you could text to a friend. There is no save file to ship around. There is no replay log recording every action frame by frame. There is just the seed.
The seed is the run. Everything else is computed from it on demand. That reframing is what unlocks the cheap features, because anything you can describe with one number, you can share, schedule, or regenerate for free.
Feature One, the Daily Challenge
The daily challenge is almost embarrassingly simple once the sim is deterministic. I take today's date and turn it into the seed. Everyone in the world who opens the game on the same day gets the exact same number, which means everyone faces the identical draft pool and the identical gauntlet bracket.
No coordination. No server picking a challenge of the day and pushing it out. No fetch call that can fail. The player's own clock and a deterministic sim are enough to guarantee that my run and your run on July the twentieth are the same run. Two strangers on opposite sides of the planet draft from the same players and fight the same opponents, and the only variable left is who drafts smarter. That is the entire daily challenge, and it costs me nothing to host because there is nothing to host.
Feature Two, the Shareable Link
The second feature is the one I am proudest of. If a run is a number, a link is just that number in a URL. I encode the seed into the address, a friend opens it, and they drop straight into your exact draft and your exact gauntlet. Same players available, same opponents waiting, same everything.
Now it is a contest. You posted your final placement, they open your link, and they try to beat your score on identical conditions. There is no fairness argument to have, because the conditions are provably identical. The link carries the whole challenge. Again, no backend. The URL is the payload, the sim does the rest, and two people who have never spoken can compete on a shared board that neither of us had to build a server for.
Why This Is Only Cheap If You Plan for It
I want to be honest about the catch, because the headline makes this sound like a free lunch and it is not. It is only free because the simulation is pure. By pure I mean there is no hidden global randomness anywhere in it. No system clock peeked at mid match. No unseeded random call sneaking in to nudge a result. Every random decision the sim makes, who scores, how a draft pool shuffles, which opponent comes next, traces back to that one seed.
If even one source of randomness in the sim is not tied to the seed, the whole thing collapses. The daily challenge stops being shared because two players diverge on a coin flip you forgot to seed. The link stops reproducing the run because your machine and mine disagree on a number neither of us controls. Determinism is all or nothing. One leak and you have nothing.
The Discipline Behind the Magic
Keeping the sim pure is a discipline, not a one time setup, and it is the actual work behind these two features. In Godot, that meant threading one seeded random number generator through every part of the simulation that ever needs a random choice. In GDScript that is a RandomNumberGenerator instance with its seed set explicitly, passed down into the draft, the match engine, the bracket, everywhere.
The rules I hold myself to are short and strict. No randi or randf calls floating around the sim, because those pull from the global generator I do not control. No Time.get_ticks_msec or any wall clock value feeding into a result, because the clock is the opposite of reproducible. If a function in the simulation needs randomness, it gets the seeded generator handed to it as an argument. There is no other source. That sounds restrictive, and it is, but it is the price of admission for everything above.
Why Bolting It On Later Is Painful
I designed World 11 seeded from day one, and I am convinced that is the only sane way to do it. Trying to retrofit determinism onto a sim that already has randomness scattered through it is genuinely painful. You end up hunting for every stray randi, every quiet read of the clock, every library helper that calls into global randomness without telling you. Miss one and your sim looks deterministic right up until the moment it is not, usually in front of a player comparing scores.
Building it in from the start flips the cost. Instead of an archaeology project later, it is just a constraint you live with while writing the code, the way you live with a type system. The seeded generator is there from the first line of the match engine, and every new feature I add has to respect it. That up front discipline is exactly what handed me two backend free features as a side effect.
What I Got for Free
Step back and the trade looks lopsided in my favor. I committed to one rule, keep the simulation pure and seeded, and in return I got a global daily challenge and friend to friend challenge links without writing a single line of server code. No database. No API surface to secure. No monthly bill that scales with players I may or may not have.
For a solo developer working in the hours after a day job, that is the kind of leverage I am always hunting for. One good architectural decision quietly paying for two features I would otherwise have had to build and host. The simulation does not know or care whether the seed came from the calendar or from a link a stranger sent. It just runs, and it runs the same way every time.
Try It Yourself
World 11 is free to play in your browser. Draft your eleven, run the gauntlet, and if you want the real test, take on today's daily challenge against everyone else playing the same bracket, or send a friend your seed and dare them to beat your score on the exact run you just played. Come play at games.kevingabeci.com.
Like this? You'll like what I'm building too.
Two ways to support and get more of this work.
HEARTH
A privacy-first Life OS for your desktop. Journal, tasks, and notes that stay on your machine. Coming soon, direct download from this site.
Read moreMY TOOLKITS
Receipts-first toolkits for shipping after hours, building Claude agents, publishing on Amazon, and more. The exact methods I used, not theory.
Browse on WhopRelated Articles
Balancing a Roguelike to a One-in-Three Win Rate With a Headless Harness
My draft roguelike was too easy. A strong team won the cup two-thirds of the time, so winning meant nothing. Here is how I stopped guessing and tuned it to a real one-in-three with a few hundred simulated runs.
Why I Made a Football Game Where You Never Touch the Ball
World 11 is a football game with no passing, shooting, or defending. You draft a team and watch the result. Here is why a game about betting instead of playing is so addictive, and how the draft loop works.
Fetching Free Player Faces for a Game Without Shipping the Wrong Human
I wanted real footballer photos on the cards in my draft game, free-licensed only. The fetch was easy. Not shipping the philosopher Socrates instead of the footballer was the hard part. Here is the pipeline and the disambiguation fix.