openrackem is a card game about sorting, in the shape of Rack-O. You hold a rack of ten cards and you want them in ascending order, top to bottom. On your turn you draw the top of the deck or take the face-up discard, then slot that card into your rack, bumping whatever it replaces onto the discard, or throw a deck draw away. The first player whose whole rack reads low to high goes out and ends the round.
Going out is worth 75. Turn on bonus scoring and an unbroken run from the top pays more the longer it is: fifty for three in a row, up to four hundred for six or more. Miss the finish and you still score the run you built. Rounds add up to a target you set, 500 by default, and at a four-person table you can pair off two on two. The deck grows with the table, so a fuller game deals from a wider spread.

I built it to take a full multiplayer game all the way through in C, from the card logic to a public server, and to have something my friends and I could actually play together across whatever devices we happen to be holding.
Play against anyone
The point of openrackem is the live game. Every platform talks to the same server, so a phone, a laptop, and a browser tab can sit at one table together. Pick Quick Match to drop into the next open game, or create a private room and share the six-character code. Set a name once and it sticks, and it is what the other players see across the table.
A small authoritative daemon, also written in C, runs the matchmaking and holds the one true game state. It deals, enforces the rules, and redacts each player’s view so a client only ever learns what it should. Turn clocks keep a game moving. Step away too long and the computer takes your seat until you are back, a dropped connection quietly reclaims that seat on reconnect, and an empty chair is filled by an AI so a table never stalls waiting on a fourth.
How it is built
The rules are one platform-independent C file, shared unchanged everywhere and covered by tests that need no window. A whole match is deterministic from a seed and a list of actions, which is what makes the online game verifiable: real two, three, and four-player matches play out over an actual socket against the daemon in CI on every push.
Drawing, input, and audio go through raylib on every platform except iOS, which has its own backend written in Metal and UIKit with no raylib at all. The online transport is a hand-written RFC 6455 WebSocket client, with TLS supplied by whatever each platform already ships: OpenSSL on Linux and Android, SChannel on Windows, Network.framework on Apple, and the browser’s own stack on the web. There is no third-party networking library.
Desktop windows resize freely, and the board is drawn at the window’s real resolution instead of a stretched thumbnail, so it stays crisp at any size. Desktop builds can record a session straight to an H.264 MP4 with no external tools.
Every push to main builds all six platforms, runs the full-match online tests against the daemon, and then deploys the daemon itself. The running server never drifts from the released client.
Layouts
There are two renderers, and the build picks one.
- Landscape, on desktop and desktop browsers: opponents down the left, your labeled rack in the middle, the deck, discard, held card, and score on the right. The window resizes freely and the layout scales to fill it.
- Portrait, on phones and tablets: adaptive to the live screen, your rack filling the height with the deck and discard in a thumb-friendly band across the bottom. No on-screen buttons. Everything is a tap or a swipe.
The web build compiles both and picks at load from the primary pointer type. Coarse pointer gets portrait and touch, everything else gets landscape and the keyboard.
Controls
Keyboard, on desktop and desktop browsers:
| Key | Action |
|---|---|
| S / Left | Draw from the deck |
| D / Right | Take the face-up discard |
| Up / Down | Move the rack cursor |
| Enter / Space | Place the held card, or confirm |
| X | Throw away a card drawn from the deck |
| Typing | Enter your name or a room code |
| Escape | Back to the menu |
| Alt+Enter | Toggle fullscreen |
Touch, on phones, tablets, and mobile browsers: tap a pile to draw, tap a rack slot to place, and two-finger tap to go back. Menus are taps and swipes.
In the browser
The same C compiles to WebAssembly with Emscripten, so the browser version is the game and not a separate port. Same rules, same server, same code. Play it here, including live online against players on native builds. Nothing to install.
Download
Every push to main cuts a release with per-platform builds: Linux, macOS, and Windows archives, an Android APK, and the WebAssembly bundle. Source is on GitHub under MIT, and the README has the build instructions.