- A room opened with Play now never loads /join: the API's answer to POST /api/rooms is counted as rooms opened here. - Link previews (Slack, Discord, Facebook, iMessage, WhatsApp and the rest) are reported as where the link was shared, since the people who click them arrive with no referrer. WhatsApp's fetcher is a bot now. - An address that asks for a scanner's paths, or keeps coming back without opening a game, is a bot's all day; so is a browser that loads pages at a steady interval from a new address each time, never playing. A declared bot is still judged request by request. - The site's own addresses, sslip.io included, are not referrers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
Hnefatafl
The Viking board game, in the browser: the attackers must take the king, the king must reach the edge. Tablut, the nine-by-nine game Linnaeus wrote down in 1732, by default, on a board that shows its age; Copenhagen rules on the eleven-by-eleven board, where the king needs a corner, as an option.
Built on the game kit: src/lib/game/ is the game (rules as data in
rules.ts, the board's mechanics in board.ts, the engine in index.ts,
a short alpha-beta bot in bot.ts), src/lib/components/Board.svelte is
the board, and everything else is the kit's hall, tables, gallery, ledgers,
reports desk and ops tools. docs/conventions.md is the house style; the
guide here departs from it in one way, walking the page in words and one
drawn figure rather than screenshots.
npm install && (cd server && npm install)
npm run server # the game server on port 8789
npm run dev -- --host
Tests: npm test. Deploy: deploy/deploy.sh <ip> after deploy/README.md.