Browser card game · 2–10 players · peer-to-peer

NUNO: A card game night
with no server.

NUNO is a browser card game by Suman Debnath that plays the official rules of UNO and five of its spin-offs, for 2 to 10 players. It has no game server: the host’s browser runs the game, friends connect to it directly over WebRTC, and each phone is sent only its own player’s cards.

Play bots on three difficulties, or send friends a link and talk over built-in voice chat while you play. Every card physically flies across the table, the bots wait for it to land before they think, and seven themes repaint the whole thing — scenery, cards, fonts and sound.

6 official rule sets2–10 players0 game servers0 audio files100 testsReact · TypeScript · WebRTC
🃏 Play NUNO now→Live · nuno.houseofnamus.com

Built 12–14 Oct 2026 · 11 commits · ~18,100 lines of TypeScript

nuno · classic · your turn
A six-player Classic table on the player's turn: green felt, five bot opponents around an oval, the prompt ‘Match Green or 6 — or play a Wild’, and the playable cards lifted out of the hand

6

Official rule sets

Classic, No Mercy, Flip, Attack, All Wild, Spin

2–10

Players per table

bots take every empty seat

0

Game servers

the host’s browser is the referee

0

Audio files

79 effects, 8 soundtracks, all synthesised

62

Characters

across six themes, each with their own lines

1,020

Bot games per test run

and not one card lost or duplicated

01the problem

Five friends, five phones.
One link.

Getting a group into the same card game usually means an app store, an account each, and a server somebody pays for. The browser versions skip all that — and then skip the rules too, with house rules nobody agreed to.

NUNO was built for one group of friends on their phones. Open a link, play the real rules, talk while you play.

No install

It is a web page. Phones in portrait or landscape, tablets, desktops.

No account

A name and an emoji, kept in your own browser and nowhere else.

No game server

The host’s phone runs the game. Friends connect straight to it.

But the real rules

Six published instruction sheets, followed card for card — decks, effects and scoring.

02six official rule sets · one engine

Not ‘UNO-like’.
Six instruction sheets.

Each mode follows the instruction sheet of the game it is based on, and its deck matches the official contents list — the tests count them. All six run on one pure rules engine shared by the bots and the interface, so the glow that says a card is playable always agrees with the rules.

Classic

108 cards

Based on UNO

Challenge a Wild Draw Four bluff. First to 500.

No Mercy

168 cards

Based on UNO Show ’Em No Mercy

Stack +2, +4, +6 and +10. Draw until you can play. 0 passes hands, 7 swaps. Hold 25 cards and you’re out. First to 1000.

Flip

112 two-sided

Based on UNO Flip

A Flip card turns the whole game to the Dark Side — and you see the backs of everyone else’s cards.

Attack

112 cards

Based on UNO Attack

No drawing. You press a card launcher that may fire nothing, or ten cards.

All Wild

112 cards

Based on UNO All Wild

Every card is wild — no colours, no matching, no numbers. Only Wild actions, down to a Forced Swap.

Spin

108 cards

Based on UNO Spin

20 Spin cards make the next player spin a nine-space wheel.

Where the box is silent, NUNO had to choose.

The physical launcher is mechanical and the wheel is a wheel. A browser has to put a number on both — so the numbers are chosen, written into How to Play, and printed here.

Attack · one press of the launcher

Nothing60%
1–3 cards25%
4–6 cards10%
7–10 cards5%

Most presses fire nothing. One in twenty buries you.

Spin · nine spaces, one in nine each

123456789
  1. 1Almost NUNO
  2. 2Discard Number
  3. 3Discard Color
  4. 4Draw Red
  5. 5Draw Blue
  6. 6Trade Hands
  7. 7Show Hand
  8. 8War
  9. 9NUNO Spin
attack · the launcher replaces the deck
An Attack-mode table: no draw pile, a red card launcher marked HIT in its place, and the prompt ‘Hit the launcher (2 left)’
03no game server · peer-to-peer

The host’s phone
is the referee.

The host’s browser runs the authoritative game. Friends join with a six-letter code or a link and connect directly to it over WebRTC. With no server in the middle, the host’s browser holds everyone’s cards — so it never sends the raw game. Each phone gets a view built for its own seat.

The host’s browser holds

The whole game

  • · every hand at the table
  • · the order of the draw pile
  • · whether a Wild Draw Four was a bluff
  • · the bots’ decisions

What each phone is sent

Your own hand

every card, face up

sent

Everyone else’s hand

a count per seat, never the cards

withheld

The draw pile

how many are left, not what they are

withheld

Whether a Wild Draw Four was a bluff

a bluff only works if nobody can check

withheld

Stable card ids

reassigned after every shuffle, so an id can’t be tracked

withheld

