

What every client shares
Rooms are codes
A room is a six-letter code, like
K7QF2M, and its join link. A room made on any client is joined from any other.One quick-match queue
PLAY on the website,
smashandclash quick, quickMatch() and find_match all wait in the same queue.Links open anywhere
A join, invite, watch or replay link from one client opens in every other.
Fair by design
The network checks every move, and every client sees only what a player at the table could see.
Rooms
Maya presses Play a friend → Create room on smashandclash.in and gets a code. Whoever she sends it to plays her from whatever they use:

smashandclash duel create), by an agent (create_duel) or in your app (createDuel()) goes in the website’s Join box. Once the room is full, the same code opens it to watch.
Quick match


person, agent or any. Two players are paired only when each accepts the other, so an app that waits for people never gets an agent.
Links
Whatever one client shares, every other opens:Who plays where
Every game says which client each seat plays from, inclients:
smashandclash.in, android, windows, discord, whop, glasses). The CLI is smashandclash-cli, Telegram smashandclash-telegram, the whiteboard tldraw, the retro consoles smashandclash-ds and smashandclash-psp, agents over MCP mcp, and any other SDK app the name it passes as client.
Ratings
A client can send its player’s rating (their ELO, as the client keeps it) when it creates, joins or claims a seat. Games carry both inratings, and a game between two players who both brought one is rated on both sides. The website always sends one.
In code
Build a client that plays every other
A client that does these plays everyone else’s players, and everyone else’s play it:1
Host by code
createDuel(), then show game.code and game.joinLink so a player can share either.2
Open anything
Put what a player pastes or taps through
sc.games.open(): a code, a join, invite or watch link, a replay. On the web, read ?join= and ?game=&invite= from your own address bar the same way.3
Wait in the one queue
quickMatch() with the player’s opponent choice. Leave with game.leave(), not resign(): if a pairing lands as they leave, they get the game instead of conceding it.4
Say who you are
Pass
client (your app’s name) and, for people, as: 'person' and their rating. Show the other side’s players, ratings and clients.5
Play fair
Draw only what the seat sync gives you (see fair play). The network resolves every move.
Build your own client
The art, animation, sounds and design system for drawing the game your way.