Skip to content
kibitz

end-to-end encrypted · thirteen games · chat

Pull up a chair, play a friend.

kibitz is thirteen games — chess, backgammon, checkers, reversi, Connect Four, Gomoku, Hex, Dots & Boxes, Go, Xiangqi, a provably-fair Battleship, Gin Rummy dealt by a shuffle neither player nor the server can rig, and Gomoku Party for two-to-four players — with a chat alongside, over one end-to-end-encrypted session. You get a code phrase like lion-42-maple, a share link, and a QR; friends join to play or to kibitz. The relay that carries it all can never read a move, a card, or a message.

kibitz

what's on the table

Thirteen games, one encrypted session.

Games start on demand from a picker and run side by side — play a chess game and a backgammon game at once, chatting the whole time. Every rules engine is pure Go, compiled to WebAssembly, and runs identically on every screen. Most have a "Hard" computer opponent for solo play, and Gomoku Party seats two-to-four players at one board.

A chess game in the kibitz app

Chess

The full ruleset — castling, en passant, promotion, draws and resignation — via the maintained corentings/chess engine. Kibitzers watch and heckle in chat.

A backgammon game in the kibitz app

Backgammon

With a commit-reveal dice roll: each roll is committed then revealed, so neither side — nor a spectator — can doctor the dice. Forced moves and bear-off, all validated both sides.

A checkers game in the kibitz app

Checkers

American draughts with forced captures — the engine walks every capture chain, so a jump you're owed is a jump you must take.

A reversi game in the kibitz app

Reversi

Othello, flips and all. Legal moves and passes are computed by the shared engine, never asserted — so both boards always agree on the count.

A Connect Four game in the kibitz app

Connect Four

Drop, connect, gloat. A quick one between the longer games — with the disc-drop animation and a hover ghost showing where your piece will land.

A Gomoku game in the kibitz app

Gomoku

Five in a row on a 15×15 board. Easy to start, sharp the moment you spot a double threat — place a stone, block a line, and the last move glows.

A three-player Gomoku Party game in the kibitz app

Gomoku Party 2–4 players

Five-in-a-row for a crowd: two to four players share one 19×19 board, each a color, taking turns. kibitz's first game for more than two — everyone in the session pulls up a chair.

A Hex game in the kibitz app

Hex

Connect your two edges across a rhombus of hexagons — red top-to-bottom, blue side-to-side. Hex can't be drawn: somebody's chain always gets there first.

A Dots and Boxes game in the kibitz app

Dots & Boxes

Claim edges; close the fourth side of a box and you score it and move again. The whole game turns on who's forced to open the next chain.

A game of Go in the kibitz app

Go

Go on a 9×9 board — surround territory, capture stones, pass when nothing's left to gain. Suicide and ko are enforced; scored Chinese-style with komi.

A Xiangqi (Chinese chess) game in the kibitz app

Xiangqi

Chinese chess, the full ruleset — the river, the palace, cannons that leap to capture, and the flying-general rule. Give check, force mate.

A Battleship game in the kibitz app, showing hits and misses

Battleship

Provably fair: each cell of your fleet is a cryptographic commitment made before the first shot. "Sunk" becomes a public derivation — there's no message left to lie in.

A Gin Rummy hand in the kibitz app

Gin Rummy

Dealt by a "mental-poker" shuffle: the two of you jointly shuffle so neither player — nor the relay — knows the deck or the other's hand, yet every card is provable at showdown. Meld, knock, and play a match to 100.

provably fair

Two games can't be cheated — even by their own players.

Encryption stops the relay from reading a game. But hidden-information games raise a harder question: how do you trust your opponent, with no referee in the middle? Two of kibitz's games answer it with cryptography instead of trust — and backgammon's dice use the same commit-reveal trick.

Battleship — commit before you fire

Each cell of your fleet is a cryptographic commitment locked in before the first shot. Every "hit", "miss", and "sunk" is then a public derivation checked against those commitments — there's no message left to lie in, and no hidden server that could. Move your ships after the fact and the maths simply won't verify.

Gin Rummy — a shuffle nobody controls

The deck is shuffled by mental poker: you and your opponent each encrypt and shuffle it with a commuting cipher, so neither of you — and certainly not the blind relay — knows the order or the other's hand. At showdown you reveal your keys, and the deck is proven to decrypt to a fair, untouched 52 cards. A dealerless deal with no dealer to trust.

All three build on the same primitive: commit to a secret first, reveal it later, and let everyone check the maths.

how it's private

The relay is blind.

Your code phrase never reaches the server — it seeds a PAKE handshake between you and each friend. From that, everyone shares a group key; every move, dice roll, dealt card, and chat line is sealed with XChaCha20-Poly1305 before it leaves the tab. The relay only forwards opaque frames between participants: it sees connection counts and a session id that's a one-way hash of the phrase, and nothing else. Self-host the one-binary relay or use the hosted one — either way it can't read a thing.

// the phrase is the secret — it never
// travels; the session id is a hash
sessionID = SHA-256("kibitz/v1" ∥ phrase)[:16]

// PAKE → pairwise key → group key
key  = HKDF(pake.SharedKey())
seal = XChaCha20Poly1305(key, frame,
         AD: sessionID ∥ version ∥ sender)
# what the relay can see
session   a1b2c3…  (hash, not the phrase)
members   2 players + 3 kibitzers
frames    ▓▓▓ opaque ciphertext ▓▓▓

# what it can never see
moves·dice·cards·chat·names   ✗ sealed

Games sync both-sides-validate — each client runs the same deterministic engine and checks a state hash, so there's no authoritative server to trust or to breach. Read the full threat model ↗.