The proof is the bluff. A Wild Draw Four is only legal if you hold nothing in the current colour — and you can only be caught if somebody looks. After a challenge, only the challenger is shown the offender’s hand.

the challenge
The Wild Draw Four prompt: ‘Cosmo Cat hit you with +4! It's only allowed if they had no Yellow cards. Bluff?’ with Take it and Challenge! buttons
not a bluff — the challenger sees the hand
The challenge result ‘NOT A BLUFF!’, showing the offender's hand to the challenger only
04a table that shows everything

The game is instant.
The table is not.

A card game on a screen fails when you can’t follow it. So nothing just changes: every card travels, the table changes colour, and every big play is said out loud in plain words.

skip · said in plain words
A SKIP! splash over the discard pile reading ‘Duchess Duck misses a turn’, with a ‘Skipped!’ bubble at her seat
1

Every card moves

A riffle and a real deal start each round. Every draw flies from the deck to the player; every play flies to the pile.

2

The felt says the colour

The table takes the colour in play, and arrows printed on the rim show the direction.

3

Plain words, not icons

Big plays get a splash that says what happened — “Duchess Duck misses a turn”. A log lists the last moves; tapping the discard pile explains the top card.

4

Bots wait for the table

The host and the screen read the same timing table, and the host holds every bot until the last card has landed. A test asserts it.

the felt follows the colour in play
The same table with the felt turned blue after a blue Draw Two, and ‘You drew 2’ under the piles
round over · every leftover card, counted
The round-over screen: ‘You win the game!’, the scoreboard, and every opponent's leftover cards with their points
05built for phones

Built for a group of friends
on their phones.

Which is where most of the hard problems came from. A phone drops a page’s connections the moment you switch apps, sits behind a carrier that hides it, and has a notch where the buttons want to go.

The NUNO home screen on a phone: the logo above a setup panel with mode and theme tiles, players, bot skill, game length and a PLAY button
A room lobby on a phone: room code and Invite button, the voice-chat bar, and six seats with the host and five bots
A six-player table on a phone in portrait: a tall oval with blue felt, the hand as a strip along the bottom, and a ‘You're skipped!’ bubble

home

a room

the table

Switching apps no longer ends the room

Sharing the invite in WhatsApp used to be enough to kill it. Now the host reconnects under the same room code, friends who open the link while the host is away wait for them, and a host whose phone reloaded the page gets the same room back.

A dropped friend keeps their seat

Held for two minutes in the lobby. Mid-game, a bot plays it until they’re back — then they take their own seat and their own hand again.

Voice chat in every room

Mic off until you tap it, a green ring around whoever is talking, and a mute for anyone individually.

Mixed seating

Each game shuffles the table so friends are spread out with bots between them, rather than all in a row.

Tap to read, tap again to play

Big hands become a swipeable strip, menus open as bottom sheets, and the layout stays clear of the notch and the home bar.

A relay for mobile data

Phones behind carrier NAT can be relayed while everyone else stays direct — and the game tells “the host is away” apart from “your network is blocking the link”.

06seven themes · 62 characters

Seven themes.
Each one repaints everything.

Classic plus six anime-inspired themes. A theme restyles the whole app — scenery, table, card backs and faces, fonts, particles, effects, sound effects, the soundtrack, bot names, trash talk, what every play is called, and a rank under every seat that changes as the hand shrinks. Pick one below; this panel repaints the way the game does.

A six-player Classic table on the player's turn: green felt, five bot opponents around an oval, the prompt ‘Match Green or 6 — or play a Wild’, and the playable cards lifted out of the hand
NUNO Classic · at the table
The NUNO home menu: the logo and a fan of cards on the left, the setup panel with name, mode, theme, players, bot skill and game length on the right
home
A SKIP! splash over the discard pile reading ‘Duchess Duck misses a turn’, with a ‘Skipped!’ bubble at her seat
splash

The original

🎴 NUNO Classic

The original toy-box look.

A sunburst in the four card colours, chunky ink outlines with hard shadows, and SVG cards drawn in the classic style — tilted oval, outlined numbers, quartered Wild.

  • Fully original — every card is SVG, every effect procedural, every sound synthesised
  • Fourteen emoji bots with names to match: Granny Bluff, DJ Draw Two, Sir Skips-a-Lot
  • The default theme, and the one the rest of this page is shot in
Display face · Lilita One + FredokaEmoji bots

62 characters, in their own voices

Across the six anime themes, characters become the bot opponents, pickable avatars cropped to the face, and fighting-game cut-ins that whip across the table when they play an action card or shout NUNO. Each one has six trash-talk lines only they would say.

The host’s theme is the room’s

In an online room everyone switches to the host’s theme, follows along if the host changes it mid-game, and gets their own theme back on leaving.

Nothing saved until Select

A full-screen gallery repaints itself as a live preview while you swipe. Tapping Select plays the theme’s entrance — and only then is it saved.

