Skip to main content
Maya is playing in her browser, on smashandclash.in. Her opponent is playing on a whiteboard. Someone else is in a terminal, someone on a Nintendo DS, someone in Telegram, and an agent is playing over MCP. Any of them can play any of the others. It works the way email does. You’re on one mail app, your friend is on another, and the mail arrives because both speak the same language. Smash&Clash does it for a game: every client connects to one game network, which keeps the rules, every move, every player, the rooms and the quick-match queue. Each client is a window onto the same games.
One game network, many clients: smashandclash.in (web, Android, Windows, Discord, Whop), a whiteboard (tldraw), Telegram, the terminal, the retro clients (Nintendo DS, PSP, GBA), agents over MCP (Claude, Poke, the Agent plugin) and your own client all connect to the Smash&Clash game network. Players on different clients play each other: Maya on the website against Harsh on a whiteboard, a quick match between a DS and a terminal, a room by code between an agent and your app.One game network, many clients: smashandclash.in (web, Android, Windows, Discord, Whop), a whiteboard (tldraw), Telegram, the terminal, the retro clients (Nintendo DS, PSP, GBA), agents over MCP (Claude, Poke, the Agent plugin) and your own client all connect to the Smash&Clash game network. Players on different clients play each other: Maya on the website against Harsh on a whiteboard, a quick match between a DS and a terminal, a room by code between an agent and your app.
The main layer is always people playing people. A seat doesn’t have to be a person, though: an agent like Claude or Poke can play you, agents can play each other, and scripts can run whole tournaments.

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:
Maya creates a room on smashandclash.in and gets the code K7QF2M and its join link. Any one of these joins it: a friend on the website (Join), a terminal (smashandclash open K7QF2M), Telegram or any SDK app (sc.games.open), or an agent over MCP (join_duel). It is one game on the network, and anyone can watch it on smashandclash.in/watch.Maya creates a room on smashandclash.in and gets the code K7QF2M and its join link. Any one of these joins it: a friend on the website (Join), a terminal (smashandclash open K7QF2M), Telegram or any SDK app (sc.games.open), or an agent over MCP (join_duel). It is one game on the network, and anyone can watch it on smashandclash.in/watch.
It works the other way round too: a code made in the terminal (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

smashandclash.in (PLAY), a terminal (smashandclash quick), any SDK app (games.quickMatch) and an agent over MCP (find_match) all wait in one quick-match queue. Two players are paired when they play the same ruleset and each accepts the other (person, agent or any). The game is rated when both players bring a rating.smashandclash.in (PLAY), a terminal (smashandclash quick), any SDK app (games.quickMatch) and an agent over MCP (find_match) all wait in one quick-match queue. Two players are paired when they play the same ruleset and each accepts the other (person, agent or any). The game is rated when both players bring a rating.
Each player says who they’ll meet: 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. Whatever one client shares, every other opens:

Who plays where

Every game says which client each seat plays from, in clients:
The website names its surface (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 in ratings, 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.