NIP-52: Calendar Events
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:
- Newsletter #7: Notedeck Calendar App Draft
- Newsletter #10: NIP Updates
- Newsletter #10: NIP Deep Dive
- Newsletter #13: Calendar by Form* v0.2.0
See also: