Skip to content

NIP-101g: Golf Events#2272

Draft
DocNR wants to merge 1 commit intonostr-protocol:masterfrom
DocNR:nip-101g
Draft

NIP-101g: Golf Events#2272
DocNR wants to merge 1 commit intonostr-protocol:masterfrom
DocNR:nip-101g

Conversation

@DocNR
Copy link
Copy Markdown

@DocNR DocNR commented Mar 18, 2026

Summary

NIP-101g defines event kinds for golf scoring on Nostr:

  • kind 33501 — Golf Course (addressable): course metadata with per-hole per-tee data (hole_tee tags), tee ratings, coordinates (hole_geo), and course imagery
  • kind 1501 — Round Initiation (regular, immutable): declares participants, embeds an authoritative course snapshot and rules template in content. The embedded snapshot — not the 33501 — is the source of truth for scoring
  • kind 31501 — Live Scorecard (addressable, replaceable): real-time score updates as a UX convenience layer, addressed by the 1501 event ID
  • kind 1502 — Final Round Record (regular, immutable): permanent scoring record with per-hole scores, referencing the 1501

Design highlights

  • Self-contained rounds: The 1501 embeds a full course snapshot so rounds are verifiable even if the 33501 is updated or deleted
  • Multiplayer: All players listed as p tags in the 1501; each publishes their own 31501/1502. Roster validation via p-tag check
  • Course discovery: g (geohash) tags enable relay-indexed proximity queries. Multiple publishers can create 33501s for the same physical course
  • Relay-friendly queries: Filter recipes use standard indexed tags (#e, #d, #a, #g). Domain-specific tags (hole_tee, score, etc.) are parsed client-side

Reference implementation

  • Client: Gambit Golf (iOS) — fully implements all 4 kinds
  • Relay: wss://relay.gambit.golf — stores and serves all kinds

Related

  • Part of the NIP-101 sports/activity family (alongside NIP-101e for exercise)
  • Uses NIP-22 for round commentary
  • Comparable to NIP-64 (Chess) as a domain-specific event spec

🏌️ Built with Claude Code

Draft NIP defining event kinds for golf scoring on Nostr:
- kind 33501: Golf Course (addressable, course metadata)
- kind 1501: Round Initiation (immutable, embedded course snapshot)
- kind 31501: Live Scorecard (replaceable, UX layer)
- kind 1502: Final Round Record (immutable, permanent scores)

Reference implementation: Gambit Golf (iOS)
Relay: wss://relay.gambit.golf
@fiatjaf
Copy link
Copy Markdown
Member

fiatjaf commented Mar 18, 2026

Haven't read yet, but this is nice.

Comment thread 101g.md

```jsonc
{
"course_snapshot": {
Copy link
Copy Markdown
Collaborator

@vitorpamplona vitorpamplona Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

couldn't this json be just tags?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The 33501 course event is mutable — courses get updated, holes change, ratings get revised. But a completed round needs to permanently reflect the exact conditions it was played under. Embedding the snapshot in content keeps the round self-contained and independent of the current state of the referenced 33501.

The plan is to eventually canonicalize and hash the content JSON so verifiers can confirm the snapshot matches — which I'm already doing in the app. Open to a better pattern if you have one in mind!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants