{"id":"af63365567477747ad8d2f85bc88db0a94b3a1638adbae01abd7e17601d3fd99","pubkey":"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322","created_at":1753815441,"kind":30817,"tags":[["d","geocaching-events"],["title","Geocaching Events"],["k","37515"],["k","7516"],["k","7517"],["k","1111"],["a","30817:86184109eae937d8d6f980b4a0b46da4ef0d983eade403ee1b4c0b6bde238b47:geocaching-events","","fork"],["p","86184109eae937d8d6f980b4a0b46da4ef0d983eade403ee1b4c0b6bde238b47"],["client","nostrhub.io"]],"content":"NIP-GC\n======\n\nGeocaching Events\n-----------------\n\n`draft` `optional`\n\nThis NIP defines event kinds for geocaching on Nostr. These events allow users to create, share, and log geocaches in a decentralized manner.\n\n## Geocache Listing Event (Kind 37515)\n\nGeocache listing events are addressable events of kind `37515` with the following structure:\n\n```json\n{\n  \"kind\": 37515,\n  \"content\": \"<cache description>\",\n  \"tags\": [\n    [\"d\", \"<cache-identifier>\"],\n    [\"name\", \"<cache-name>\"],\n    [\"g\", \"<geohash>\"],\n    [\"difficulty\", \"<1-5>\"],\n    [\"terrain\", \"<1-5>\"],\n    [\"size\", \"<size>\"],\n    [\"t\", \"<type>\"]\n  ]\n}\n```\n\nListing events require all information about the cache and information relevant to finding the cache. These include the `name`, location (`g`), `difficulty` and `terrain` scores, and `size`. The type of cache (`t`) is optional and defaults to `traditional` if not specified.\n\nCache types are determined by individual clients, with common types including `traditional`, `multi`, and `mystery`. Clients should decide which cache types they support based on their implementation needs.\n\nThese requirements are well-known and follow existing standards, such as those outlined on [geocaching.com](https://www.geocaching.com/help/index.php?pg=kb.chapter&id=97).\n\nThese events are assumed to be owned by the submitter of the cache, and core details should be maintained by that submitter. However, community logs should also provide context on the current state and validity of the cache.\n\n### Content\n\nThe content field contains the cache description and any additional information about the cache.\n\n### Tags\n\n- `d` (required) - unique identifier for the cache\n- `name` (required) - human-readable name for the cache  \n- `g` (required) - geohash of cache location. To allow for a proximity search, include multiple geohash tags at different precision levels (3-9 characters)\n- `difficulty` (required) - integer 1-5 indicating puzzle/finding difficulty\n- `terrain` (required) - integer 1-5 indicating physical difficulty  \n- `size` (required) - one of: `micro`, `small`, `regular`, `large`, `other`\n- `t` (optional) - cache type, with common values including: `traditional`, `multi`, `mystery`. Defaults to `traditional` if not specified\n- `hint` (optional) - plaintext hint to help find the cache\n- `image` (optional) - image URLs related to the cache\n- `r` (optional) - preferred relay URLs for logs\n- `verification` (optional) - hex-encoded public key for verifying finds at this cache\n\n\n\n## Found Log Event (Kind 7516)\n\nFound log events record successful visits to geocaches:\n\n```json\n{\n  \"kind\": 7516,\n  \"content\": \"<log message>\",\n  \"tags\": [\n    [\"a\", \"37515:<pubkey>:<d-tag>\"]\n  ]\n}\n```\n\n### Tags\n\n- `a` (required) - reference to the geocache being logged\n- `image` (optional) - photos from the visit\n- `verification` (optional) - embedded verification event (see Verified Finds section)\n\n## Comment Log Events (Kind 1111)\n\nNon-found logs use comment events (kind `1111`) following NIP-22 comment structure:\n\n```json\n{\n  \"kind\": 1111,\n  \"content\": \"<log message>\",\n  \"tags\": [\n    [\"A\", \"37515:<pubkey>:<d-tag>\"],\n    [\"K\", \"37515\"],\n    [\"P\", \"<cache-owner-pubkey>\"],\n    [\"a\", \"37515:<pubkey>:<d-tag>\"],\n    [\"k\", \"37515\"],\n    [\"p\", \"<cache-owner-pubkey>\"],\n    [\"t\", \"<log-type>\"]\n  ]\n}\n```\n\nThese events capture failures, notes, and status-related information about the cache via human reporting, following the NIP-22 comment threading model where the geocache listing is both the root and parent content.\n\nComment log types include `dnf` (did not find), `note` (helpful or neutral context), and `maintenance` (cache needs attention). If no `t` tag is present, the comment is assumed to be a general note.\n\nOwners of the cache can officially retire caches using an `archived` tag value in the tag `t`, thus allowing the cache's history to be preserved without fully deleting it.\n\n### Tags\n\n- `A` (required) - root geocache reference (same as `a` for top-level comments)\n- `K` (required) - root kind number (`37515`)\n- `P` (required) - root author (cache owner pubkey)\n- `a` (required) - parent reference (same as `A` for top-level comments)\n- `k` (required) - parent kind number (`37515`)\n- `p` (required) - parent author (cache owner pubkey)\n- `t` (optional) - log type: `dnf`, `note`, `maintenance`, `archived`. If omitted, assumed to be `note`\n- `image` (optional) - photos from the visit\n\n\n\n## Geocache Verification Event (Kind 7517)\n\nVerification events provide cryptographic proof that a someone physically located a geocache. These events are signed by the cache's verification private key.\n\n```json\n{\n  \"kind\": 7517,\n  \"content\": \"Geocache verification for <finder-npub>\",\n  \"tags\": [\n    [\"a\", \"<finder-pubkey-hex>:<geocache-naddr>\"]\n  ]\n}\n```\n\n### Content\n\nThe content field must follow the static format: `\"Geocache verification for <finder-npub>\"` where `<finder-npub>` is the NIP-19 encoded public key (npub) of the person who found the cache.\n\n### Tags\n\n- `a` (required) - composite identifier containing the finder's pubkey in hex format and the geocache naddr being verified\n\n\n\n### Usage\n\nVerification events are created when a finder obtains access to the cache's verification private key (typically via QR code at the cache location). The event must be signed by the cache's verification private key and can be:\n\n1. Embedded in the `verification` tag as a JSON string in the Verified Found Log event (kind 7516).\n2. Published to relays as standalone events\n3. Both embedded and published for redundancy\n\n## Verified Finds\n\nGeocaches with verification enabled can provide cryptographic proof that a finder physically located the cache. This is accomplished through a verification event (kind 7517) signed by the cache's verification key.\n\n### Verification Process\n\nWhen a cache has a `verification` tag containing a public key, finders can create a verified log by:\n\n1. Obtaining the cache's verification private key (typically via QR code at the cache location)\n2. Creating a verification event (kind 7517) signed by this key\n3. Embedding the verification event in their log entry\n\n### Verification Validation\n\nTo validate a verified find:\n\n1. Check that the verification event is signed by the expected verification public key\n2. Verify that the finder pubkey in the `a` tag matches the log author\n3. Confirm the geocache naddr in the `a` tag correctly references the target cache\n4. Validate the event signature using standard Nostr verification\n\n## Clients\n\nFor the best Geocaching experience, clients implementing geocaching support should:\n\n- Support hint encoding, such as ROT13, to prevent spoilers.\n- Determine cache status from recent log patterns. Multiple DNF entries and/or maintenance notes would indicate an issue with the cache.\n- Publish logs to relays specified in the cache's `r` tags when available.\n- Validate geohash precision meets minimum requirements (8+ characters, 9+ for micro caches) before accepting cache submissions.\n\n## Examples\n\n### Basic Cache\n\n```json\n{\n  \"kind\": 37515,\n  \"content\": \"The first Nostr treasure, left in the aftermath of Oslo Freedom Forum!\",\n  \"tags\": [\n    [\"d\", \"first-treasure-1748619568668\"],\n    [\"name\", \"First Treasure\"], \n    [\"g\", \"u4x\"],\n    [\"g\", \"u4xs\"],\n    [\"g\", \"u4xsu\"],\n    [\"g\", \"u4xsu6\"],\n    [\"g\", \"u4xsu6r\"],\n    [\"g\", \"u4xsu6ry\"],\n    [\"g\", \"u4xsu6ryb\"],\n    [\"difficulty\", \"1\"],\n    [\"terrain\", \"1\"],\n    [\"size\", \"small\"],\n    [\"t\", \"traditional\"],\n    [\"hint\", \"In the branches\"],\n    [\"image\", \"https://blossom.primal.net/74efe01a767b27dead71b8a9bb8278a108360438e78e55194ed9ab14a9382dd3.jpg\"]\n  ]\n}\n```\n\n### Verified Cache\n\n```json\n{\n  \"kind\": 37515,\n  \"content\": \"High-security treasure requiring physical verification!\",\n  \"tags\": [\n    [\"d\", \"verified-treasure-1748619568669\"],\n    [\"name\", \"Verified Treasure\"], \n    [\"g\", \"u4xsu6ry\"],\n    [\"difficulty\", \"3\"],\n    [\"terrain\", \"2\"],\n    [\"size\", \"small\"],\n    [\"t\", \"traditional\"],\n    [\"hint\", \"Look for the secret code\"],\n    [\"verification\", \"6805d4e5c0df48b4f76e2fdcb67a2acb1d97567b01c6fe17a236dc32f34f1c07\"]\n  ]\n}\n```\n\n### Found Log\n\n```json\n{\n  \"kind\": 7516,\n  \"content\": \"Found it! Great hiding spot.\",\n  \"tags\": [\n    [\"a\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:first-treasure-1748619568668\"]\n  ]\n}\n```\n\n### DNF Log\n\n```json\n{\n  \"kind\": 1111,\n  \"content\": \"Searched for 30 minutes but couldn't find it. Maybe it's missing?\",\n  \"tags\": [\n    [\"A\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:first-treasure-1748619568668\"],\n    [\"K\", \"37515\"],\n    [\"P\", \"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd\"],\n    [\"a\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:first-treasure-1748619568668\"],\n    [\"k\", \"37515\"],\n    [\"p\", \"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd\"],\n    [\"t\", \"dnf\"]\n  ]\n}\n```\n\n### Note Log\n\n```json\n{\n  \"kind\": 1111,\n  \"content\": \"Lots of muggles around during the day. Best to visit in the evening.\",\n  \"tags\": [\n    [\"A\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:first-treasure-1748619568668\"],\n    [\"K\", \"37515\"],\n    [\"P\", \"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd\"],\n    [\"a\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:first-treasure-1748619568668\"],\n    [\"k\", \"37515\"],\n    [\"p\", \"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd\"],\n    [\"t\", \"note\"]\n  ]\n}\n```\n\n### Verification Event\n\n```json\n{\n  \"kind\": 7517,\n  \"content\": \"Geocache verification for npub1qc0lc5lxnhxnfxlw2lxkv4x4vp6xsf4d5qwvlhfx6qmz6x4nfhqd8h2z3\",\n  \"tags\": [\n    [\"a\", \"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:naddr1qqxnzd3e8q6n2dfk8qcnjve48qmnsw3jsqgswaehxw309aex2mrp0yhx6tpdsek6w309aex2mrp0yh56tnwdus8vatjvs6kzdrz956k7tjzw6qzypzgd2dmgxhxf34hnlw2y03nckr8f4g6mw9flxqq65v94zkp77rqfgrf8\"]\n  ],\n  \"pubkey\": \"6805d4e5c0df48b4f76e2fdcb67a2acb1d97567b01c6fe17a236dc32f34f1c07\",\n  \"created_at\": 1672531200,\n  \"sig\": \"a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456789012345678901234567890abcdef1234567890abcdef1234567890abcdef12\"\n}\n```\n\n### Verified Found Log\n\n```json\n{\n  \"kind\": 7516,\n  \"content\": \"Found it! Great hiding spot.\",\n  \"tags\": [\n    [\"a\", \"37515:0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:verified-treasure-1748619568669\"],\n    [\"verification\", \"{\\\"kind\\\":7517,\\\"content\\\":\\\"Geocache verification for npub1qc0lc5lxnhxnfxlw2lxkv4x4vp6xsf4d5qwvlhfx6qmz6x4nfhqd8h2z3\\\",\\\"tags\\\":[[\\\"a\\\",\\\"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd:naddr1qqxnzd3e8q6n2dfk8qcnjve48qmnsw3jsqgswaehxw309aex2mrp0yhx6tpdsek6w309aex2mrp0yh56tnwdus8vatjvs6kzdrz956k7tjzw6qzypzgd2dmgxhxf34hnlw2y03nckr8f4g6mw9flxqq65v94zkp77rqfgrf8\\\"]],\\\"pubkey\\\":\\\"6805d4e5c0df48b4f76e2fdcb67a2acb1d97567b01c6fe17a236dc32f34f1c07\\\",\\\"created_at\\\":1672531200,\\\"sig\\\":\\\"a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456789012345678901234567890abcdef1234567890abcdef1234567890abcdef12\\\"}\"]\n  ]\n}\n```","sig":"2570a2a6c9f96d191e3f4b706f642761814a794caa97fb276f0520bea57d935b9f879580a03c93e24e59ba5d88726659d35c8bb7aa23b53fc48932be68814e52"}