NIP-30 definiert, wie Clients benutzerdefinierte Emoji in Nostr-Events anzeigen. Custom Emoji werden im Event-Inhalt über Shortcodes (:shortcode:) referenziert und durch emoji-Tags aufgelöst, die jeden Shortcode einer Bild-URL zuordnen.

Wie es funktioniert

Ein Event mit Custom Emoji enthält emoji-Tags zusammen mit den Shortcode-Referenzen im Inhalt:

{
  "content": "Hello :gleam: world :nostrich:",
  "tags": [
    ["emoji", "gleam", "https://example.com/gleam.png"],
    ["emoji", "nostrich", "https://example.com/nostrich.png"]
  ]
}

Clients ersetzen :gleam: und :nostrich: im gerenderten Inhalt durch Inline-Bilder von den angegebenen URLs. Shortcodes müssen alphanumerisch sein, wobei Unterstriche als Trennzeichen erlaubt sind, und die Bild-URLs sollten auf kleine, quadratische Bilder verweisen, die sich für die Inline-Anzeige eignen.

Emoji-Sets

Custom Emoji können in benannten Sets organisiert werden, die als kind 30030 parameterized replaceable events veröffentlicht werden. Jedes Set gruppiert verwandte Emoji unter einem d-Tag-Bezeichner:

{
  "kind": 30030,
  "tags": [
    ["d", "nostr-animals"],
    ["emoji", "nostrich", "https://example.com/nostrich.png"],
    ["emoji", "nostrcat", "https://example.com/nostrcat.png"]
  ]
}

Ein Update im März 2026 (PR #2247) fügte optionale Emoji-Set-Adressreferenzen in Emoji-Tags hinzu, sodass Clients das zugehörige Set zum Durchsuchen oder Speichern öffnen können, wenn ein Nutzer auf ein Emoji klickt.

Interop-Hinweise

Custom Emoji sind eine Darstellungsfunktion, keine Transportgarantie. Wenn ein Client NIP-30 nicht versteht oder die Bild-URL nicht laden kann, sollte er trotzdem den rohen :shortcode:-Text anzeigen. Genau deshalb sind lesbare Shortcodes wichtig.

Das Tag ist lokal für das jeweilige Event, solange es nicht auf ein Set verweist. Wenn :fire: in zwei verschiedenen Events vorkommt, bedeutet das nicht automatisch dieselbe globale Bedeutung, es sei denn, beide verweisen auf dasselbe Bild oder dasselbe Set. Clients sollten die Emoji-Definition zuerst aus dem aktuellen Event auflösen.

Reaktionen

NIP-30 Custom Emoji funktionieren auch in kind-7-Reaktions-Events. Eine Reaktion mit content, das auf einen Shortcode gesetzt ist, und einem passenden emoji-Tag wird als Custom-Emoji-Reaktion auf dem referenzierten Event gerendert:

{
  "kind": 7,
  "content": ":fire:",
  "tags": [
    ["emoji", "fire", "https://example.com/fire.gif"],
    ["e", "<event-id>"]
  ]
}

Primärquellen:

Erwähnt in: