Commit Graph
47 Commits
Author SHA1 Message Date
Eric WagonerandClaude Opus 5.5 c3fca6c5c7 TabbedDialog and the boxed tab strip, as Dip has them; the tally's comment describes the tally
TabbedDialog keeps its own backdrop here, since the template has no
shared one; a game that has one may drop it. The template's hall still
opens its about panel with About.svelte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-28 14:47:11 -04:00
Eric WagonerandClaude Opus 5.5 6039b6c248 Tabs.svelte: the about panel's strip, shared with long reading pages
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-28 13:52:15 -04:00
Eric WagonerandClaude Opus 5.5 c55534dbd6 dev:all stops both sides when the server's port is taken
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-28 13:43:15 -04:00
Eric WagonerandClaude Opus 5.5 cf5af67505 npm run dev:all starts the server and the site together
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-28 12:37:56 -04:00
Eric WagonerandClaude Opus 5.5 d10c17da9b The about panel no longer credits its making
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-27 20:58:53 -04:00
Eric WagonerandClaude Opus 5.5 7207cd9c29 The tally is told as Wiz-War tells it: the game's own story on cards, then the ledgers in detail
A few counts that are the game's story (games finished, how they were
won, hours at the table) stand large on cards in the accent color, the
rest follow in a column of figures, then the fine print: Tally.svelte,
shared through the kit, with each game choosing its counts and words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-27 20:48:05 -04:00
Eric WagonerandClaude Opus 5.5 813d111bbd The about panel is a dialog of tabs, as Wiz-War's is, not a wall of text
"About this game — a labor of love" opens a dialog with the game, the
tally, more games and a way to send word each on a tab of its own
(About.svelte, shared through the kit), instead of one long fold at the
foot of the hall. Arrow keys walk the tabs; Escape or a click outside
closes it; a link to #about opens it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-27 20:40:39 -04:00
Eric WagonerandClaude Opus 5.5 ae904aa88c Traffic counts what matters: rooms opened from the site, where links were shared, scanners and monitors as bots
- 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
2026-09-27 09:59:36 -04:00
Eric WagonerandClaude Opus 5.5 5f11bec96d Dip joins the family
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-27 01:29:26 -04:00
Eric WagonerandClaude Opus 5.5 e521a66f5c A socket's own error closes that socket, not the server
A message over the size limit or a malformed frame raised an error on
the socket, which had no listener, and Node ended the process: one
message from anyone could take the server down until systemd restarted
it. The socket is terminated instead. Messages are capped at 1 KB, since the server never reads them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-27 01:21:44 -04:00
Eric WagonerandClaude Opus 5.5 1dbf5763e1 The hall counts its visitors: a digest, a nightly rollup, and the games it sends people to
gamehall/ops holds the traffic counter, the visitors digest and the
nightly rollup, installed by gamehall/deploy.sh; the gamehall-visitors
skill reads them. The hall now sends its origin as referrer, so a game
can tell who came from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-26 12:41:55 -04:00
Eric WagonerandClaude Opus 5.5 8ab1e0b794 The hall seats Dip: a card of its own chart, four games two by two, and a new share image
Dip is not in family.json yet, so the games' about panels do not list it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-26 12:15:35 -04:00
Eric WagonerandClaude Opus 5.5 7268c3f1ae Kestrel's Hall moves into the kit and onto the shared host
The landing page was a static page in the blog, served by the Yunohost
box through an nginx drop-in and an SSOwat rule. It now lives in
gamehall/site beside family.json, is served by Caddy on the shared host
with the games (gamehall/gamehall.caddy), and publishes with
gamehall/deploy.sh. Its share image is its own, not the blog's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-26 12:11:00 -04:00
Eric WagonerandClaude Opus 5.5 a9c0f68cb1 Conventions: create receives the table options
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-26 00:35:35 -04:00
Eric WagonerandClaude Opus 5.5 6aac3f9068 The space after Back to your game is kept
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-25 22:56:48 -04:00
Eric WagonerandClaude Opus 5.5 7f340698d5 A move names the round it was made for; a stale one is refused
The room counts rounds played and sends the count in its view; a page
sends it back with each move, and the server refuses a move whose count
is behind (a slow connection, a second click, a stale tab), or that has
no count at all (an old page, told to reload). Before, such a move was
taken as the move for the next round. Found in Dip's acceptance run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-25 22:19:43 -04:00
Eric WagonerandClaude Opus 5.5 af5a8518c7 The Slack alert script carries the workspace's Slack integration id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-25 17:19:23 -04:00
Eric WagonerandClaude Opus 5.5 bc5f93c2fa The kit sets games up on the shared hall host
setup-droplet.sh prepares a host several games share and adds this game
to it: its own Caddy site file, port, user, trees and access log, with
/etc/caddy/Caddyfile only importing sites/*.caddy. setup-server.sh is
folded in. A slug that is already a system group stops the setup with a
clear word. new-game.sh now stamps .py files too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-25 16:49:03 -04:00
Eric WagonerandClaude Opus 5.5 cd9d14ec35 The voice: every game speaks in its own world
Conventions gain a section on in-game language: an image with every
fact, the fact exact, unfolding effects told a turn at a time and naming
the turn they end on, our own words rather than an older version's, and
chronicle wording shipped without a rules revision. new-game.sh points
at it, and the demo game's lines follow it. Born in Waving Hands'
atmospheric chronicle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-24 23:57:59 -04:00
Eric WagonerandClaude Fable 5.1 bce01a013a The family list knows the hall: about panels link to gamehall.kestrelsnest.social, and a new game gets a card there
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 21:04:28 -04:00
Eric WagonerandClaude Fable 5.1 2d78ab6b3f The about panel says the games are free and where the hosting tip jar is
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 20:25:02 -04:00
Eric WagonerandClaude Fable 5.1 33ac0ec808 The credibility pass on Hnefatafl, ported to the template: the ops scripts count traffic through one parser, the reports digest is one program, the plaintext-token fallback and its migration are gone, and the stylesheet holds each shared rule once
From the hnefatafl repo's pass of the same day, everything that touched a
kit-shared file. The visitors digest and the nightly rollup share
deploy/traffic.py, installed to /usr/local/lib/<slug>; the rollup writes
the finished-games count it computed behind "and False". pull-reports.sh
and the reports skill both use deploy/report-digest.ts. The seat line
requires its token hash and the start line its rules revision; the
migration for ledgers written before hashing goes with them. The route
table in server/src/index.ts lists every route; Report, ReportLine and
Tally are declared once in view.ts for both sides; exports nobody
imported are exports no more.

In the client: .small, the × that dismisses, and the frame of the
reading pages are in app.css once; the preferences panel shares the
report slip's modal shape; the room store gains seatEmpty and
seatUnheld, and the lobby and the join page read those instead of
three spellings of their own. The room's moved and awaiting fields
stay: the demo board reads them, and simultaneous rounds are the
contract.

The deploy README no longer describes a browser-only game; the visitors
skill no longer names a /play route; the reports skill's replay call
carries the room's options. The Slack channel id is passed in the
environment rather than filled in as a placeholder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwFKMuQnPAEHJ5yA1q4orh
2026-09-23 20:12:37 -04:00
Eric WagonerandClaude Fable 5.1 6c42e55f59 The collection is Kestrel's Hall
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 19:50:27 -04:00
Eric WagonerandClaude Fable 5.1 baab21a0a7 The guide and the rules page keep the room they were opened from, and carry it to each other and back
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 19:13:11 -04:00
Eric WagonerandClaude Fable 5.1 c0254e3fe9 The hall's table selectors read from and write to the preferences, so the panel and the hall agree
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 18:58:18 -04:00
Eric WagonerandClaude Fable 5.1 74df9a253a Every table option is also a preference: the choice a new table starts with, shown in the panel
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 18:57:25 -04:00
Eric WagonerandClaude Fable 5.1 3825dfb44c Preferences: a panel of what the browser remembers about its player, with the kit's motion and confirm-move settings, a game's own declarations, and the host's last table options as defaults
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 18:54:22 -04:00
Eric WagonerandClaude Fable 5.1 de430c3794 A note under each table option while it is chosen, and the rules page offers the way back to the game it was opened from
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 18:48:57 -04:00
Eric WagonerandClaude Fable 5.1 7aa05536c2 The tally: what the ledgers add up to, in every game's about panel, with the game's own lines through GameSpec.tally
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 18:16:41 -04:00
Eric Wagoner 1f412a2440 app.html links the touch icon 2026-09-23 15:48:39 -04:00
Eric Wagoner 151bc81aeb new-game.sh names the share card and touch icon a game must add 2026-09-23 15:46:58 -04:00
Eric WagonerandClaude Fable 5.1 ef617a50c2 A bot whose move opens the game, or is owed after a restore, plays it at once; the over line is written once
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 14:37:39 -04:00
Eric WagonerandClaude Fable 5.1 23b72ddc6d The ledger gate replays with the table's options, and takes the site from SITE for a machine whose DNS lags
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 13:42:02 -04:00
Eric Wagoner e8b6510bf0 Hnefatafl joins the family 2026-09-23 13:38:55 -04:00
Eric WagonerandClaude Fable 5.1 b92c7db4b6 setup-droplet.sh hands the validated access log to Caddy and restarts it; the kit's first droplet found the log owned by root
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 13:16:02 -04:00
Eric WagonerandClaude Fable 5.1 63bd154798 Table options: the host's choices when opening a table, declared by the game, recorded on the room line
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 12:45:42 -04:00
Eric WagonerandClaude Fable 5.1 2ab6dc4b5f A favicon in the HTML itself, with the file in static
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-23 12:32:58 -04:00
Eric WagonerandClaude Fable 5.1 d4a2b2a84e The keeper's hour reads with a space, and noon and midnight by name
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-23 12:27:50 -04:00
Eric WagonerandClaude Fable 5.1 e846ddedc4 The family list: every game of the Kestrel's Nest in one file, shown in each game's about panel
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 12:26:46 -04:00
Eric WagonerandClaude Fable 5.1 6dce3b82f0 Rematches, seats that travel by phrase, the keeper's bell with the hour where they live, the host's leave for the gallery to talk, and seats doubted before they are dropped
Ported from Wiz-War, where each earned its keep. All on the ledger:
galleryTalk, challenge and rematch lines, gallery chat signed with a
name, held seats on a rematch table's room line. Twenty-two protocol
checks against a scratch server and a replay after restart.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
2026-09-23 12:19:03 -04:00
Eric Wagoner 65d62f2ab3 deploy.sh ships the token migration 2026-09-23 12:08:26 -04:00
Eric WagonerandClaude Fable 5.1 c934bbe434 Hashed seat tokens, ledgered inputs, refusable moves, disk-checked codes, host-only bots, and a drift script
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-23 12:07:53 -04:00
Eric WagonerandClaude Fable 5.1 ddb18cb08a The host begins at every table size and may send a bot away
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-23 11:21:42 -04:00
Eric Wagoner 457a536f58 The demo bot draws from the seed, the round and the seat 2026-09-23 11:01:32 -04:00
Eric Wagoner f1c9b29e66 new-game.sh installs the server's packages too 2026-09-23 11:00:52 -04:00
Eric Wagoner 69b7273627 A plain favicon for the template 2026-09-23 11:00:18 -04:00
Eric WagonerandClaude Fable 5.1 1cd24e3ddd The game kit: the shared infrastructure of Wiz-War and Waving Hands as a template
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up
2026-09-23 11:00:05 -04:00