# NIP: Custom Event Kinds ## Event Kinds Overview ### Ditto Kinds | Kind | Name | Description | |-------|----------------------|-------------------------------------------------------| | 16769 | Profile Tabs | The user's custom profile page tabs (one per user) | ### Agora Kinds | Kind | Name | Description | |-------|----------------------------|----------------------------------------------------------------| | 20000 | Ephemeral Geo Chat (public) | Geo-anchored ephemeral chat message (kind 20000, public) | | 20001 | Ephemeral Geo Heartbeat | Geo-anchored ephemeral presence heartbeat (kind 20001) | | 30385 | Community Stats Snapshot | Pre-computed per-country / global community leaderboards | | 36639 | Activist Action | Country-scoped activist challenge with a sats bounty | ### Agora Protocols | Protocol | Composed Kinds | Description | |--------------------------|-----------------------------------------|-----------------------------------------------------------------| | Hierarchical Communities | 34550, 30009, 8, 1111, 1984, 5 | Ranked community membership via badge award chains (NIP-72 ext) | ### Community Kinds These event kinds were created by community contributors and are supported by Ditto. Full specifications are maintained by their respective authors. | Kind | Name | Description | Spec | |-------|------------------------|------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | 3367 | Color Moment | Color palette post expressing a mood | [NIP](https://gitlab.com/chad.curtis/espy/-/blob/main/NIP.md) | | 4223 | Weather Reading | Sensor readings from a weather station | [Draft NIP](https://github.com/nostr-protocol/nips/pull/2163) | | 7516 | Found Log | Log entry recording a user finding a geocache | [NIP-GC](https://gitlab.com/chad.curtis/treasures/-/blob/main/NIP-GC.md) | | 8211 | Encrypted Letter | Encrypted personal letter with visual stationery | [NIP](https://gitlab.com/chad.curtis/lief/-/blob/main/NIP.md) | | 16158 | Weather Station | Weather station metadata (location, sensors, connectivity) | [Draft NIP](https://github.com/nostr-protocol/nips/pull/2163) | | 37516 | Geocache | Geocache listing for real-world treasure hunting | [NIP-GC](https://gitlab.com/chad.curtis/treasures/-/blob/main/NIP-GC.md) | --- ## Standard NIPs: Direct Messaging This application implements encrypted direct messaging using two standard Nostr protocols: ### NIP-04 (Legacy Encrypted DMs) | Field | Value | |-------|-------| | Kind | 4 | | Spec | [NIP-04](https://github.com/nostr-protocol/nips/blob/master/04.md) | Legacy encrypted direct messages. Content is encrypted with AES-256-CBC using a shared secret derived from the sender's private key and recipient's public key. The recipient is identified by a `p` tag. Used for backward compatibility with older Nostr clients that do not support NIP-17. ### NIP-17 (Private Direct Messages) | Field | Value | |-------|-------| | Kinds | 1059 (Gift Wrap), 1060 (Seal) | | Spec | [NIP-17](https://github.com/nostr-protocol/nips/blob/master/17.md) | Modern private direct messages using the Gift Wrap protocol. Messages are triple-layered: 1. **Rumor** (kind 14) — unsigned plaintext message 2. **Seal** (kind 13) — rumor encrypted to the recipient, signed by the sender 3. **Gift Wrap** (kind 1059) — seal encrypted to the recipient, signed by a random ephemeral key This provides metadata protection: relays and observers cannot determine the sender, recipient, or content. The application uses NIP-17 as the default send protocol, with optional NIP-04 compatibility for older clients. ### Protocol Configuration Users can configure their preferred send protocol via Settings > Messages: - **NIP-17 only** (default) — maximum privacy, only modern clients can read - **NIP-04 + NIP-17** — sends via both protocols for compatibility with legacy clients --- ## Kind 16769: Profile Tabs ### Summary Replaceable event kind for publishing a user's custom profile page tabs. Exactly one event per user (no `d` tag). Each tab defines a Nostr filter (NIP-01) that clients execute to populate the tab's content. Visitors who load a profile fetch this event to display the custom tabs alongside the standard Posts / Media / Likes / Wall tabs. ### Event Structure ```json { "kind": 16769, "content": "", "tags": [ ["var", "$follows", "p", "a:3:$me:"], ["tab", "Bitcoin Posts", "{\"kinds\":[1],\"authors\":[\"$me\"],\"search\":\"bitcoin\"}"], ["tab", "Feed", "{\"kinds\":[1,6],\"authors\":[\"$follows\"],\"limit\":40}"], ["alt", "Custom profile tabs"] ] } ``` ### Content The `content` field is unused and MUST be an empty string (`""`). ### Tags | Tag | Format | Description | |-------|------------------------------------------------|----------------------------------------------------------------| | `tab` | `["tab", "