Whot

The card game half of Nigeria grew up on. Follow the shape or the number, hit people with pick two, and call "check up" when your hand is empty. Play the CPU, pass one screen round, or send a friend a link.

Shuffling the deck…

Click a card to play it, or ← → and EnterM go to market1 to 5 call a shapeF full screen

Your history

Every game you've finished

Loading your games…

Stored with IndexedDB in this browser only. Nothing is sent to a server, and clearing your site data removes it.

House rules

How it plays

  • Everyone gets five cards (or seven) and one card starts the pile. On your turn, play a card that matches the top card's shape or number. If you can't, or you'd rather not, go to market and pick one, which ends your turn.
  • 1 is hold on: play again. 2 is pick two: next player picks two. 5 is pick three: next player picks three. 8 is suspension: next player misses a turn. 14 is general market: everyone else picks one. 20 is whot: call the next shape.
  • A pick two or pick three can be passed on with another card of the same number, and the pick grows as it goes. First to play their last card wins. If every card is in someone's hand, the hands are counted (stars count double) and the lowest total wins.

Under the hood

How it's built

  • Online play is peer to peer over WebRTC. The host's browser is the referee: it holds the deck, checks every move, and sends each player only their own cards, so nobody can peek at a hand from their dev tools. A free broker introduces the two browsers; after that the site has no server in the loop.
  • The rules are one pure TypeScript module, so the same code runs the CPU, the shared-screen game and the online host. The hard CPU plays fair by dealing out the cards it can't see at random and playing each option to the end a few hundred times, then picking what wins most.
  • Three.js draws the table and every card, with the faces painted into one texture at load. Drop out of an online game, or reload the page, and you rejoin with your hand intact. Finished games are kept in IndexedDB in your browser.