- Sashité for Developers
- Nostr
Sashité on Nostr
A complete, open protocol for playing turn-based abstract strategy board games of the chess family over Nostr: every act of a game — the challenge, the pairing, each move, the verdict, the rating, even a composed puzzle — is a signed, public, relay-distributed event. No proprietary server holds the game: any client can replay a session from public events alone, verify every signature and every rule the protocol fixes, and reach the same board, the same clocks, and the same result.
Why a protocol, not a platform
Building play on Nostr buys three properties no account system offers:
- Identity without accounts. A player is a keypair. There is nothing to register, nothing to host, and nothing the operator can lock in — the same key plays on any deployment that speaks the protocol.
- Games that outlive their server. A finished game is a chain of signed events on public relays. It can be re-verified, re-published, cited, or imported by anyone, forever — the game record belongs to the players.
- Verdicts you can check. Arbiters, matchmakers, and rating authorities are just keys, too. Their rulings are signed events over public inputs, so every consumer can decide for itself whom to trust — and audit what it trusted.
The suite at a glance
The suite is specified as a family of NIPs — written standalone and deployment-neutral, the way upstream NIPs are. Thirteen suite kinds cover the session lifecycle: challenges and matchmaking, the game session, plies, adjudication, rematches, challenge policies, moods, and composed puzzles with their validations. Five generic NIPs define the timing and rating primitives the suite consumes — usable by any Nostr application that needs a trustworthy timestamp or a signed rating, and candidates for upstream submission.
Where to start depends on what you are building:
- A client — Game Session and Ply, then the two challenge paths (Open / Direct).
- A relay — the Self-Timed Timing Relay
profile: what a strict
created_atingestion window commits you to. - An arbiter or rating service — Adjudication and the two rating attestations.
- A puzzle ecosystem — Composition and Validation: positions published under a stipulation and a machine-checkable proof.
Verifiable timing
A turn-based game is a fight about when at least as much as about what: a
move’s timestamp decides races, clocks, and timeouts, yet a Nostr event’s
created_at is a self-claim. The suite’s timing foundation — the
Canonical Timing NIP — makes it trustworthy in
one of exactly two ways, designated in-band at the founding of every session:
a timestamper whose signed
Event Timestamp Attestations
carry the authoritative timing (attested mode), or one or more designated
timing relays — relays conforming to the
Self-Timed Timing Relay profile, whose
strict created_at ingestion window makes each accepted event’s own timestamp
non-backdatable (self-timed mode, the default).
Reference deployment
Sashité operates the reference deployment — Sanki, where chess, ōgi, and xiongqi are played on one board, across variants — with open-source reference implementations of every role the protocol names: client, arbiter, matchmaker, rater and timestamper bots, and the timing-relay policy. The NIPs themselves are deployment-neutral; Sashité appears in them only as the reference deployment.
Source of truth, and where to discuss
The canonical source of the NIPs is the public
sashite/nostr repository — one
standalone markdown document per NIP under nips/, following the layout of
nostr-protocol/nips, beside the
machine-readable registry
of kinds, markers, and shared constants. Issues and pull requests are the
place to discuss these specifications. The pages under
/nostr/nips/ are generated from that repository and never
edited by hand.
Authored by Cyril Kato (Sashité). The NIPs are public domain, like the Nostr NIPs themselves. (The rest of sashite.dev’s specifications remain under the Open Web Foundation Agreement 1.0.)
