Jam Roulette

Make a game that lasts five to ten seconds. It plays back to back with everyone else's.

Every entry is a microgame: one instruction, a 3-2-1, a few seconds of play, then win or lose, straight into the next. Build yours in Unity, Godot or plain JavaScript, upload the web build here, watch it run, and submit it to a jam.

Jams

How to take part

Six steps, from nothing to an entry. Each one takes minutes except the part where you make the game.

  1. Sign in with Discord

    Your Discord account is your account here. Sign-in only asks Discord who you are; your display name becomes the author name on your games, and you can change it per game.

    Sign in with Discord

  2. Get the SDK for your engine

    The SDK is how your game talks to the runner: it tells the runner your prompt and round length, hears when the round starts, and reports whether the player won. One small file per engine.

    In Unity, choose Assets › Import Package › Custom Package… and pick the file. It adds Assets/JamRoulette/. Example/MicrogameTemplate.cs in there runs a full round with placeholder Win and Lose buttons: put it on a GameObject in your first scene, press Play, then replace the parts marked TODO.

    The minimal version:

    using JamRoulette;
    
    void Start()
    {
        Microgame.GameStarted += gameTime => enabled = true;
        Microgame.GameEnded += condition => enabled = false;
        Microgame.Register("Dodge!", "arrows", gameTime: 5, winOnTimeOut: true);
    }
    
    void OnHit() => Microgame.SetGameState(GameOverCondition.Lose, immediatelyEnd: true);

    On Unity 6 and later, the package's editor script turns off the Unity splash screen for WebGL. The runner shows its own splash, and Unity's would only delay your Register call.

  3. Make a 5–10 second microgame

    The runner owns everything around your game: the splash, the countdown, the timer and the result. Your game only has to do three things: register once it has booted, wait for the round to start, and say whether the player won.

    1. Your gameregister

      Once booted. Sets the prompt, the controls, the round length and whether surviving counts as a win.

    2. Runnersplash, 3-2-1

      Shows your prompt over your game, which is loaded but held. Nothing should move yet.

    3. Your gamegameStart

      Start play. You get the round length, and the time left every frame after.

    4. Your gamesetGameState

      Win or lose, and whether to end the round now. The last call before the end counts.

    5. RunnergameEnd

      Freeze. The result shows for a second, then your game is unloaded.

    • Register when you are ready, not before. The runner boots your game in the background while the previous one is being played, so load what you need first, then register.
    • The prompt is the one-line instruction shown huge on the splash, like “Dodge!”. The controls label is one of mouse, click, keyboard, arrows, wasd, space, touch, gamepad, or any short word.
    • The round length is clamped to 5–10 seconds. If you never report a result, winOnTimeOut decides it: on for “survive until the end” games, off (the default) for “do this before time runs out”.
    • Report as you go. setGameState(win, false) marks a win and lets the round run on; setGameState(lose, true) ends it at once. Uncaught errors end the round as an error.
    • Test without the runner. In the Unity editor, a Godot desktop run, or opening your page directly, the SDK runs the round itself: the start comes about a second after you register, then a local timer.
  4. Export a web build and zip it

    • Unity: build for WebGL. Brotli or Gzip compression works as exported, and so do multithreaded builds.
    • Godot 4: add a Web export preset and export to a file named index.html. Thread support on or off both work.
    • JavaScript: your folder, with index.html as the page that starts the game.

    Zip the contents of the build folder, so index.html is at the top level of the zip. A zip holding just one folder is fine too: the uploader looks inside it. You can also skip the zip and drop the folder itself onto the upload area.

    250 MBtotal, unzipped
    95 MBlargest single file
    2,000files at most
    index.htmlat the top level

    Pages that need SharedArrayBuffer (threaded Unity and Godot builds) get it: builds run cross-origin isolated.

  5. Upload it and watch it run

    Open a jam that is taking entries and choose Enter this jam. Give your game a title and you land on its page. Drop the zip there. It is unzipped and checked in your browser before anything is sent, so a missing index.html or an oversized file shows up straight away, with what to fix.

    When the upload finishes, your game plays in the runner right there on the page: splash, countdown, round, result, on repeat. This is your draft. Only you can see it.

  6. Submit it to the jam

    Uploading does not enter you. When you are happy with the draft, press Submit: that build becomes your entry, and it is what everyone plays.

    Keep going after that. Upload again and the jam keeps playing your submitted build until you submit the new one. You can re-upload, re-submit or withdraw until the jam closes; then entries are frozen.