UsForge

Share your game

Two ways to get a game onto UsForge. Neither needs a GitHub account.

1 · Send it to Taurus

Send your game however is easiest — a .zip of its folder, an HTML file, or a Claude artifact link — with its name and a one-line description. Taurus puts it up.

2 · Upload it yourself (members)

If you have a UsForge account, go to Upload, sign in, pick your game’s .zip (or folder, or HTML file), and press Upload. A new game from a member goes live once one of the founders has checked it; updates to your games go live in about a minute. You can update or remove your own games there any time.

Join UsForge

We’d love more people making games! If you make games with AI (like Claude), you can become a member and upload your own.

  1. Go to the Upload page and scroll to “New member? Make your password code”.
  2. Pick an account name and a password, and press the button. You get a password code.
  3. Send just that code to Taurus. It can check your password, but can’t be turned back into it, so nobody ever sees your password.
  4. Once Taurus adds you, sign in on the Upload page and share your games. Your first ones get a quick look from a founder before they go live.

Getting your game as files

A game needs an index.html (plus any other files it uses). If your game is a Claude artifact, ask Claude in that chat: “give me this game as an HTML file I can download.” A link also works — the card then opens it in a new tab.

Game made of several files or folders? Zip it into one file: on a Mac, right-click the game’s folder → Compress; on Windows, right-click → Send to → Compressed (zipped) folder. Send or upload that .zip — UsForge unpacks it by itself.

Nice extras: a screenshot named cover.png in the folder becomes the game’s card picture.

Check your spelling and grammar. Your game’s name and description are the first things players read. A description with typos makes a great game look unfinished. Read it once more before uploading, or ask an AI to “fix the spelling and grammar, but keep my words”. The Upload page also points out common mistakes.

Does your game work on phones (touch controls, fits a small screen)? Tick Works on phones and tablets when you upload it. It gets a phone badge, and people on phones see it first.

Add a leaderboard to your game

UsForge can show a top-10 leaderboard on your game’s page. When a round ends, your game just sends its score with one line of code:

parent.postMessage({ usforge: 'score', score: 1234 }, '*');

Fewest wins, like golf or a speedrun time? Add order: 'low'. Want a label? Add unit: 'points'. For a time, send whole seconds with unit: 'time' and UsForge shows it as a clock (like 38:12). The player then gets asked for a nickname. Made your game with Claude? Just ask it: “When the game ends, send the score to UsForge with parent.postMessage({ usforge: 'score', score: SCORE }, '*').”

No real end? Use a live leaderboard

Some games keep going: you drive around, collect coins, and your score goes up and down. Send the score every time it changes, with live: true:

parent.postMessage({ usforge: 'score', score: coins, live: true, unit: 'coins' }, '*');

Nothing interrupts the game. A live leaderboard shows next to it, with the player’s best of this run and where it ranks, and after they pick a nickname once, their best is saved by itself while they play. Sending it many times a second is fine. Ask Claude: “Whenever the score changes, send it to UsForge with parent.postMessage({ usforge: 'score', score: SCORE, live: true }, '*').”

Making your game with an AI? Paste it this

Copy this prompt into Claude (or any AI that’s helping with your game). It explains both kinds of leaderboard and picks the right one for your game.

Add a UsForge leaderboard to this game.

UsForge runs my game inside a frame and listens for messages from it. To send a score, the game calls:

  parent.postMessage({ usforge: 'score', score: 1234 }, '*');

Optional extra fields in that object:
- order: 'low' if a LOWER score is better (golf strokes, fastest time). Leave it out if higher is better.
- unit: a short word shown after the number, like 'points', 'coins' or 'meters' (letters only, up to 12). For a time, send whole seconds with unit: 'time' and UsForge shows it as a clock (like 38:12).
- live: true (only for games with no real end, see option 2).

First decide which kind of game this is:

1. The game has a clear end (game over, level complete, race finished, out of lives).
   Send the final score ONCE, at the moment the round ends. UsForge then asks the player for a nickname and saves it. Do not send scores during play.
   Example: parent.postMessage({ usforge: 'score', score: finalScore, unit: 'points' }, '*');

2. The game has no real end (open world, endless driving, collecting coins, a number that keeps going up and down).
   Send the CURRENT score every time it changes, with live: true. UsForge shows a live leaderboard next to the game, keeps the player's best of the run and saves it by itself. Nothing interrupts the game. Sending often is fine, but sending only when the number changes is best.
   Example: parent.postMessage({ usforge: 'score', score: coins, live: true, unit: 'coins' }, '*');

Rules:
- score must be a plain number (not text), and a whole number is best. Round it if needed.
- Always use the same order and unit in this game.
- Wrap the call so it can never break the game: try { parent.postMessage({ ... }, '*'); } catch (e) {}
  When the game runs on its own (not on UsForge), the message is simply ignored.
- Do not build a nickname box or leaderboard screen of your own. UsForge does that.
- Do not change anything else about the game.

When you're done, tell me which option you chose (1 or 2), which number is the score, and where in the code it is sent.

Make your game speak more languages

UsForge can be read in English, Português, Español, Français, Deutsch and 中文, and players from all over can find your game. A game with a language menu reaches far more of them. When UsForge opens your game, it adds the player’s language to the address, like ?lang=pt:

const lang = new URLSearchParams(location.search).get('lang') || 'en';

Then tick the languages your game has on the Upload page, and they show on your game’s page. Players whose language isn’t there see a friendly heads-up. Made your game with Claude? Just ask it: “Add a language menu with English and Português, and start in the language from the ?lang= part of the address.”

House rules

  1. Only upload and change your own games.
  2. First names or nicknames only — no last names, photos, schools or addresses.
  3. Nothing mean about real people.
  4. No gambling or betting games: no slots, roulette, or betting coins, gold or anything else on luck to win more. Casino-looking games without betting (like card games for points) are fine.
  5. If you want a game taken down, it comes down. No arguing.