+ {/* Header */}
+
+
Profile Badges
+
+
+ •
+
+ {badgePairs.length} {badgePairs.length === 1 ? "badge" : "badges"}
+
+
+
+
+ {/* Badges Grid */}
+ {badgePairs.length > 0 ? (
+
+ {badgePairs.map((pair, idx) => (
+
+ ))}
+
+ ) : (
+
+
+
No badges to display
+
+ )}
+
+ );
+}
diff --git a/src/components/nostr/kinds/ProfileBadgesRenderer.tsx b/src/components/nostr/kinds/ProfileBadgesRenderer.tsx
new file mode 100644
index 0000000..c0c777b
--- /dev/null
+++ b/src/components/nostr/kinds/ProfileBadgesRenderer.tsx
@@ -0,0 +1,117 @@
+import {
+ BaseEventContainer,
+ BaseEventProps,
+ ClickableEventTitle,
+} from "./BaseEventRenderer";
+import { getProfileBadgePairs } from "@/lib/nip58-helpers";
+import { use$ } from "applesauce-react/hooks";
+import eventStore from "@/services/event-store";
+import { AddressPointer } from "nostr-tools/nip19";
+import {
+ getBadgeName,
+ getBadgeIdentifier,
+ getBadgeImageUrl,
+} from "@/lib/nip58-helpers";
+import { Award } from "lucide-react";
+
+/**
+ * Parse an address pointer from an a tag value
+ * Format: "kind:pubkey:identifier"
+ */
+function parseAddress(aTagValue: string): AddressPointer | null {
+ const parts = aTagValue.split(":");
+ if (parts.length !== 3) return null;
+
+ const kind = parseInt(parts[0], 10);
+ const pubkey = parts[1];
+ const identifier = parts[2];
+
+ if (isNaN(kind) || !pubkey || identifier === undefined) return null;
+
+ return { kind, pubkey, identifier };
+}
+
+/**
+ * Single badge display component for feed view
+ */
+function BadgeItem({ badgeAddress }: { badgeAddress: string }) {
+ const coordinate = parseAddress(badgeAddress);
+
+ // Fetch the badge event
+ const badgeEvent = use$(
+ () =>
+ coordinate
+ ? eventStore.replaceable(
+ coordinate.kind,
+ coordinate.pubkey,
+ coordinate.identifier,
+ )
+ : undefined,
+ [coordinate?.kind, coordinate?.pubkey, coordinate?.identifier],
+ );
+
+ const badgeName = badgeEvent ? getBadgeName(badgeEvent) : null;
+ const badgeIdentifier = badgeEvent ? getBadgeIdentifier(badgeEvent) : null;
+ const badgeImageUrl = badgeEvent ? getBadgeImageUrl(badgeEvent) : null;
+
+ const displayTitle = badgeName || badgeIdentifier || "Badge";
+
+ return (
+