0}>

__NAME__

One sentence that says what the game is, in its own world.

Two or three sentences for someone who has never heard of it: what you do on a turn, what makes it fun, and that it is free to play here against the bot or with friends.

{#if game.options?.length}
{#each game.options as o (o.key)} {@const chosen = o.choices.find((c) => c.value === options[o.key])}
{#if chosen?.note}

{chosen.note}

{/if}
{/each}
{/if}
or join one

With a code you can take a seat if one is free, or watch from the Peanut Gallery.

or bring a seat from another device
{#if error}

{error}

{/if}
{#snippet gameRow(held: (typeof seats)[number])}
{held.roomId} {status(held)}{#if unread(held) > 0} · {unread(held)} new {unread(held) === 1 ? 'line' : 'lines'} of talk{/if} {#if forgetting === held.roomId} This browser may be all that holds your seat. {:else} {/if}
{/snippet} {#if active.length}
your games
{#each active as held (held.roomId)}{@render gameRow(held)}{/each}
{/if} {#if finished.length || reports.length}
{#if finished.length}
finished games
{#each finished as held (held.roomId)}{@render gameRow(held)}{/each} {/if} {#if reports.length}
your reports to the keeper
{#each reports as r (r.id)} {@const last = r.thread[r.thread.length - 1]}
{r.roomId}

“{r.happened}”{#if r.image} (with a picture){/if}

{#each r.thread as line, j (j)} {#if line.from === 'player'}

you: {line.text}

{:else}

{line.status} {line.text}

{/if} {/each} {#if !last}

the keeper is studying the moment

{:else if last.from === 'player'}

your word is with the keeper

{/if} {#if r.thread.some((l) => l.from === 'desk')}
{ e.preventDefault(); void answer(r); }}>
{/if}
{/each} {#if answerError}

{answerError}

{/if} {/if}
{/if} {#snippet aboutGame()}

Where the game comes from, who made the original and when, and how the keeper of this page first met it.

What this version keeps and what it changes. Where the rules text it follows lives (the rules page), and any borrowed art or text with its notice.

It is free and keeps no accounts. A game between people lives on a small server as an append-only ledger of moves, so it can be replayed from its first move. Each player is shown only what the rules let them see (drop this sentence if nothing in the game is hidden).

{/snippet} {#snippet aboutTally()} {#if told} {:else}

Counting…

{/if} {/snippet} {#snippet aboutFamily()}
{#if family.length}

More games in {#if hall}Kestrel's Hall{:else}Kestrel's Hall{/if}

    {#each family as g (g.slug)}
  • {g.name}: {g.pitch} {g.players} players; {g.origin}.
  • {/each}
{/if}

The games of Kestrel's Hall are free and will stay free. They run on small servers that cost a few dollars a month, and anyone who wants to chip in toward the hosting can do so at ko-fi.com/kestrelsnest. Chipping in unlocks nothing, and the games are the same for everyone.

__NAME__ is its designer's.

{/snippet} {#snippet aboutWord()}

If a rule reads wrong, something breaks, or you have a game to tell of, write to eric@ericwagoner.com, @kestrelsnest.social on Bluesky, or @eric@toots.kestrelsnest.social on Mastodon. The keeper of this hall roosts at kestrelsnest.social.

{/snippet}