Play Skat online, for free.
Inspired by lichess's philosophy (free, open, ad-free, no bots) but built fresh for Skat rather than forked, since Skat (3-player, hidden-hand, trick-taking with bidding) shares almost no game model with chess.
Architecture
A TypeScript monorepo, separating pure rules from transport and UI: the one idea most worth borrowing from lichess.
| Package | Role | Status |
|---|---|---|
packages/engine |
Pure Skat rules: bidding, round state machine, scoring, match formats | ✅ done (25 tests) |
packages/server |
Authoritative game server + matchmaking lobby (WebSocket) | ✅ done (5 tests) |
packages/client |
Web UI: the table and cards (Svelte + SVG) | ✅ playable |
The engine has zero dependencies and runs on Node's built-in test runner and type stripping (no build step).
npm install # all workspace deps npm test # run all package test suites (engine + server) # from the repo root, two terminals: bun run server # game server on :8080 (Bun, hot-reload via --watch) bun run client # web client on :5173 (proxies /ws -> :8080)
Then open http://localhost:5173, pick a nickname, and create or quick-match a table.
The server is plain node:http + ws, so it runs on Bun (bun run server,
the default) or Node (cd packages/server && npm run start:node). Bun needs no
build flags and gives instant hot-reload.
Graphics
Cards are plain SVG files under packages/client/public/cards/<deck>/<id>.svg
(e.g. french/CJ.svg, french/back.svg). A clean placeholder French deck is
generated by npm run gen-deck in the client. To use custom art, just drop
replacement SVGs into that folder (no code changes). A german/ deck folder is
ready for German-suited cards.
License
AGPL-3.0-or-later, matching lichess.