NIP-52は、Nostr上のcalendar events、calendar、RSVPを定義します。これによりclientは、appごとに独自のevent modelを作らずに、時間ベースや日付ベースのイベントを公開する標準的な方法を得られます。

Event Kinds

Kind 31922: Date-Based Calendar Event

時刻が重要でない終日イベントや複数日イベントにはkind 31922を使います。

{
  "kind": 31922,
  "tags": [
    ["d", "unique-identifier"],
    ["title", "Nostr Meetup"],
    ["start", "2026-02-15"],
    ["end", "2026-02-16"],
    ["location", "Austin, TX"]
  ]
}

Kind 31923: Time-Based Calendar Event

正確な開始時刻と終了時刻を持つイベントにはkind 31923を使います。

{
  "kind": 31923,
  "tags": [
    ["d", "unique-identifier"],
    ["title", "Weekly Call"],
    ["start", "1706900400"],
    ["end", "1706904000"],
    ["D", "19755"],
    ["start_tzid", "America/New_York"]
  ]
}

time-based eventでは、イベントがまたぐ日ごとのday-granularity Unix timestampを入れたDタグも1つ以上必要です。このタグがあることで、relayやclientは完全なtimestampを毎回解析せず、日単位でindexできます。

CalendarとRSVP対応

Kind 31924はcalendarで、calendar eventのaddressable listです。Kind 31925はRSVPで、aタグで特定のcalendar eventを参照し、必要ならeタグで特定revisionも参照します。

Kind 31925イベントでは、ユーザーは次の応答ができます。

  • accepted - 参加する
  • declined - 参加しない
  • tentative - 参加するかもしれない

RSVPには、出欠に加え予定調整の文脈を与えるfb値としてfreeまたはbusyも含められます。

実装メモ

  • Addressable: イベントとcalendarは重複を作らずに更新できる
  • Timezone support: time-based eventはIANA timezone identifiersを使える
  • Location data: タグには人間向けlocation、links、geohashを含められる
  • Collaborative requests: イベント作者はtaggingにより他人のcalendarへ追加を依頼できる

繰り返しイベントは意図的に仕様範囲外です。仕様はrecurrence ruleをclient側へ委ねており、これによってrelay側indexingを単純に保ち、daylight savingの変化や例外処理といった典型的なcalendar edge caseを避けています。

なぜ重要か

NIP-52は単にmeetingを記述する以上のものです。event定義、calendar membership、attendee responseを別々のevent kindへ分離します。これにより、あるappがイベントを公開し、別のappがcalendarを集約し、さらに別のappがRSVP状態を管理するといったことが、同じbackendを共有しなくても可能になります。


Primary sources:

Mentioned in:

See also: