NIP-C1 ====== Collaborative Ownership ----------------------- `draft` `optional` This NIP defines a mechanism for multiple pubkeys to collaboratively maintain addressable events while preserving backwards compatibility. ## Motivation Certain applications require shared ownership where: 1. **Attribution matters**: Each collaborator signs with their own key 2. **Dynamic membership**: Owners can be added or removed 3. **Backwards compatibility**: Non-supporting clients see normal events ## Specification ### Collaborative Pointer Event A new addressable event kind `39382` serves as a pointer to collaboratively-owned content: ```jsonc { "kind": 39382, "pubkey": "", "tags": [ ["d", ""], ["k", ""], ["p", ""], ["p", ""], ["p", ""] ], "content": "", "created_at": 1234567890 } ``` #### Tag Definitions | Tag | Required | Description | |-----|----------|-------------| | `d` | Yes | ` |` | `k` | Yes | Target event kind | | `p` | Yes | Owner pubkeys (one or more) | ### Resolution Algorithm To resolve the current state of collaboratively-owned content: 1. Parse the `39382` pointer event to extract owners (`p` tags) and target kind (`k` tag) 2. Extract the slug from the `d` tag (everything after the first `-`) 3. Query: `{"kinds": [], "authors": [], "#d": [""], "limit": 1}` ### Back-Reference Target events MUST include an `a` tag pointing to the `39382` pointer: ```jsonc { "kind": 30023, "tags": [ ["d", "my-article"], ["a", "39382::30023-my-article"] ] } ``` This allows clients to discover collaborative ownership from either direction: pointer → content or content → pointer. ## Example ### Pointer Event ```jsonc { "kind": 39382, "pubkey": "alice-pubkey", "tags": [ ["d", "collaborative-guide"], ["k", "30023"], ["p", "alice-pubkey"], ["p", "bob-pubkey"], ["p", "carol-pubkey"] ], "content": "" } ``` ### Target Article (by any owner) ```jsonc { "kind": 30023, "pubkey": "bob-pubkey", "tags": [ ["d", "collaborative-guide"], ["title", "A Collaborative Guide"], ["a", "39382:alice-pubkey:30023-collaborative-guide"] ], "content": "..." } ``` ### Client Resolution 1. Client receives `naddr` for the `39382` pointer 2. Parses owners: `[alice, bob, carol]` 3. Queries: `{"kinds": [30023], "authors": ["alice", "bob", "carol"], "#d": ["collaborative-guide"], "limit": 1}` 4. Returns most recent version regardless of which owner published it