07sound · bots

Every sound is synthesised.
Every bot talks back.

There are no audio files. 79 sound effects and 8 soundtracks are generated live with WebAudio by a small step sequencer — one soundtrack per theme, two for Classic — and the music picks up when someone is one card from winning.

airhornsad trombonewolf whistletaikosword shingki chargecannonbeam…and 71 more

Three difficulties that differ in how smart and how forgetful the bots are — and they trash-talk back from 438 ready-made lines: 18 general, 48 for the themes, 372 in the characters’ own voices.

chance of… Chill Normal Savage
Remembers to shout NUNO
75%
88%
97%
Catches you forgetting
35%
60%
90%
Bluffs a Wild Draw Four
0%
6%
15%
Stacks a draw in No Mercy
60%
85%
100%

From the bots’ tuning table in the game’s source.

08the build · decisions with reasons

Seven decisions,
and what each one bought.

Three days, eleven commits and about 18,100 lines of TypeScript, built with Claude Code. What made that possible was deciding a few things early and not revisiting them.

1

The rules are a pure reducer.

State plus action gives a new state, and an illegal move returns the same object untouched. That made six rule sets testable by simulation: every test run plays 1,020 bot games — 300 Classic plus 120 in each of the six modes — and checks that no card is ever lost or duplicated.

2

The host is the referee, not a server.

A friends’ card game doesn’t need infrastructure. The cost is that the host leaving ends the game — an accepted trade.

3

One clock for the screen and the bots.

Every animation timing lives in one file that both the table and the host read. The host holds the bots until the table has caught up, and the Relaxed / Normal / Quick pace scales both.

4

Phones first, measured in what not to do.

No live blur — backgrounds are blurred at build time. Card flights on the Web Animations API and hand movement in CSS transitions, both off the main thread. An effects canvas that sleeps when idle and lowers its own particle count when frames drop.

5

Art is processed once, offline.

A Python script trims the originals, crops each character’s face, compresses to WebP and writes a manifest. The site ships only the small copies.

6

Keys stay off the phone.

The relay’s API token lives in a serverless function that hands each player credentials that expire after six hours.

7

Plain words everywhere.

Splashes, errors and How to Play — every rule and every card, in every mode — are written for someone who has never read an instruction sheet.

1,020

bot games simulated on every test run

Part of 100 tests, all passing. Thirteen of them run whole rooms against a fake PeerJS.

09every screen

The rest of the game,
screen by screen.

Captured from the live build in the Classic theme.

The opening
NUNO's opening screen: four tilted card tiles spelling NUNO over a fanned deck, with a yellow TAP TO PLAY button

N, U, N slam down, the O arrives late — and TAP TO PLAY is the tap that unlocks sound.

Home
The NUNO home menu: the logo and a fan of cards on the left, the setup panel with name, mode, theme, players, bot skill and game length on the right

The whole setup on one screen: name, mode, theme, bots or friends, players, skill, length.

Mode picker
The mode picker listing all six modes — Classic, No Mercy, Flip, Attack, All Wild and Spin — each with the game it is based on and its deck size

Six rule sets, each with the game it is based on and its deck size.

How to Play
How to Play for Classic: mode tabs, your turn step by step, and the rules for setup and challenging a Wild Draw Four

Every mode step by step, every card with its count and points — matched to the engine.

Wild colour picker
The Wild colour picker: a four-colour wheel showing how many cards of each colour the player holds

The numbers show how many of each colour you hold.

The felt follows the colour
The same table with the felt turned blue after a blue Draw Two, and ‘You drew 2’ under the piles

A blue Draw Two turned the table blue; the line underneath says what it did to you.

Attack’s launcher
An Attack-mode table: no draw pile, a red card launcher marked HIT in its place, and the prompt ‘Hit the launcher (2 left)’

No draw pile — a launcher sits in its place, and the prompt counts your presses.

Round over
The round-over screen: ‘You win the game!’, the scoreboard, and every opponent's leftover cards with their points

Scores count up, and every leftover card is laid out with what it was worth.

10engineering notes

Four problems
worth writing down.

01

Sharing the invite killed the room

The constraint

Phones cut a page’s connections the moment you switch apps. Opening WhatsApp to send the invite link was enough to kill the room the link pointed to.

The resolution

The host now re-registers with the signalling server under the same room code whenever the link drops, and renews it after eight seconds in the background. Each tab carries an id, so a returning player is given their own seat and hand back. Thirteen end-to-end tests run rooms against a fake PeerJS to keep it that way.

“The act of inviting a friend was the thing that ended the game.”
02

Bots that wait for the table

The constraint

The game state changes instantly; the screen needs time to show it. Early builds let bots play while the previous card was still in the air, and a round was over before anyone could follow it.

The resolution

