Skip to content

skulk-fair-v1

Nobody picks the Seeker. You can check.

Every official round commits to a secret seed before entries open and reveals it when the hunt begins. With the seed and the frozen player list, your browser recomputes the Seeker, the spawn order and the overtime halt order. No trust in us.

  1. 01

    Commit

    Fingerprint published

    Round announced

  2. 02

    Enter

    Players qualify

    Entries open

  3. 03

    Freeze

    List locked + sorted

    Entries close

  4. 04

    Reveal

    Seed published, Seeker derived

    ~60 s before start

  5. 05

    Verify

    Anyone recomputes

    Forever

The exact algorithm

Isomorphic code: the match server and this website run the same functions. No Math.random anywhere in the draw.

secretSeed
32 cryptographically random bytes, 0x + 64 hex

Generated when the round is created. Stored encrypted server-side, never shown before the reveal.

seedCommit
0x + hex(SHA256(bytes(secretSeed)))

Published on the round page the moment it's announced — before anyone can enter.

ordered
participant ids sorted by UTF-16 code unit, duplicates rejected

The qualified entrants plus AI seats, frozen when entries close. Never connection order.

roundSeed
SHA256(utf8("skulk-fair-v1\n" + lower(secretSeed) + "\n" + roundId + "\n" + ordered.join("\n")))

Mixes the secret with the exact list, so no seed can be chosen to favour anyone.

seekerIndex
uint256(roundSeed) mod ordered.length

The Seeker is ordered[seekerIndex].

HashDRBG
block_i = SHA256(bytes(roundSeed) ‖ utf8(label) ‖ u32be(i))

Big-endian u32 words; integers in [0,n) by rejection sampling, no modulo bias. Labels: spawn, zones, map-variant.

event chain
h[n] = SHA256(h[n-1] ‖ canonical(event[n])), h[-1] = 32 zero bytes

Every match event is hash-chained; the live server signs the final hash with Ed25519. Edit one event and the chain breaks.

✓ We can't pick the Seeker

The seed is fixed before entries open. Changing it breaks the published commitment.

✓ Players can't game it

The round seed depends on the whole frozen list. Joining late or reordering changes nothing you control.

✓ Results can't be rewritten

Events are hash-chained. The site rejects any result whose chain doesn't reproduce.

Verify a round

RoundStatus
#002FinalRecalculate →
#001CanceledView →