{"id":"dec9acb9f162cda84d54ff21e348e058782322b1ae80beaad948522568816f7e","pubkey":"0461fcbecc4c3374439932d6b8f11269ccdb7cc973ad7a50ae362db135a474dd","created_at":1782673209,"kind":30817,"tags":[["d","custom-constellation"],["title","Custom Constellations"],["alt","Nostr Implementation Possibility: Custom Constellations"],["k","30621","Custom Constellation"],["client","NostrHub"]],"content":"# Custom Constellations\n\nThis NIP defines a user-drawn constellation in the stars.\n\n## Kind 30621 — Custom Constellation\n\nAn **addressable** event (kind `30621`) representing a single constellation\ndrawn by a user. Because it is addressable, the author may edit/replace it\nby republishing with the same `d` tag.\n\n### Tags\n\n| Tag     | Value                            | Required | Notes                                                                                                            |\n| ------- | -------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------- |\n| `d`     | slug identifier                  | yes      | Stable identifier for this constellation (per author).                                                           |\n| `title` | human-readable name              | yes      | Short display name (e.g. \"The Winter Cat\").                                                                      |\n| `edge`  | `<from_star>`, `<to_star>`       | 1+       | One edge of the figure. Exactly three elements: `[\"edge\", from, to]`. Each endpoint is a Hipparcos catalog number encoded as a decimal string (e.g. `\"32349\"` for Sirius). See **Star references** below. |\n| `alt`   | human-readable description       | yes      | NIP-31 fallback for non-supporting clients.                                                                      |\n\nThe `content` field is a freeform plaintext description / story / legend\nfor the constellation (may be empty).\n\n### Star references\n\nStars are identified by their **Hipparcos catalog number** (HIP), not by\nname. The wire format is the HIP integer encoded as a decimal string with\nno prefix, no padding, and no whitespace (e.g. `\"32349\"` for Sirius, not\n`\"HIP 32349\"` or `\" 32349 \"`).\n\nHIP numbers are used instead of names because traditional star names\ncollide (e.g. \"Algenib\" historically referred to both γ Pegasi and α\nPersei, \"Gienah\" to both ε Cygni and γ Corvi), are localized, and get\nrenamed by the IAU. HIP numbers were frozen in 1997, are unambiguous,\nand cover every naked-eye star.\n\n### Example\n\n```jsonc\n{\n  \"kind\": 30621,\n  \"content\": \"Two bright eyes watching over the winter sky.\",\n  \"tags\": [\n    [\"d\", \"winter-cat\"],\n    [\"title\", \"The Winter Cat\"],\n    [\"alt\", \"A custom Birdstar constellation: The Winter Cat\"],\n    [\"edge\", \"32349\", \"37279\"],   // Sirius → Procyon\n    [\"edge\", \"37279\", \"37826\"],   // Procyon → Pollux\n    [\"edge\", \"37826\", \"36850\"],   // Pollux → Castor\n    [\"edge\", \"36850\", \"24608\"],   // Castor → Capella\n    [\"edge\", \"24608\", \"21421\"],   // Capella → Aldebaran\n    [\"edge\", \"21421\", \"24436\"],   // Aldebaran → Rigel\n    [\"edge\", \"24436\", \"32349\"]    // Rigel → Sirius\n  ]\n}\n```\n\n### Validation\n\nA client receiving a `30621` event should:\n\n1. Verify that `d` and `title` tags exist and are non-empty strings.\n2. Collect all `edge` tags. A valid edge tag has exactly three elements —\n   `[\"edge\", from, to]` — where `from` and `to` each match `/^\\d+$/` and\n   parse as a positive integer. Tags not matching this shape are ignored.\n3. Resolve each edge's HIP numbers against the local star catalog. Edges\n   referencing HIP numbers not in the local catalog are silently dropped\n   rather than failing the whole constellation.\n4. Ignore the event entirely if it has zero resolvable edges after\n   validation.\n\n### Rationale\n\n- **Why not `e` tags?** The single-letter `e` tag is a reserved core Nostr\n  tag meaning \"event reference\" (see NIP-01, NIP-10). Overloading it with\n  star references would pollute relay indexes and mislead any generic\n  client or tool that inspects the event. `edge` is an unambiguous\n  multi-letter tag whose meaning is local to this kind.\n- **Why an edge list (not a single polyline)?** Real figures branch and\n  loop — Orion has a belt with legs and shoulders, the Big Dipper is a\n  cycle with a handle. A single ordered path cannot express branching\n  without duplicating stars. An edge list is the natural representation\n  for arbitrary figure topology (trees, cycles, disconnected components).\n- **Why Hipparcos numbers, not star names?** Traditional names are\n  ambiguous, localized, and subject to IAU renaming. HIP numbers are\n  unique, permanent, and recognized across every astronomy catalog.\n- **Why addressable?** Authors can iterate on a drawing over time without\n  creating duplicate events.","sig":"f76edd892f7397c5ed9ed705e5042b4c32a110bb7885f3cf81c7f44f9b9c6e2e9cf36f4c2cf6b49feddcfce2913b27acc9d8b6d23befbe70c79b41482fa9221f"}