diff --git a/src/components/nostr/kinds/RelayMembersRenderer.tsx b/src/components/nostr/kinds/RelayMembersRenderer.tsx
new file mode 100644
index 0000000..452315e
--- /dev/null
+++ b/src/components/nostr/kinds/RelayMembersRenderer.tsx
@@ -0,0 +1,67 @@
+import { Users } from "lucide-react";
+import { getTagValues } from "@/lib/nostr-utils";
+import {
+ BaseEventProps,
+ BaseEventContainer,
+ ClickableEventTitle,
+} from "./BaseEventRenderer";
+import { PubkeyListPreview, PubkeyListFull } from "../lists";
+import type { NostrEvent } from "@/types/nostr";
+
+/**
+ * Kind 13534 Renderer - Relay Members (Feed View)
+ * NIP-43 relay membership list using "member" tags
+ */
+export function RelayMembersRenderer({ event }: BaseEventProps) {
+ const members = getTagValues(event, "member");
+
+ return (
+
+
+
+
+ Relay Members
+
+
+ {members.length === 0 ? (
+
+ Empty membership list
+
+ ) : (
+
+ )}
+
+
+ );
+}
+
+/**
+ * Kind 13534 Detail View - Full relay membership list
+ */
+export function RelayMembersDetailRenderer({ event }: { event: NostrEvent }) {
+ const members = getTagValues(event, "member");
+
+ return (
+
+
+
+ Relay Members
+
+
+ {members.length > 0 ? (
+
+ ) : (
+
+ Empty membership list
+
+ )}
+
+ );
+}
diff --git a/src/components/nostr/kinds/RelayUserChangeRenderer.tsx b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx
new file mode 100644
index 0000000..6586c31
--- /dev/null
+++ b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx
@@ -0,0 +1,132 @@
+import { UserPlus, UserMinus } from "lucide-react";
+import { getTagValue } from "applesauce-core/helpers";
+import {
+ BaseEventProps,
+ BaseEventContainer,
+ ClickableEventTitle,
+} from "./BaseEventRenderer";
+import { PubkeyListFull } from "../lists";
+import { UserName } from "../UserName";
+import type { NostrEvent } from "@/types/nostr";
+
+/**
+ * Kind 8000 Renderer - Add User (Feed View)
+ * NIP-43 event published when a member is added to a relay
+ */
+export function AddUserRenderer({ event }: BaseEventProps) {
+ const pubkey = getTagValue(event, "p");
+
+ if (!pubkey) {
+ return (
+
+
+ Invalid event (missing pubkey)
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ User Added
+
+
+
+
+ added to relay
+
+
+
+ );
+}
+
+/**
+ * Kind 8000 Detail View
+ */
+export function AddUserDetailRenderer({ event }: { event: NostrEvent }) {
+ const pubkey = getTagValue(event, "p");
+
+ return (
+
+
+
+ User Added
+
+
+ {pubkey ? (
+
+ ) : (
+
+ Invalid event (missing pubkey)
+
+ )}
+
+ );
+}
+
+/**
+ * Kind 8001 Renderer - Remove User (Feed View)
+ * NIP-43 event published when a member is removed from a relay
+ */
+export function RemoveUserRenderer({ event }: BaseEventProps) {
+ const pubkey = getTagValue(event, "p");
+
+ if (!pubkey) {
+ return (
+
+
+ Invalid event (missing pubkey)
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ User Removed
+
+
+
+
+ removed from relay
+
+
+
+ );
+}
+
+/**
+ * Kind 8001 Detail View
+ */
+export function RemoveUserDetailRenderer({ event }: { event: NostrEvent }) {
+ const pubkey = getTagValue(event, "p");
+
+ return (
+
+
+
+ User Removed
+
+
+ {pubkey ? (
+
+ ) : (
+
+ Invalid event (missing pubkey)
+
+ )}
+
+ );
+}
diff --git a/src/components/nostr/kinds/index.tsx b/src/components/nostr/kinds/index.tsx
index 0494f88..fcec3b3 100644
--- a/src/components/nostr/kinds/index.tsx
+++ b/src/components/nostr/kinds/index.tsx
@@ -67,6 +67,16 @@ import { ZapstoreAppSetDetailRenderer } from "./ZapstoreAppSetDetailRenderer";
import { ZapstoreReleaseRenderer } from "./ZapstoreReleaseRenderer";
import { ZapstoreReleaseDetailRenderer } from "./ZapstoreReleaseDetailRenderer";
import { GroupMetadataRenderer } from "./GroupMetadataRenderer";
+import {
+ RelayMembersRenderer,
+ RelayMembersDetailRenderer,
+} from "./RelayMembersRenderer";
+import {
+ AddUserRenderer,
+ AddUserDetailRenderer,
+ RemoveUserRenderer,
+ RemoveUserDetailRenderer,
+} from "./RelayUserChangeRenderer";
// NIP-51 List Renderers
import { MuteListRenderer, MuteListDetailRenderer } from "./MuteListRenderer";
import { PinListRenderer, PinListDetailRenderer } from "./PinListRenderer";
@@ -159,6 +169,8 @@ const kindRenderers: Record> = {
1621: IssueRenderer, // Issue (NIP-34)
9735: Kind9735Renderer, // Zap Receipt
9802: Kind9802Renderer, // Highlight
+ 8000: AddUserRenderer, // Add User (NIP-43)
+ 8001: RemoveUserRenderer, // Remove User (NIP-43)
777: SpellRenderer, // Spell (Grimoire)
10000: MuteListRenderer, // Mute List (NIP-51)
10001: PinListRenderer, // Pin List (NIP-51)
@@ -178,6 +190,7 @@ const kindRenderers: Record> = {
10101: WikiAuthorsRenderer, // Good Wiki Authors (NIP-51)
10102: WikiRelaysRenderer, // Good Wiki Relays (NIP-51)
10317: Kind10317Renderer, // User Grasp List (NIP-34)
+ 13534: RelayMembersRenderer, // Relay Members (NIP-43)
30000: FollowSetRenderer, // Follow Sets (NIP-51)
30002: GenericRelayListRenderer, // Relay Sets (NIP-51)
30003: BookmarkSetRenderer, // Bookmark Sets (NIP-51)
@@ -255,6 +268,8 @@ const detailRenderers: Record<
1618: PullRequestDetailRenderer, // Pull Request Detail (NIP-34)
1621: IssueDetailRenderer, // Issue Detail (NIP-34)
9802: Kind9802DetailRenderer, // Highlight Detail
+ 8000: AddUserDetailRenderer, // Add User Detail (NIP-43)
+ 8001: RemoveUserDetailRenderer, // Remove User Detail (NIP-43)
10000: MuteListDetailRenderer, // Mute List Detail (NIP-51)
10001: PinListDetailRenderer, // Pin List Detail (NIP-51)
10002: Kind10002DetailRenderer, // Relay List Detail (NIP-65)
@@ -268,6 +283,7 @@ const detailRenderers: Record<
10101: WikiAuthorsDetailRenderer, // Good Wiki Authors Detail (NIP-51)
10102: WikiRelaysDetailRenderer, // Good Wiki Relays Detail (NIP-51)
10317: Kind10317DetailRenderer, // User Grasp List Detail (NIP-34)
+ 13534: RelayMembersDetailRenderer, // Relay Members Detail (NIP-43)
30000: FollowSetDetailRenderer, // Follow Sets Detail (NIP-51)
30003: BookmarkSetDetailRenderer, // Bookmark Sets Detail (NIP-51)
30004: ArticleCurationSetDetailRenderer, // Article Curation Sets Detail (NIP-51)
diff --git a/src/constants/kinds.ts b/src/constants/kinds.ts
index 462cc1a..cfbec7c 100644
--- a/src/constants/kinds.ts
+++ b/src/constants/kinds.ts
@@ -887,13 +887,13 @@ export const EVENT_KINDS: Record = {
nip: "47",
icon: Wallet,
},
- // 13534: {
- // kind: 13534,
- // name: "Membership Lists",
- // description: "Membership Lists",
- // nip: "43",
- // icon: Users,
- // },
+ 13534: {
+ kind: 13534,
+ name: "Relay Members",
+ description: "Relay membership list",
+ nip: "43",
+ icon: Users,
+ },
// 17375: {
// kind: 17375,
// name: "Cashu Wallet Event",
@@ -950,27 +950,27 @@ export const EVENT_KINDS: Record = {
nip: "98",
icon: Key,
},
- // 28934: {
- // kind: 28934,
- // name: "Join Request",
- // description: "Join Request",
- // nip: "43",
- // icon: UserPlus,
- // },
- // 28935: {
- // kind: 28935,
- // name: "Invite Request",
- // description: "Invite Request",
- // nip: "43",
- // icon: Mail,
- // },
- // 28936: {
- // kind: 28936,
- // name: "Leave Request",
- // description: "Leave Request",
- // nip: "43",
- // icon: UserMinus,
- // },
+ 28934: {
+ kind: 28934,
+ name: "Join Request",
+ description: "Relay join request with invite code",
+ nip: "43",
+ icon: UserPlus,
+ },
+ 28935: {
+ kind: 28935,
+ name: "Invite Request",
+ description: "Request invite code from relay",
+ nip: "43",
+ icon: Mail,
+ },
+ 28936: {
+ kind: 28936,
+ name: "Leave Request",
+ description: "Request to revoke relay access",
+ nip: "43",
+ icon: UserMinus,
+ },
// Group Control
9000: {