event-kinds.ts raw

   1  /**
   2   * Nostr Event Kinds Database
   3   * Ported from app/web/src/eventKinds.js
   4   */
   5  
   6  export interface EventKind {
   7    kind: number
   8    name: string
   9    description: string
  10    nip?: string | null
  11    spec?: string
  12    isReplaceable?: boolean
  13    isEphemeral?: boolean
  14    isAddressable?: boolean
  15    deprecated?: boolean
  16    template?: {
  17      kind: number
  18      content: string
  19      tags: string[][]
  20    }
  21  }
  22  
  23  export const eventKinds: EventKind[] = [
  24    {
  25      "kind": 0,
  26      "name": "Metadata",
  27      "description": "User profile information (name, about, picture, nip05, etc.)",
  28      "nip": "01",
  29      "isReplaceable": true,
  30      "template": {
  31        "kind": 0,
  32        "content": "",
  33        "tags": []
  34      }
  35    },
  36    {
  37      "kind": 1,
  38      "name": "Short Text Note",
  39      "description": "Short-form text post (like a tweet)",
  40      "nip": "01",
  41      "template": {
  42        "kind": 1,
  43        "content": "",
  44        "tags": []
  45      }
  46    },
  47    {
  48      "kind": 2,
  49      "name": "Recommend Relay",
  50      "description": "Relay recommendation",
  51      "nip": "01",
  52      "deprecated": true,
  53      "template": {
  54        "kind": 2,
  55        "content": "",
  56        "tags": []
  57      }
  58    },
  59    {
  60      "kind": 3,
  61      "name": "Follows",
  62      "description": "Following list with optional relay hints",
  63      "nip": "02",
  64      "isReplaceable": true,
  65      "template": {
  66        "kind": 3,
  67        "content": "",
  68        "tags": []
  69      }
  70    },
  71    {
  72      "kind": 4,
  73      "name": "Encrypted Direct Message",
  74      "description": "Private message using NIP-04 encryption",
  75      "nip": "04",
  76      "deprecated": true,
  77      "template": {
  78        "kind": 4,
  79        "content": "",
  80        "tags": []
  81      }
  82    },
  83    {
  84      "kind": 5,
  85      "name": "Event Deletion Request",
  86      "description": "Request to delete events",
  87      "nip": "09",
  88      "template": {
  89        "kind": 5,
  90        "content": "",
  91        "tags": []
  92      }
  93    },
  94    {
  95      "kind": 6,
  96      "name": "Repost",
  97      "description": "Share/repost another text note",
  98      "nip": "18",
  99      "template": {
 100        "kind": 6,
 101        "content": "",
 102        "tags": []
 103      }
 104    },
 105    {
 106      "kind": 7,
 107      "name": "Reaction",
 108      "description": "Like, emoji reaction to an event",
 109      "nip": "25",
 110      "template": {
 111        "kind": 7,
 112        "content": "",
 113        "tags": []
 114      }
 115    },
 116    {
 117      "kind": 8,
 118      "name": "Badge Award",
 119      "description": "Award a badge to someone",
 120      "nip": "58",
 121      "template": {
 122        "kind": 8,
 123        "content": "",
 124        "tags": []
 125      }
 126    },
 127    {
 128      "kind": 9,
 129      "name": "Chat Message",
 130      "description": "Chat message",
 131      "nip": "C7",
 132      "template": {
 133        "kind": 9,
 134        "content": "",
 135        "tags": []
 136      }
 137    },
 138    {
 139      "kind": 10,
 140      "name": "Group Chat Threaded Reply",
 141      "description": "Threaded reply in group chat",
 142      "nip": "29",
 143      "deprecated": true,
 144      "template": {
 145        "kind": 10,
 146        "content": "",
 147        "tags": []
 148      }
 149    },
 150    {
 151      "kind": 11,
 152      "name": "Thread",
 153      "description": "Thread event",
 154      "nip": "7D",
 155      "template": {
 156        "kind": 11,
 157        "content": "",
 158        "tags": []
 159      }
 160    },
 161    {
 162      "kind": 12,
 163      "name": "Group Thread Reply",
 164      "description": "Reply in group thread",
 165      "nip": "29",
 166      "deprecated": true,
 167      "template": {
 168        "kind": 12,
 169        "content": "",
 170        "tags": []
 171      }
 172    },
 173    {
 174      "kind": 13,
 175      "name": "Seal",
 176      "description": "Sealed/encrypted event wrapper",
 177      "nip": "59",
 178      "template": {
 179        "kind": 13,
 180        "content": "",
 181        "tags": []
 182      }
 183    },
 184    {
 185      "kind": 14,
 186      "name": "Direct Message",
 187      "description": "Private direct message using NIP-17",
 188      "nip": "17",
 189      "template": {
 190        "kind": 14,
 191        "content": "",
 192        "tags": []
 193      }
 194    },
 195    {
 196      "kind": 15,
 197      "name": "File Message",
 198      "description": "File message in DMs",
 199      "nip": "17",
 200      "template": {
 201        "kind": 15,
 202        "content": "",
 203        "tags": []
 204      }
 205    },
 206    {
 207      "kind": 16,
 208      "name": "Generic Repost",
 209      "description": "Repost any event kind",
 210      "nip": "18",
 211      "template": {
 212        "kind": 16,
 213        "content": "",
 214        "tags": []
 215      }
 216    },
 217    {
 218      "kind": 17,
 219      "name": "Reaction to Website",
 220      "description": "Reaction to a website URL",
 221      "nip": "25",
 222      "template": {
 223        "kind": 17,
 224        "content": "",
 225        "tags": []
 226      }
 227    },
 228    {
 229      "kind": 20,
 230      "name": "Picture",
 231      "description": "Picture-first feed post",
 232      "nip": "68",
 233      "template": {
 234        "kind": 20,
 235        "content": "",
 236        "tags": []
 237      }
 238    },
 239    {
 240      "kind": 21,
 241      "name": "Video Event",
 242      "description": "Horizontal video event",
 243      "nip": "71",
 244      "template": {
 245        "kind": 21,
 246        "content": "",
 247        "tags": []
 248      }
 249    },
 250    {
 251      "kind": 22,
 252      "name": "Short-form Video",
 253      "description": "Short-form portrait video (like TikTok)",
 254      "nip": "71",
 255      "template": {
 256        "kind": 22,
 257        "content": "",
 258        "tags": []
 259      }
 260    },
 261    {
 262      "kind": 40,
 263      "name": "Channel Creation",
 264      "description": "Create a public chat channel",
 265      "nip": "28",
 266      "template": {
 267        "kind": 40,
 268        "content": "",
 269        "tags": []
 270      }
 271    },
 272    {
 273      "kind": 41,
 274      "name": "Channel Metadata",
 275      "description": "Set channel name, about, picture",
 276      "nip": "28",
 277      "template": {
 278        "kind": 41,
 279        "content": "",
 280        "tags": []
 281      }
 282    },
 283    {
 284      "kind": 42,
 285      "name": "Channel Message",
 286      "description": "Post message in channel",
 287      "nip": "28",
 288      "template": {
 289        "kind": 42,
 290        "content": "",
 291        "tags": []
 292      }
 293    },
 294    {
 295      "kind": 43,
 296      "name": "Channel Hide Message",
 297      "description": "Hide a message in channel",
 298      "nip": "28",
 299      "template": {
 300        "kind": 43,
 301        "content": "",
 302        "tags": []
 303      }
 304    },
 305    {
 306      "kind": 44,
 307      "name": "Channel Mute User",
 308      "description": "Mute a user in channel",
 309      "nip": "28",
 310      "template": {
 311        "kind": 44,
 312        "content": "",
 313        "tags": []
 314      }
 315    },
 316    {
 317      "kind": 62,
 318      "name": "Request to Vanish",
 319      "description": "Request permanent deletion of all user data",
 320      "nip": "62",
 321      "template": {
 322        "kind": 62,
 323        "content": "",
 324        "tags": []
 325      }
 326    },
 327    {
 328      "kind": 64,
 329      "name": "Chess (PGN)",
 330      "description": "Chess game in PGN format",
 331      "nip": "64",
 332      "template": {
 333        "kind": 64,
 334        "content": "",
 335        "tags": []
 336      }
 337    },
 338    {
 339      "kind": 443,
 340      "name": "KeyPackage",
 341      "description": "Marmot protocol key package",
 342      "nip": null,
 343      "spec": "Marmot",
 344      "template": {
 345        "kind": 443,
 346        "content": "",
 347        "tags": []
 348      }
 349    },
 350    {
 351      "kind": 444,
 352      "name": "Welcome Message",
 353      "description": "Marmot protocol welcome message",
 354      "nip": null,
 355      "spec": "Marmot",
 356      "template": {
 357        "kind": 444,
 358        "content": "",
 359        "tags": []
 360      }
 361    },
 362    {
 363      "kind": 445,
 364      "name": "Group Event",
 365      "description": "Marmot protocol group event",
 366      "nip": null,
 367      "spec": "Marmot",
 368      "template": {
 369        "kind": 445,
 370        "content": "",
 371        "tags": []
 372      }
 373    },
 374    {
 375      "kind": 818,
 376      "name": "Merge Requests",
 377      "description": "Git merge request",
 378      "nip": "54",
 379      "template": {
 380        "kind": 818,
 381        "content": "",
 382        "tags": []
 383      }
 384    },
 385    {
 386      "kind": 1018,
 387      "name": "Poll Response",
 388      "description": "Response to a poll",
 389      "nip": "88",
 390      "template": {
 391        "kind": 1018,
 392        "content": "",
 393        "tags": []
 394      }
 395    },
 396    {
 397      "kind": 1021,
 398      "name": "Bid",
 399      "description": "Auction bid",
 400      "nip": "15",
 401      "template": {
 402        "kind": 1021,
 403        "content": "",
 404        "tags": []
 405      }
 406    },
 407    {
 408      "kind": 1022,
 409      "name": "Bid Confirmation",
 410      "description": "Confirmation of auction bid",
 411      "nip": "15",
 412      "template": {
 413        "kind": 1022,
 414        "content": "",
 415        "tags": []
 416      }
 417    },
 418    {
 419      "kind": 1040,
 420      "name": "OpenTimestamps",
 421      "description": "OpenTimestamps attestation",
 422      "nip": "03",
 423      "template": {
 424        "kind": 1040,
 425        "content": "",
 426        "tags": []
 427      }
 428    },
 429    {
 430      "kind": 1059,
 431      "name": "Gift Wrap",
 432      "description": "Encrypted gift-wrapped event",
 433      "nip": "59",
 434      "template": {
 435        "kind": 1059,
 436        "content": "",
 437        "tags": []
 438      }
 439    },
 440    {
 441      "kind": 1060,
 442      "name": "Gift Wrap (Kind 4)",
 443      "description": "Gift wrap variant for NIP-04 compatibility",
 444      "nip": "59",
 445      "template": {
 446        "kind": 1060,
 447        "content": "",
 448        "tags": []
 449      }
 450    },
 451    {
 452      "kind": 1063,
 453      "name": "File Metadata",
 454      "description": "Metadata for shared files",
 455      "nip": "94",
 456      "template": {
 457        "kind": 1063,
 458        "content": "",
 459        "tags": []
 460      }
 461    },
 462    {
 463      "kind": 1068,
 464      "name": "Poll",
 465      "description": "Create a poll",
 466      "nip": "88",
 467      "template": {
 468        "kind": 1068,
 469        "content": "",
 470        "tags": []
 471      }
 472    },
 473    {
 474      "kind": 1111,
 475      "name": "Comment",
 476      "description": "Comment on events or external content",
 477      "nip": "22",
 478      "template": {
 479        "kind": 1111,
 480        "content": "",
 481        "tags": []
 482      }
 483    },
 484    {
 485      "kind": 1222,
 486      "name": "Voice Message",
 487      "description": "Voice message",
 488      "nip": "A0",
 489      "template": {
 490        "kind": 1222,
 491        "content": "",
 492        "tags": []
 493      }
 494    },
 495    {
 496      "kind": 1244,
 497      "name": "Voice Message Comment",
 498      "description": "Comment on voice message",
 499      "nip": "A0",
 500      "template": {
 501        "kind": 1244,
 502        "content": "",
 503        "tags": []
 504      }
 505    },
 506    {
 507      "kind": 1311,
 508      "name": "Live Chat Message",
 509      "description": "Message in live stream chat",
 510      "nip": "53",
 511      "template": {
 512        "kind": 1311,
 513        "content": "",
 514        "tags": []
 515      }
 516    },
 517    {
 518      "kind": 1337,
 519      "name": "Code Snippet",
 520      "description": "Code snippet post",
 521      "nip": "C0",
 522      "template": {
 523        "kind": 1337,
 524        "content": "",
 525        "tags": []
 526      }
 527    },
 528    {
 529      "kind": 1517,
 530      "name": "Bitcoin Block",
 531      "description": "Bitcoin block data",
 532      "nip": null,
 533      "spec": "Nostrocket",
 534      "template": {
 535        "kind": 1517,
 536        "content": "",
 537        "tags": []
 538      }
 539    },
 540    {
 541      "kind": 1617,
 542      "name": "Patches",
 543      "description": "Git patches",
 544      "nip": "34",
 545      "template": {
 546        "kind": 1617,
 547        "content": "",
 548        "tags": []
 549      }
 550    },
 551    {
 552      "kind": 1618,
 553      "name": "Pull Requests",
 554      "description": "Git pull request",
 555      "nip": "34",
 556      "template": {
 557        "kind": 1618,
 558        "content": "",
 559        "tags": []
 560      }
 561    },
 562    {
 563      "kind": 1619,
 564      "name": "Pull Request Updates",
 565      "description": "Updates to git pull request",
 566      "nip": "34",
 567      "template": {
 568        "kind": 1619,
 569        "content": "",
 570        "tags": []
 571      }
 572    },
 573    {
 574      "kind": 1621,
 575      "name": "Issues",
 576      "description": "Git issues",
 577      "nip": "34",
 578      "template": {
 579        "kind": 1621,
 580        "content": "",
 581        "tags": []
 582      }
 583    },
 584    {
 585      "kind": 1622,
 586      "name": "Git Replies",
 587      "description": "Replies on git objects",
 588      "nip": "34",
 589      "deprecated": true,
 590      "template": {
 591        "kind": 1622,
 592        "content": "",
 593        "tags": []
 594      }
 595    },
 596    {
 597      "kind": 1630,
 598      "name": "Status",
 599      "description": "Git status",
 600      "nip": "34",
 601      "template": {
 602        "kind": 1630,
 603        "content": "",
 604        "tags": []
 605      }
 606    },
 607    {
 608      "kind": 1631,
 609      "name": "Status",
 610      "description": "Git status",
 611      "nip": "34",
 612      "template": {
 613        "kind": 1631,
 614        "content": "",
 615        "tags": []
 616      }
 617    },
 618    {
 619      "kind": 1632,
 620      "name": "Status",
 621      "description": "Git status",
 622      "nip": "34",
 623      "template": {
 624        "kind": 1632,
 625        "content": "",
 626        "tags": []
 627      }
 628    },
 629    {
 630      "kind": 1633,
 631      "name": "Status",
 632      "description": "Git status",
 633      "nip": "34",
 634      "template": {
 635        "kind": 1633,
 636        "content": "",
 637        "tags": []
 638      }
 639    },
 640    {
 641      "kind": 1808,
 642      "name": "Live Stream",
 643      "description": "Live streaming event",
 644      "nip": null,
 645      "spec": "zap.stream",
 646      "template": {
 647        "kind": 1808,
 648        "content": "",
 649        "tags": []
 650      }
 651    },
 652    {
 653      "kind": 1971,
 654      "name": "Problem Tracker",
 655      "description": "Problem tracking",
 656      "nip": null,
 657      "spec": "Nostrocket",
 658      "template": {
 659        "kind": 1971,
 660        "content": "",
 661        "tags": []
 662      }
 663    },
 664    {
 665      "kind": 1984,
 666      "name": "Reporting",
 667      "description": "Report content or users",
 668      "nip": "56",
 669      "template": {
 670        "kind": 1984,
 671        "content": "",
 672        "tags": []
 673      }
 674    },
 675    {
 676      "kind": 1985,
 677      "name": "Label",
 678      "description": "Label/tag content with namespace",
 679      "nip": "32",
 680      "template": {
 681        "kind": 1985,
 682        "content": "",
 683        "tags": []
 684      }
 685    },
 686    {
 687      "kind": 1986,
 688      "name": "Relay Reviews",
 689      "description": "Reviews of relays",
 690      "nip": null,
 691      "template": {
 692        "kind": 1986,
 693        "content": "",
 694        "tags": []
 695      }
 696    },
 697    {
 698      "kind": 1987,
 699      "name": "AI Embeddings",
 700      "description": "AI embeddings/vector lists",
 701      "nip": null,
 702      "spec": "NKBIP-02",
 703      "template": {
 704        "kind": 1987,
 705        "content": "",
 706        "tags": []
 707      }
 708    },
 709    {
 710      "kind": 2003,
 711      "name": "Torrent",
 712      "description": "Torrent magnet link",
 713      "nip": "35",
 714      "template": {
 715        "kind": 2003,
 716        "content": "",
 717        "tags": []
 718      }
 719    },
 720    {
 721      "kind": 2004,
 722      "name": "Torrent Comment",
 723      "description": "Comment on torrent",
 724      "nip": "35",
 725      "template": {
 726        "kind": 2004,
 727        "content": "",
 728        "tags": []
 729      }
 730    },
 731    {
 732      "kind": 2022,
 733      "name": "Coinjoin Pool",
 734      "description": "Coinjoin coordination",
 735      "nip": null,
 736      "spec": "joinstr",
 737      "template": {
 738        "kind": 2022,
 739        "content": "",
 740        "tags": []
 741      }
 742    },
 743    {
 744      "kind": 4550,
 745      "name": "Community Post Approval",
 746      "description": "Approve post in community",
 747      "nip": "72",
 748      "template": {
 749        "kind": 4550,
 750        "content": "",
 751        "tags": []
 752      }
 753    },
 754    {
 755      "kind": 5000,
 756      "name": "Job Request",
 757      "description": "Data vending machine job request (start of range)",
 758      "nip": "90",
 759      "template": {
 760        "kind": 5000,
 761        "content": "",
 762        "tags": []
 763      }
 764    },
 765    {
 766      "kind": 6000,
 767      "name": "Job Result",
 768      "description": "Data vending machine job result (start of range)",
 769      "nip": "90",
 770      "template": {
 771        "kind": 6000,
 772        "content": "",
 773        "tags": []
 774      }
 775    },
 776    {
 777      "kind": 7000,
 778      "name": "Job Feedback",
 779      "description": "Feedback on job request/result",
 780      "nip": "90",
 781      "template": {
 782        "kind": 7000,
 783        "content": "",
 784        "tags": []
 785      }
 786    },
 787    {
 788      "kind": 7374,
 789      "name": "Reserved Cashu Wallet Tokens",
 790      "description": "Reserved Cashu wallet tokens",
 791      "nip": "60",
 792      "template": {
 793        "kind": 7374,
 794        "content": "",
 795        "tags": []
 796      }
 797    },
 798    {
 799      "kind": 7375,
 800      "name": "Cashu Wallet Tokens",
 801      "description": "Cashu wallet tokens",
 802      "nip": "60",
 803      "template": {
 804        "kind": 7375,
 805        "content": "",
 806        "tags": []
 807      }
 808    },
 809    {
 810      "kind": 7376,
 811      "name": "Cashu Wallet History",
 812      "description": "Cashu wallet transaction history",
 813      "nip": "60",
 814      "template": {
 815        "kind": 7376,
 816        "content": "",
 817        "tags": []
 818      }
 819    },
 820    {
 821      "kind": 7516,
 822      "name": "Geocache Log",
 823      "description": "Geocaching log entry",
 824      "nip": null,
 825      "spec": "geocaching",
 826      "template": {
 827        "kind": 7516,
 828        "content": "",
 829        "tags": []
 830      }
 831    },
 832    {
 833      "kind": 7517,
 834      "name": "Geocache Proof of Find",
 835      "description": "Proof of geocache find",
 836      "nip": null,
 837      "spec": "geocaching",
 838      "template": {
 839        "kind": 7517,
 840        "content": "",
 841        "tags": []
 842      }
 843    },
 844    {
 845      "kind": 8000,
 846      "name": "Add User",
 847      "description": "Add user to group",
 848      "nip": "43",
 849      "template": {
 850        "kind": 8000,
 851        "content": "",
 852        "tags": []
 853      }
 854    },
 855    {
 856      "kind": 8001,
 857      "name": "Remove User",
 858      "description": "Remove user from group",
 859      "nip": "43",
 860      "template": {
 861        "kind": 8001,
 862        "content": "",
 863        "tags": []
 864      }
 865    },
 866    {
 867      "kind": 9000,
 868      "name": "Group Control Events",
 869      "description": "Group control events (start of range)",
 870      "nip": "29",
 871      "template": {
 872        "kind": 9000,
 873        "content": "",
 874        "tags": []
 875      }
 876    },
 877    {
 878      "kind": 9041,
 879      "name": "Zap Goal",
 880      "description": "Fundraising goal for zaps",
 881      "nip": "75",
 882      "template": {
 883        "kind": 9041,
 884        "content": "",
 885        "tags": []
 886      }
 887    },
 888    {
 889      "kind": 9321,
 890      "name": "Nutzap",
 891      "description": "Cashu nutzap",
 892      "nip": "61",
 893      "template": {
 894        "kind": 9321,
 895        "content": "",
 896        "tags": []
 897      }
 898    },
 899    {
 900      "kind": 9467,
 901      "name": "Tidal Login",
 902      "description": "Tidal streaming login",
 903      "nip": null,
 904      "spec": "Tidal-nostr",
 905      "template": {
 906        "kind": 9467,
 907        "content": "",
 908        "tags": []
 909      }
 910    },
 911    {
 912      "kind": 9734,
 913      "name": "Zap Request",
 914      "description": "Request Lightning payment",
 915      "nip": "57",
 916      "template": {
 917        "kind": 9734,
 918        "content": "",
 919        "tags": []
 920      }
 921    },
 922    {
 923      "kind": 9735,
 924      "name": "Zap",
 925      "description": "Lightning payment receipt",
 926      "nip": "57",
 927      "template": {
 928        "kind": 9735,
 929        "content": "",
 930        "tags": []
 931      }
 932    },
 933    {
 934      "kind": 9802,
 935      "name": "Highlights",
 936      "description": "Highlighted text selection",
 937      "nip": "84",
 938      "template": {
 939        "kind": 9802,
 940        "content": "",
 941        "tags": []
 942      }
 943    },
 944    {
 945      "kind": 10000,
 946      "name": "Mute List",
 947      "description": "List of muted users/content",
 948      "nip": "51",
 949      "isReplaceable": true,
 950      "template": {
 951        "kind": 10000,
 952        "content": "",
 953        "tags": []
 954      }
 955    },
 956    {
 957      "kind": 10001,
 958      "name": "Pin List",
 959      "description": "Pinned events",
 960      "nip": "51",
 961      "isReplaceable": true,
 962      "template": {
 963        "kind": 10001,
 964        "content": "",
 965        "tags": []
 966      }
 967    },
 968    {
 969      "kind": 10002,
 970      "name": "Relay List Metadata",
 971      "description": "User's preferred relays for read/write",
 972      "nip": "65",
 973      "isReplaceable": true,
 974      "template": {
 975        "kind": 10002,
 976        "content": "",
 977        "tags": []
 978      }
 979    },
 980    {
 981      "kind": 10003,
 982      "name": "Bookmark List",
 983      "description": "Bookmarked events",
 984      "nip": "51",
 985      "isReplaceable": true,
 986      "template": {
 987        "kind": 10003,
 988        "content": "",
 989        "tags": []
 990      }
 991    },
 992    {
 993      "kind": 10004,
 994      "name": "Communities List",
 995      "description": "Communities user belongs to",
 996      "nip": "51",
 997      "isReplaceable": true,
 998      "template": {
 999        "kind": 10004,
1000        "content": "",
1001        "tags": []
1002      }
1003    },
1004    {
1005      "kind": 10005,
1006      "name": "Public Chats List",
1007      "description": "Public chats user is in",
1008      "nip": "51",
1009      "isReplaceable": true,
1010      "template": {
1011        "kind": 10005,
1012        "content": "",
1013        "tags": []
1014      }
1015    },
1016    {
1017      "kind": 10006,
1018      "name": "Blocked Relays List",
1019      "description": "Relays user has blocked",
1020      "nip": "51",
1021      "isReplaceable": true,
1022      "template": {
1023        "kind": 10006,
1024        "content": "",
1025        "tags": []
1026      }
1027    },
1028    {
1029      "kind": 10007,
1030      "name": "Search Relays List",
1031      "description": "Preferred search relays",
1032      "nip": "51",
1033      "isReplaceable": true,
1034      "template": {
1035        "kind": 10007,
1036        "content": "",
1037        "tags": []
1038      }
1039    },
1040    {
1041      "kind": 10008,
1042      "name": "Relay Group Configuration",
1043      "description": "Relay group configuration",
1044      "nip": null,
1045      "isReplaceable": true,
1046      "template": {
1047        "kind": 10008,
1048        "content": "",
1049        "tags": []
1050      }
1051    },
1052    {
1053      "kind": 10009,
1054      "name": "User Groups",
1055      "description": "Groups user belongs to",
1056      "nip": "29",
1057      "isReplaceable": true,
1058      "template": {
1059        "kind": 10009,
1060        "content": "",
1061        "tags": []
1062      }
1063    },
1064    {
1065      "kind": 10012,
1066      "name": "Favorite Relays List",
1067      "description": "User's favorite relays",
1068      "nip": "51",
1069      "isReplaceable": true,
1070      "template": {
1071        "kind": 10012,
1072        "content": "",
1073        "tags": []
1074      }
1075    },
1076    {
1077      "kind": 10013,
1078      "name": "Private Event Relay List",
1079      "description": "Relays for private events",
1080      "nip": "37",
1081      "isReplaceable": true,
1082      "template": {
1083        "kind": 10013,
1084        "content": "",
1085        "tags": []
1086      }
1087    },
1088    {
1089      "kind": 10015,
1090      "name": "Interests List",
1091      "description": "User interests/topics",
1092      "nip": "51",
1093      "isReplaceable": true,
1094      "template": {
1095        "kind": 10015,
1096        "content": "",
1097        "tags": []
1098      }
1099    },
1100    {
1101      "kind": 10019,
1102      "name": "Nutzap Mint Recommendation",
1103      "description": "Recommended Cashu mints for nutzaps",
1104      "nip": "61",
1105      "isReplaceable": true,
1106      "template": {
1107        "kind": 10019,
1108        "content": "",
1109        "tags": []
1110      }
1111    },
1112    {
1113      "kind": 10020,
1114      "name": "Media Follows",
1115      "description": "Followed media accounts",
1116      "nip": "51",
1117      "isReplaceable": true,
1118      "template": {
1119        "kind": 10020,
1120        "content": "",
1121        "tags": []
1122      }
1123    },
1124    {
1125      "kind": 10030,
1126      "name": "User Emoji List",
1127      "description": "Custom emoji list",
1128      "nip": "51",
1129      "isReplaceable": true,
1130      "template": {
1131        "kind": 10030,
1132        "content": "",
1133        "tags": []
1134      }
1135    },
1136    {
1137      "kind": 10050,
1138      "name": "DM Relays List",
1139      "description": "Relays to receive DMs on",
1140      "nip": "17",
1141      "isReplaceable": true,
1142      "template": {
1143        "kind": 10050,
1144        "content": "",
1145        "tags": []
1146      }
1147    },
1148    {
1149      "kind": 10051,
1150      "name": "KeyPackage Relays List",
1151      "description": "Marmot key package relays",
1152      "nip": null,
1153      "isReplaceable": true,
1154      "spec": "Marmot",
1155      "template": {
1156        "kind": 10051,
1157        "content": "",
1158        "tags": []
1159      }
1160    },
1161    {
1162      "kind": 10063,
1163      "name": "User Server List",
1164      "description": "Blossom server list",
1165      "nip": null,
1166      "isReplaceable": true,
1167      "spec": "Blossom",
1168      "template": {
1169        "kind": 10063,
1170        "content": "",
1171        "tags": []
1172      }
1173    },
1174    {
1175      "kind": 10096,
1176      "name": "File Storage Server List",
1177      "description": "File storage servers",
1178      "nip": "96",
1179      "isReplaceable": true,
1180      "deprecated": true,
1181      "template": {
1182        "kind": 10096,
1183        "content": "",
1184        "tags": []
1185      }
1186    },
1187    {
1188      "kind": 10166,
1189      "name": "Relay Monitor Announcement",
1190      "description": "Relay monitoring announcement",
1191      "nip": "66",
1192      "isReplaceable": true,
1193      "template": {
1194        "kind": 10166,
1195        "content": "",
1196        "tags": []
1197      }
1198    },
1199    {
1200      "kind": 10312,
1201      "name": "Room Presence",
1202      "description": "Presence in live room",
1203      "nip": "53",
1204      "isReplaceable": true,
1205      "template": {
1206        "kind": 10312,
1207        "content": "",
1208        "tags": []
1209      }
1210    },
1211    {
1212      "kind": 10377,
1213      "name": "Proxy Announcement",
1214      "description": "Nostr proxy announcement",
1215      "nip": null,
1216      "isReplaceable": true,
1217      "spec": "Nostr Epoxy",
1218      "template": {
1219        "kind": 10377,
1220        "content": "",
1221        "tags": []
1222      }
1223    },
1224    {
1225      "kind": 11111,
1226      "name": "Transport Method Announcement",
1227      "description": "Transport method announcement",
1228      "nip": null,
1229      "isReplaceable": true,
1230      "spec": "Nostr Epoxy",
1231      "template": {
1232        "kind": 11111,
1233        "content": "",
1234        "tags": []
1235      }
1236    },
1237    {
1238      "kind": 12345,
1239      "name": "Relay Policy Configuration",
1240      "description": "Relay-internal policy configuration (admin only)",
1241      "nip": null,
1242      "isReplaceable": true,
1243      "spec": "orly",
1244      "template": {
1245        "kind": 12345,
1246        "content": "",
1247        "tags": []
1248      }
1249    },
1250    {
1251      "kind": 13004,
1252      "name": "JWT Binding",
1253      "description": "Link between JWT certificate and pubkey",
1254      "nip": null,
1255      "isReplaceable": true,
1256      "template": {
1257        "kind": 13004,
1258        "content": "",
1259        "tags": []
1260      }
1261    },
1262    {
1263      "kind": 13194,
1264      "name": "Wallet Service Info",
1265      "description": "NWC wallet service information",
1266      "nip": "47",
1267      "isReplaceable": true,
1268      "template": {
1269        "kind": 13194,
1270        "content": "",
1271        "tags": []
1272      }
1273    },
1274    {
1275      "kind": 13534,
1276      "name": "Membership Lists",
1277      "description": "Group membership lists",
1278      "nip": "43",
1279      "isReplaceable": true,
1280      "template": {
1281        "kind": 13534,
1282        "content": "",
1283        "tags": []
1284      }
1285    },
1286    {
1287      "kind": 14388,
1288      "name": "User Sound Effect Lists",
1289      "description": "Sound effect lists",
1290      "nip": null,
1291      "isReplaceable": true,
1292      "spec": "Corny Chat",
1293      "template": {
1294        "kind": 14388,
1295        "content": "",
1296        "tags": []
1297      }
1298    },
1299    {
1300      "kind": 17375,
1301      "name": "Cashu Wallet Event",
1302      "description": "Cashu wallet event",
1303      "nip": "60",
1304      "isReplaceable": true,
1305      "template": {
1306        "kind": 17375,
1307        "content": "",
1308        "tags": []
1309      }
1310    },
1311    {
1312      "kind": 21000,
1313      "name": "Lightning Pub RPC",
1314      "description": "Lightning.Pub RPC",
1315      "nip": null,
1316      "isEphemeral": true,
1317      "spec": "Lightning.Pub",
1318      "template": {
1319        "kind": 21000,
1320        "content": "",
1321        "tags": []
1322      }
1323    },
1324    {
1325      "kind": 22242,
1326      "name": "Client Authentication",
1327      "description": "Authenticate to relay",
1328      "nip": "42",
1329      "isEphemeral": true,
1330      "template": {
1331        "kind": 22242,
1332        "content": "",
1333        "tags": []
1334      }
1335    },
1336    {
1337      "kind": 23194,
1338      "name": "Wallet Request",
1339      "description": "NWC wallet request",
1340      "nip": "47",
1341      "isEphemeral": true,
1342      "template": {
1343        "kind": 23194,
1344        "content": "",
1345        "tags": []
1346      }
1347    },
1348    {
1349      "kind": 23195,
1350      "name": "Wallet Response",
1351      "description": "NWC wallet response",
1352      "nip": "47",
1353      "isEphemeral": true,
1354      "template": {
1355        "kind": 23195,
1356        "content": "",
1357        "tags": []
1358      }
1359    },
1360    {
1361      "kind": 23196,
1362      "name": "Wallet Notification (NIP-04)",
1363      "description": "NWC wallet notification (NIP-04 encrypted)",
1364      "nip": "47",
1365      "isEphemeral": true,
1366      "template": {
1367        "kind": 23196,
1368        "content": "",
1369        "tags": []
1370      }
1371    },
1372    {
1373      "kind": 23197,
1374      "name": "Wallet Notification",
1375      "description": "NWC wallet notification",
1376      "nip": "47",
1377      "isEphemeral": true,
1378      "template": {
1379        "kind": 23197,
1380        "content": "",
1381        "tags": []
1382      }
1383    },
1384    {
1385      "kind": 24133,
1386      "name": "Nostr Connect",
1387      "description": "Remote signer connection",
1388      "nip": "46",
1389      "isEphemeral": true,
1390      "template": {
1391        "kind": 24133,
1392        "content": "",
1393        "tags": []
1394      }
1395    },
1396    {
1397      "kind": 24242,
1398      "name": "Blobs Stored on Mediaservers",
1399      "description": "Blossom blob storage",
1400      "nip": null,
1401      "isEphemeral": true,
1402      "spec": "Blossom",
1403      "template": {
1404        "kind": 24242,
1405        "content": "",
1406        "tags": []
1407      }
1408    },
1409    {
1410      "kind": 27235,
1411      "name": "HTTP Auth",
1412      "description": "Authenticate HTTP requests",
1413      "nip": "98",
1414      "isEphemeral": true,
1415      "template": {
1416        "kind": 27235,
1417        "content": "",
1418        "tags": []
1419      }
1420    },
1421    {
1422      "kind": 28934,
1423      "name": "Join Request",
1424      "description": "Request to join group",
1425      "nip": "43",
1426      "isEphemeral": true,
1427      "template": {
1428        "kind": 28934,
1429        "content": "",
1430        "tags": []
1431      }
1432    },
1433    {
1434      "kind": 28935,
1435      "name": "Invite Request",
1436      "description": "Invite to group",
1437      "nip": "43",
1438      "isEphemeral": true,
1439      "template": {
1440        "kind": 28935,
1441        "content": "",
1442        "tags": []
1443      }
1444    },
1445    {
1446      "kind": 28936,
1447      "name": "Leave Request",
1448      "description": "Leave group request",
1449      "nip": "43",
1450      "isEphemeral": true,
1451      "template": {
1452        "kind": 28936,
1453        "content": "",
1454        "tags": []
1455      }
1456    },
1457    {
1458      "kind": 30000,
1459      "name": "Follow Sets",
1460      "description": "Categorized people lists",
1461      "nip": "51",
1462      "isAddressable": true,
1463      "template": {
1464        "kind": 30000,
1465        "content": "",
1466        "tags": [
1467          [
1468            "d",
1469            "identifier"
1470          ]
1471        ]
1472      }
1473    },
1474    {
1475      "kind": 30001,
1476      "name": "Generic Lists",
1477      "description": "Generic categorized lists",
1478      "nip": "51",
1479      "isAddressable": true,
1480      "deprecated": true,
1481      "template": {
1482        "kind": 30001,
1483        "content": "",
1484        "tags": [
1485          [
1486            "d",
1487            "identifier"
1488          ]
1489        ]
1490      }
1491    },
1492    {
1493      "kind": 30002,
1494      "name": "Relay Sets",
1495      "description": "Categorized relay lists",
1496      "nip": "51",
1497      "isAddressable": true,
1498      "template": {
1499        "kind": 30002,
1500        "content": "",
1501        "tags": [
1502          [
1503            "d",
1504            "identifier"
1505          ]
1506        ]
1507      }
1508    },
1509    {
1510      "kind": 30003,
1511      "name": "Bookmark Sets",
1512      "description": "Categorized bookmark lists",
1513      "nip": "51",
1514      "isAddressable": true,
1515      "template": {
1516        "kind": 30003,
1517        "content": "",
1518        "tags": [
1519          [
1520            "d",
1521            "identifier"
1522          ]
1523        ]
1524      }
1525    },
1526    {
1527      "kind": 30004,
1528      "name": "Curation Sets",
1529      "description": "Curated content sets",
1530      "nip": "51",
1531      "isAddressable": true,
1532      "template": {
1533        "kind": 30004,
1534        "content": "",
1535        "tags": [
1536          [
1537            "d",
1538            "identifier"
1539          ]
1540        ]
1541      }
1542    },
1543    {
1544      "kind": 30005,
1545      "name": "Video Sets",
1546      "description": "Video playlists",
1547      "nip": "51",
1548      "isAddressable": true,
1549      "template": {
1550        "kind": 30005,
1551        "content": "",
1552        "tags": [
1553          [
1554            "d",
1555            "identifier"
1556          ]
1557        ]
1558      }
1559    },
1560    {
1561      "kind": 30007,
1562      "name": "Kind Mute Sets",
1563      "description": "Muted event kinds",
1564      "nip": "51",
1565      "isAddressable": true,
1566      "template": {
1567        "kind": 30007,
1568        "content": "",
1569        "tags": [
1570          [
1571            "d",
1572            "identifier"
1573          ]
1574        ]
1575      }
1576    },
1577    {
1578      "kind": 30008,
1579      "name": "Profile Badges",
1580      "description": "Badges displayed on profile",
1581      "nip": "58",
1582      "isAddressable": true,
1583      "template": {
1584        "kind": 30008,
1585        "content": "",
1586        "tags": [
1587          [
1588            "d",
1589            "identifier"
1590          ]
1591        ]
1592      }
1593    },
1594    {
1595      "kind": 30009,
1596      "name": "Badge Definition",
1597      "description": "Define a badge/achievement",
1598      "nip": "58",
1599      "isAddressable": true,
1600      "template": {
1601        "kind": 30009,
1602        "content": "",
1603        "tags": [
1604          [
1605            "d",
1606            "identifier"
1607          ]
1608        ]
1609      }
1610    },
1611    {
1612      "kind": 30015,
1613      "name": "Interest Sets",
1614      "description": "Interest/topic sets",
1615      "nip": "51",
1616      "isAddressable": true,
1617      "template": {
1618        "kind": 30015,
1619        "content": "",
1620        "tags": [
1621          [
1622            "d",
1623            "identifier"
1624          ]
1625        ]
1626      }
1627    },
1628    {
1629      "kind": 30017,
1630      "name": "Stall",
1631      "description": "Marketplace stall definition",
1632      "nip": "15",
1633      "isAddressable": true,
1634      "template": {
1635        "kind": 30017,
1636        "content": "",
1637        "tags": [
1638          [
1639            "d",
1640            "identifier"
1641          ]
1642        ]
1643      }
1644    },
1645    {
1646      "kind": 30018,
1647      "name": "Product",
1648      "description": "Marketplace product listing",
1649      "nip": "15",
1650      "isAddressable": true,
1651      "template": {
1652        "kind": 30018,
1653        "content": "",
1654        "tags": [
1655          [
1656            "d",
1657            "identifier"
1658          ]
1659        ]
1660      }
1661    },
1662    {
1663      "kind": 30019,
1664      "name": "Marketplace UI/UX",
1665      "description": "Marketplace interface settings",
1666      "nip": "15",
1667      "isAddressable": true,
1668      "template": {
1669        "kind": 30019,
1670        "content": "",
1671        "tags": [
1672          [
1673            "d",
1674            "identifier"
1675          ]
1676        ]
1677      }
1678    },
1679    {
1680      "kind": 30020,
1681      "name": "Product Sold as Auction",
1682      "description": "Auction product listing",
1683      "nip": "15",
1684      "isAddressable": true,
1685      "template": {
1686        "kind": 30020,
1687        "content": "",
1688        "tags": [
1689          [
1690            "d",
1691            "identifier"
1692          ]
1693        ]
1694      }
1695    },
1696    {
1697      "kind": 30023,
1698      "name": "Long-form Content",
1699      "description": "Blog post, article in markdown",
1700      "nip": "23",
1701      "isAddressable": true,
1702      "template": {
1703        "kind": 30023,
1704        "content": "",
1705        "tags": [
1706          [
1707            "d",
1708            "identifier"
1709          ]
1710        ]
1711      }
1712    },
1713    {
1714      "kind": 30024,
1715      "name": "Draft Long-form Content",
1716      "description": "Draft article",
1717      "nip": "23",
1718      "isAddressable": true,
1719      "template": {
1720        "kind": 30024,
1721        "content": "",
1722        "tags": [
1723          [
1724            "d",
1725            "identifier"
1726          ]
1727        ]
1728      }
1729    },
1730    {
1731      "kind": 30030,
1732      "name": "Emoji Sets",
1733      "description": "Custom emoji sets",
1734      "nip": "51",
1735      "isAddressable": true,
1736      "template": {
1737        "kind": 30030,
1738        "content": "",
1739        "tags": [
1740          [
1741            "d",
1742            "identifier"
1743          ]
1744        ]
1745      }
1746    },
1747    {
1748      "kind": 30040,
1749      "name": "Curated Publication Index",
1750      "description": "Publication index",
1751      "nip": null,
1752      "isAddressable": true,
1753      "spec": "NKBIP-01",
1754      "template": {
1755        "kind": 30040,
1756        "content": "",
1757        "tags": [
1758          [
1759            "d",
1760            "identifier"
1761          ]
1762        ]
1763      }
1764    },
1765    {
1766      "kind": 30041,
1767      "name": "Curated Publication Content",
1768      "description": "Publication content",
1769      "nip": null,
1770      "isAddressable": true,
1771      "spec": "NKBIP-01",
1772      "template": {
1773        "kind": 30041,
1774        "content": "",
1775        "tags": [
1776          [
1777            "d",
1778            "identifier"
1779          ]
1780        ]
1781      }
1782    },
1783    {
1784      "kind": 30063,
1785      "name": "Release Artifact Sets",
1786      "description": "Software release artifacts",
1787      "nip": "51",
1788      "isAddressable": true,
1789      "template": {
1790        "kind": 30063,
1791        "content": "",
1792        "tags": [
1793          [
1794            "d",
1795            "identifier"
1796          ]
1797        ]
1798      }
1799    },
1800    {
1801      "kind": 30078,
1802      "name": "Application-specific Data",
1803      "description": "App-specific key-value storage",
1804      "nip": "78",
1805      "isAddressable": true,
1806      "template": {
1807        "kind": 30078,
1808        "content": "",
1809        "tags": [
1810          [
1811            "d",
1812            "identifier"
1813          ]
1814        ]
1815      }
1816    },
1817    {
1818      "kind": 30166,
1819      "name": "Relay Discovery",
1820      "description": "Relay discovery/monitoring",
1821      "nip": "66",
1822      "isAddressable": true,
1823      "template": {
1824        "kind": 30166,
1825        "content": "",
1826        "tags": [
1827          [
1828            "d",
1829            "identifier"
1830          ]
1831        ]
1832      }
1833    },
1834    {
1835      "kind": 30267,
1836      "name": "App Curation Sets",
1837      "description": "Curated app sets",
1838      "nip": "51",
1839      "isAddressable": true,
1840      "template": {
1841        "kind": 30267,
1842        "content": "",
1843        "tags": [
1844          [
1845            "d",
1846            "identifier"
1847          ]
1848        ]
1849      }
1850    },
1851    {
1852      "kind": 30311,
1853      "name": "Live Event",
1854      "description": "Live streaming event",
1855      "nip": "53",
1856      "isAddressable": true,
1857      "template": {
1858        "kind": 30311,
1859        "content": "",
1860        "tags": [
1861          [
1862            "d",
1863            "identifier"
1864          ]
1865        ]
1866      }
1867    },
1868    {
1869      "kind": 30312,
1870      "name": "Interactive Room",
1871      "description": "Interactive live room",
1872      "nip": "53",
1873      "isAddressable": true,
1874      "template": {
1875        "kind": 30312,
1876        "content": "",
1877        "tags": [
1878          [
1879            "d",
1880            "identifier"
1881          ]
1882        ]
1883      }
1884    },
1885    {
1886      "kind": 30313,
1887      "name": "Conference Event",
1888      "description": "Conference/meetup event",
1889      "nip": "53",
1890      "isAddressable": true,
1891      "template": {
1892        "kind": 30313,
1893        "content": "",
1894        "tags": [
1895          [
1896            "d",
1897            "identifier"
1898          ]
1899        ]
1900      }
1901    },
1902    {
1903      "kind": 30315,
1904      "name": "User Statuses",
1905      "description": "User status updates",
1906      "nip": "38",
1907      "isAddressable": true,
1908      "template": {
1909        "kind": 30315,
1910        "content": "",
1911        "tags": [
1912          [
1913            "d",
1914            "identifier"
1915          ]
1916        ]
1917      }
1918    },
1919    {
1920      "kind": 30388,
1921      "name": "Slide Set",
1922      "description": "Presentation slides",
1923      "nip": null,
1924      "isAddressable": true,
1925      "spec": "Corny Chat",
1926      "template": {
1927        "kind": 30388,
1928        "content": "",
1929        "tags": [
1930          [
1931            "d",
1932            "identifier"
1933          ]
1934        ]
1935      }
1936    },
1937    {
1938      "kind": 30402,
1939      "name": "Classified Listing",
1940      "description": "Classified ad listing",
1941      "nip": "99",
1942      "isAddressable": true,
1943      "template": {
1944        "kind": 30402,
1945        "content": "",
1946        "tags": [
1947          [
1948            "d",
1949            "identifier"
1950          ]
1951        ]
1952      }
1953    },
1954    {
1955      "kind": 30403,
1956      "name": "Draft Classified Listing",
1957      "description": "Draft classified ad",
1958      "nip": "99",
1959      "isAddressable": true,
1960      "template": {
1961        "kind": 30403,
1962        "content": "",
1963        "tags": [
1964          [
1965            "d",
1966            "identifier"
1967          ]
1968        ]
1969      }
1970    },
1971    {
1972      "kind": 30617,
1973      "name": "Repository Announcements",
1974      "description": "Git repository announcement",
1975      "nip": "34",
1976      "isAddressable": true,
1977      "template": {
1978        "kind": 30617,
1979        "content": "",
1980        "tags": [
1981          [
1982            "d",
1983            "identifier"
1984          ]
1985        ]
1986      }
1987    },
1988    {
1989      "kind": 30618,
1990      "name": "Repository State Announcements",
1991      "description": "Git repository state",
1992      "nip": "34",
1993      "isAddressable": true,
1994      "template": {
1995        "kind": 30618,
1996        "content": "",
1997        "tags": [
1998          [
1999            "d",
2000            "identifier"
2001          ]
2002        ]
2003      }
2004    },
2005    {
2006      "kind": 30818,
2007      "name": "Wiki Article",
2008      "description": "Wiki article",
2009      "nip": "54",
2010      "isAddressable": true,
2011      "template": {
2012        "kind": 30818,
2013        "content": "",
2014        "tags": [
2015          [
2016            "d",
2017            "identifier"
2018          ]
2019        ]
2020      }
2021    },
2022    {
2023      "kind": 30819,
2024      "name": "Redirects",
2025      "description": "URL redirects",
2026      "nip": "54",
2027      "isAddressable": true,
2028      "template": {
2029        "kind": 30819,
2030        "content": "",
2031        "tags": [
2032          [
2033            "d",
2034            "identifier"
2035          ]
2036        ]
2037      }
2038    },
2039    {
2040      "kind": 31234,
2041      "name": "Draft Event",
2042      "description": "Draft of any event",
2043      "nip": "37",
2044      "isAddressable": true,
2045      "template": {
2046        "kind": 31234,
2047        "content": "",
2048        "tags": [
2049          [
2050            "d",
2051            "identifier"
2052          ]
2053        ]
2054      }
2055    },
2056    {
2057      "kind": 31388,
2058      "name": "Link Set",
2059      "description": "Link collection",
2060      "nip": null,
2061      "isAddressable": true,
2062      "spec": "Corny Chat",
2063      "template": {
2064        "kind": 31388,
2065        "content": "",
2066        "tags": [
2067          [
2068            "d",
2069            "identifier"
2070          ]
2071        ]
2072      }
2073    },
2074    {
2075      "kind": 31890,
2076      "name": "Feed",
2077      "description": "Custom feed definition",
2078      "nip": null,
2079      "isAddressable": true,
2080      "spec": "NUD: Custom Feeds",
2081      "template": {
2082        "kind": 31890,
2083        "content": "",
2084        "tags": [
2085          [
2086            "d",
2087            "identifier"
2088          ]
2089        ]
2090      }
2091    },
2092    {
2093      "kind": 31922,
2094      "name": "Date-Based Calendar Event",
2095      "description": "All-day calendar event",
2096      "nip": "52",
2097      "isAddressable": true,
2098      "template": {
2099        "kind": 31922,
2100        "content": "",
2101        "tags": [
2102          [
2103            "d",
2104            "identifier"
2105          ]
2106        ]
2107      }
2108    },
2109    {
2110      "kind": 31923,
2111      "name": "Time-Based Calendar Event",
2112      "description": "Calendar event with time",
2113      "nip": "52",
2114      "isAddressable": true,
2115      "template": {
2116        "kind": 31923,
2117        "content": "",
2118        "tags": [
2119          [
2120            "d",
2121            "identifier"
2122          ]
2123        ]
2124      }
2125    },
2126    {
2127      "kind": 31924,
2128      "name": "Calendar",
2129      "description": "Calendar definition",
2130      "nip": "52",
2131      "isAddressable": true,
2132      "template": {
2133        "kind": 31924,
2134        "content": "",
2135        "tags": [
2136          [
2137            "d",
2138            "identifier"
2139          ]
2140        ]
2141      }
2142    },
2143    {
2144      "kind": 31925,
2145      "name": "Calendar Event RSVP",
2146      "description": "RSVP to calendar event",
2147      "nip": "52",
2148      "isAddressable": true,
2149      "template": {
2150        "kind": 31925,
2151        "content": "",
2152        "tags": [
2153          [
2154            "d",
2155            "identifier"
2156          ]
2157        ]
2158      }
2159    },
2160    {
2161      "kind": 31989,
2162      "name": "Handler Recommendation",
2163      "description": "Recommended app for event kind",
2164      "nip": "89",
2165      "isAddressable": true,
2166      "template": {
2167        "kind": 31989,
2168        "content": "",
2169        "tags": [
2170          [
2171            "d",
2172            "identifier"
2173          ]
2174        ]
2175      }
2176    },
2177    {
2178      "kind": 31990,
2179      "name": "Handler Information",
2180      "description": "App handler declaration",
2181      "nip": "89",
2182      "isAddressable": true,
2183      "template": {
2184        "kind": 31990,
2185        "content": "",
2186        "tags": [
2187          [
2188            "d",
2189            "identifier"
2190          ]
2191        ]
2192      }
2193    },
2194    {
2195      "kind": 32123,
2196      "name": "WaveLake Track",
2197      "description": "WaveLake music track",
2198      "nip": null,
2199      "isAddressable": true,
2200      "spec": "WaveLake",
2201      "template": {
2202        "kind": 32123,
2203        "content": "",
2204        "tags": [
2205          [
2206            "d",
2207            "identifier"
2208          ]
2209        ]
2210      }
2211    },
2212    {
2213      "kind": 32267,
2214      "name": "Software Application",
2215      "description": "Software application listing",
2216      "nip": null,
2217      "isAddressable": true,
2218      "template": {
2219        "kind": 32267,
2220        "content": "",
2221        "tags": [
2222          [
2223            "d",
2224            "identifier"
2225          ]
2226        ]
2227      }
2228    },
2229    {
2230      "kind": 32388,
2231      "name": "User Room Favorites",
2232      "description": "Favorite rooms",
2233      "nip": null,
2234      "isAddressable": true,
2235      "spec": "Corny Chat",
2236      "template": {
2237        "kind": 32388,
2238        "content": "",
2239        "tags": [
2240          [
2241            "d",
2242            "identifier"
2243          ]
2244        ]
2245      }
2246    },
2247    {
2248      "kind": 33388,
2249      "name": "High Scores",
2250      "description": "Game high scores",
2251      "nip": null,
2252      "isAddressable": true,
2253      "spec": "Corny Chat",
2254      "template": {
2255        "kind": 33388,
2256        "content": "",
2257        "tags": [
2258          [
2259            "d",
2260            "identifier"
2261          ]
2262        ]
2263      }
2264    },
2265    {
2266      "kind": 34235,
2267      "name": "Video Event Horizontal",
2268      "description": "Horizontal video event",
2269      "nip": "71",
2270      "isAddressable": true,
2271      "template": {
2272        "kind": 34235,
2273        "content": "",
2274        "tags": [
2275          [
2276            "d",
2277            "identifier"
2278          ]
2279        ]
2280      }
2281    },
2282    {
2283      "kind": 34236,
2284      "name": "Video Event Vertical",
2285      "description": "Vertical video event",
2286      "nip": "71",
2287      "isAddressable": true,
2288      "template": {
2289        "kind": 34236,
2290        "content": "",
2291        "tags": [
2292          [
2293            "d",
2294            "identifier"
2295          ]
2296        ]
2297      }
2298    },
2299    {
2300      "kind": 34388,
2301      "name": "Sound Effects",
2302      "description": "Sound effect definitions",
2303      "nip": null,
2304      "isAddressable": true,
2305      "spec": "Corny Chat",
2306      "template": {
2307        "kind": 34388,
2308        "content": "",
2309        "tags": [
2310          [
2311            "d",
2312            "identifier"
2313          ]
2314        ]
2315      }
2316    },
2317    {
2318      "kind": 34550,
2319      "name": "Community Definition",
2320      "description": "Define a community",
2321      "nip": "72",
2322      "isAddressable": true,
2323      "template": {
2324        "kind": 34550,
2325        "content": "",
2326        "tags": [
2327          [
2328            "d",
2329            "identifier"
2330          ]
2331        ]
2332      }
2333    },
2334    {
2335      "kind": 37516,
2336      "name": "Geocache Listing",
2337      "description": "Geocache location listing",
2338      "nip": null,
2339      "isAddressable": true,
2340      "spec": "geocaching",
2341      "template": {
2342        "kind": 37516,
2343        "content": "",
2344        "tags": [
2345          [
2346            "d",
2347            "identifier"
2348          ]
2349        ]
2350      }
2351    },
2352    {
2353      "kind": 38172,
2354      "name": "Cashu Mint Announcement",
2355      "description": "Cashu mint announcement",
2356      "nip": "87",
2357      "isAddressable": true,
2358      "template": {
2359        "kind": 38172,
2360        "content": "",
2361        "tags": [
2362          [
2363            "d",
2364            "identifier"
2365          ]
2366        ]
2367      }
2368    },
2369    {
2370      "kind": 38173,
2371      "name": "Fedimint Announcement",
2372      "description": "Fedimint announcement",
2373      "nip": "87",
2374      "isAddressable": true,
2375      "template": {
2376        "kind": 38173,
2377        "content": "",
2378        "tags": [
2379          [
2380            "d",
2381            "identifier"
2382          ]
2383        ]
2384      }
2385    },
2386    {
2387      "kind": 38383,
2388      "name": "Peer-to-peer Order Events",
2389      "description": "P2P trading orders",
2390      "nip": "69",
2391      "isAddressable": true,
2392      "template": {
2393        "kind": 38383,
2394        "content": "",
2395        "tags": [
2396          [
2397            "d",
2398            "identifier"
2399          ]
2400        ]
2401      }
2402    },
2403    {
2404      "kind": 39000,
2405      "name": "Group Metadata Events",
2406      "description": "Group metadata (start of range)",
2407      "nip": "29",
2408      "isAddressable": true,
2409      "template": {
2410        "kind": 39000,
2411        "content": "",
2412        "tags": [
2413          [
2414            "d",
2415            "identifier"
2416          ]
2417        ]
2418      }
2419    },
2420    {
2421      "kind": 39089,
2422      "name": "Starter Packs",
2423      "description": "Starter pack lists",
2424      "nip": "51",
2425      "isAddressable": true,
2426      "template": {
2427        "kind": 39089,
2428        "content": "",
2429        "tags": [
2430          [
2431            "d",
2432            "identifier"
2433          ]
2434        ]
2435      }
2436    },
2437    {
2438      "kind": 39092,
2439      "name": "Media Starter Packs",
2440      "description": "Media starter packs",
2441      "nip": "51",
2442      "isAddressable": true,
2443      "template": {
2444        "kind": 39092,
2445        "content": "",
2446        "tags": [
2447          [
2448            "d",
2449            "identifier"
2450          ]
2451        ]
2452      }
2453    },
2454    {
2455      "kind": 39701,
2456      "name": "Web Bookmarks",
2457      "description": "Web URL bookmarks",
2458      "nip": "B0",
2459      "isAddressable": true,
2460      "template": {
2461        "kind": 39701,
2462        "content": "",
2463        "tags": [
2464          [
2465            "d",
2466            "identifier"
2467          ]
2468        ]
2469      }
2470    },
2471    {
2472      "kind": 39998,
2473      "name": "ACL Event",
2474      "description": "Access control list event",
2475      "nip": null,
2476      "isAddressable": true,
2477      "template": {
2478        "kind": 39998,
2479        "content": "",
2480        "tags": [
2481          [
2482            "d",
2483            "identifier"
2484          ]
2485        ]
2486      }
2487    }
2488  ];
2489  
2490  // Kind ranges for classification
2491  export const kindRanges = {
2492    "regular": {
2493      "start": 1000,
2494      "end": 9999,
2495      "description": "Regular events - all versions kept, never replaced"
2496    },
2497    "replaceable": {
2498      "start": 10000,
2499      "end": 19999,
2500      "description": "Replaceable events - only latest per pubkey kept"
2501    },
2502    "ephemeral": {
2503      "start": 20000,
2504      "end": 29999,
2505      "description": "Ephemeral events - forwarded but not stored"
2506    },
2507    "parameterized": {
2508      "start": 30000,
2509      "end": 39999,
2510      "description": "Parameterized replaceable - replaced by d tag value"
2511    }
2512  };
2513  
2514  // Privileged kinds (require auth)
2515  export const privilegedKinds = [4,13,14,15,1059,1060,30078];
2516  
2517  // Directory kinds (public discovery)
2518  export const directoryKinds = [0,3,5,1984,10002,10000,10050];
2519  
2520  // Kind aliases
2521  export const kindAliases = {
2522    "SetMetadata": 0,
2523    "Follows": 3,
2524    "Contacts": 3,
2525    "Deletion": 5,
2526    "MemoryHole": 1984,
2527    "BlockList": 10000,
2528    "Article": 30023,
2529    "CategorizedPeopleList": 30000,
2530    "CategorizedBookmarksList": 30001
2531  };
2532  
2533  export function getEventKind(kindNumber: number): EventKind | undefined {
2534    return eventKinds.find(k => k.kind === kindNumber);
2535  }
2536  
2537  export function getKindInfo(kind: number): EventKind | undefined {
2538    return getEventKind(kind);
2539  }
2540  
2541  export function getKindName(kind: number): string {
2542    const info = getEventKind(kind);
2543    return info ? info.name : `Kind ${kind}`;
2544  }
2545  
2546  export function searchEventKinds(query: string): EventKind[] {
2547    const lowerQuery = query.toLowerCase();
2548    return eventKinds.filter(k =>
2549      k.name.toLowerCase().includes(lowerQuery) ||
2550      k.description.toLowerCase().includes(lowerQuery) ||
2551      k.kind.toString().includes(query)
2552    );
2553  }
2554  
2555  export function getEventKindsByCategory() {
2556    return {
2557      regular: eventKinds.filter(k => k.kind < 10000 && !k.isReplaceable),
2558      replaceable: eventKinds.filter(k => k.isReplaceable),
2559      ephemeral: eventKinds.filter(k => k.isEphemeral),
2560      addressable: eventKinds.filter(k => k.isAddressable)
2561    };
2562  }
2563  
2564  export function createTemplateEvent(kindNumber: number, userPubkey: string | null = null) {
2565    const kindInfo = getEventKind(kindNumber);
2566    if (!kindInfo) {
2567      return {
2568        kind: kindNumber,
2569        content: "",
2570        tags: [] as string[][],
2571        created_at: Math.floor(Date.now() / 1000),
2572        pubkey: userPubkey || "<your_pubkey_here>"
2573      };
2574    }
2575  
2576    return {
2577      ...kindInfo.template,
2578      created_at: Math.floor(Date.now() / 1000),
2579      pubkey: userPubkey || "<your_pubkey_here>"
2580    };
2581  }
2582  
2583  export function isReplaceable(kind: number): boolean {
2584    if (kind === 0 || kind === 3) return true;
2585    return kind >= 10000 && kind < 19999;
2586  }
2587  
2588  export function isEphemeral(kind: number): boolean {
2589    return kind >= 20000 && kind < 29999;
2590  }
2591  
2592  export function isAddressable(kind: number): boolean {
2593    return kind >= 30000 && kind <= 39999;
2594  }
2595  
2596  export function isPrivileged(kind: number): boolean {
2597    return privilegedKinds.includes(kind);
2598  }
2599  
2600  export const kindCategories = [
2601    { id: "all", name: "All Kinds", filter: (_k: EventKind) => true },
2602    { id: "regular", name: "Regular Events (0-9999)", filter: (k: EventKind) => k.kind < 10000 && !k.isReplaceable },
2603    { id: "replaceable", name: "Replaceable (10000-19999)", filter: (k: EventKind) => k.isReplaceable },
2604    { id: "ephemeral", name: "Ephemeral (20000-29999)", filter: (k: EventKind) => k.isEphemeral },
2605    { id: "addressable", name: "Addressable (30000-39999)", filter: (k: EventKind) => k.isAddressable },
2606    { id: "social", name: "Social", filter: (k: EventKind) => [0, 1, 3, 6, 7].includes(k.kind) },
2607    { id: "messaging", name: "Messaging", filter: (k: EventKind) => [4, 9, 10, 11, 12, 14, 15, 40, 41, 42].includes(k.kind) },
2608    { id: "lists", name: "Lists", filter: (k: EventKind) => k.name.toLowerCase().includes("list") || k.name.toLowerCase().includes("set") },
2609    { id: "marketplace", name: "Marketplace", filter: (k: EventKind) => [30017, 30018, 30019, 30020, 1021, 1022, 30402, 30403].includes(k.kind) },
2610    { id: "lightning", name: "Lightning/Zaps", filter: (k: EventKind) => [9734, 9735, 9041, 9321, 7374, 7375, 7376].includes(k.kind) },
2611    { id: "media", name: "Media", filter: (k: EventKind) => [20, 21, 22, 1063, 1222, 1244].includes(k.kind) },
2612    { id: "git", name: "Git/Code", filter: (k: EventKind) => [818, 1337, 1617, 1618, 1619, 1621, 1622, 30617, 30618].includes(k.kind) },
2613    { id: "calendar", name: "Calendar", filter: (k: EventKind) => [31922, 31923, 31924, 31925].includes(k.kind) },
2614    { id: "groups", name: "Groups", filter: (k: EventKind) => (k.kind >= 9000 && k.kind <= 9030) || (k.kind >= 39000 && k.kind <= 39009) },
2615  ];
2616