Every event has a duration in one shared timing table. The host adds those durations up and holds every bot until the table has caught up. The fix was to slow the bots to the speed of the table — not to speed the table up.

“The game is instant. The table is not. The bots now wait for the table.”
03

No server, and still a secret

The constraint

With no server, the host’s browser holds everyone’s cards — and a bluffed Wild Draw Four is only a bluff if nobody can see the hand.

The resolution

The host never sends the raw game. Each player gets a view built for their seat: their own hand, other players’ counts, nothing from the draw pile, and no bluff flag. Card ids are reassigned after every shuffle. Only the challenger sees the offender’s hand after a challenge.

“Each phone is told exactly what its player could see at a real table, and nothing else.”
04

Phones on mobile data couldn’t find each other

The constraint

On Wi-Fi, direct links almost always work. On mobile data, thousands of phones share one public address, and joining hung on “Finding the room…”.

The resolution

A small serverless function fetches short-lived Cloudflare TURN credentials so blocked players are relayed while everyone else stays direct. The game checks whether the relay answers from your network, and a blocked guest is told their network is the problem — not that the host left.

“Waiting for the host and being blocked from the host look identical. Now the game tells them apart.”
11constraints · honest postscripts

What it can’t do,
stated plainly.

The host leaving ends the game

Everyone is connected to the host, not to a server, so there is nothing to hand the game to.

Games aren’t saved

No accounts means no history and no stats between sessions.

Rooms need a public signalling server

Players find each other through PeerJS’s free public server. If it is down, rooms can’t open — solo games against bots are unaffected.

The mobile-data relay isn’t switched on yet

It is built, tested and deployed, but its Cloudflare keys haven’t been added in production. Until they are, some phones on mobile data may not be able to join. Checked 14 Oct 2026.

What went wrong on the way

  • The first version shipped with a dead “Play again” button — it sent a request the rules engine rejected.
  • Invite links could seat the same person twice: a session destroyed while PeerJS was still loading connected anyway. Fixed the same day.
  • It was too fast to follow. Bots played while cards were still in the air.
  • Phones stuttered in long games — live blur filters, and a fresh audio buffer for every sound effect. Both removed.
  • Wide anime fonts overflowed everything: names cut off, splash words off-screen. Text is now measured and sized per font.

Every one of them is fixed, and each fix is in the commit history.

NUNO is an independent, fan-made project that follows the published rules of UNO and its spin-offs. It is not affiliated with or endorsed by Mattel, which owns the UNO name, nor by the creators and publishers of the series its themes are inspired by — those characters and that artwork belong to them.

12the stack
React 18TypeScriptViteTailwind CSSPeerJS · WebRTCWebAudioCanvas 2DWeb Animations APIFramer MotionVitestVercel FunctionsCloudflare TURNPython · PillowBuilt with Claude Code

Open a room in two tabs.
Then call the bluff.

Every claim on this page can be checked in the live game — host a room in one tab and join it from another, or challenge a Savage bot’s Wild Draw Four and see what it was holding.

Questions this page answers

What game modes does NUNO have?
NUNO has six modes, each following the published rules of the UNO game it is based on: Classic (108 cards), No Mercy (168), Flip (112 two-sided), Attack (112, with a card launcher instead of a draw pile), All Wild (112, every card wild) and Spin (108, with a nine-space wheel). Decks, card effects and scoring match the official games. NUNO is an independent fan project and is not affiliated with Mattel.
How does NUNO run online multiplayer without a game server?
In NUNO the host’s browser runs the authoritative game, and every other player connects to it directly over WebRTC using PeerJS; a public signalling server only introduces the browsers to each other. The host sends each player a view built for their own seat — their hand and everyone else’s card counts, never the draw pile or whether a Wild Draw Four was a bluff. The trade-off is that the game ends if the host leaves.
Can you play NUNO with friends on a phone?
Yes. NUNO was built for friends on phones: the host opens a room, shares a six-letter code or link, and bots fill any empty seats. It has built-in voice chat, holds a dropped player’s seat for two minutes in the lobby, and keeps the room alive when the host switches apps to send the invite. Some phones on mobile data need a relay that, as of October 2026, is not yet switched on.

Let's Build
What Comes Next.

Suman Debnath Signature

Open to meaningful collaborations, AI-native systems, product strategy, and future-focused conversations.

“Human instinct. AI amplification.
Systemic execution.”

Suman Debnath

·

Brand Marketing Leader & AI Product Builder

© 2026

This site records visit data — pages viewed, time and scroll depth, device, your IP address and the approximate location and network provider derived from it — and sends it to me privately. It also runs Google Analytics and Vercel Analytics. Full detail and how to opt out.

This site, its code and its content are © 2026 Suman Debnath. All rights reserved — none of it is open source, and copying it needs permission first. Terms of use.