NIP-52는 Nostr의 캘린더 이벤트, 캘린더, RSVP를 정의합니다. 각 앱이 저마다의 이벤트 모델을 새로 만들지 않고도, 시간 기반 또는 날짜 기반 이벤트를 게시할 수 있는 표준 방식을 제공합니다.

이벤트 종류

Kind 31922: 날짜 기반 캘린더 이벤트

시계 시간이 중요하지 않은 종일 또는 여러 날 이벤트에는 kind 31922를 사용합니다.

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

Kind 31923: 시간 기반 캘린더 이벤트

정확한 시작 시각과 종료 시각이 있는 이벤트에는 kind 31923을 사용합니다.

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

시간 기반 이벤트에는 하나 이상의 D 태그도 필요하며, 각 태그는 이벤트가 걸치는 날짜들의 일 단위 Unix timestamp를 담습니다. 이 태그가 존재하는 이유는 릴레이와 클라이언트가 전체 timestamp를 전부 파싱하지 않고도 날짜 단위로 인덱싱할 수 있게 하기 위해서입니다.

캘린더와 RSVP 지원

Kind 31924는 캘린더이며, 캘린더 이벤트의 addressable list입니다. Kind 31925는 RSVP로, a 태그로 특정 캘린더 이벤트를 가리키고 선택적으로 e 태그로 특정 revision까지 가리킵니다.

Kind 31925 이벤트에서 사용자는 다음 값으로 응답할 수 있습니다:

  • accepted - 참석함
  • declined - 참석하지 않음
  • tentative - 참석할 수도 있음

RSVP는 fb 값으로 free 또는 busy를 포함할 수도 있어, 참석 여부를 넘어 일정 점유 맥락까지 표현할 수 있습니다.

구현 참고사항

  • 주소 지정 가능: 이벤트와 캘린더를 중복 생성 없이 갱신할 수 있음
  • 시간대 지원: 시간 기반 이벤트는 IANA timezone identifier를 사용할 수 있음
  • 위치 데이터: 태그에 사람이 읽을 수 있는 위치, 링크, geohash를 담을 수 있음
  • 협업 요청: 이벤트 작성자는 태깅을 통해 다른 사람의 캘린더에 포함 요청을 보낼 수 있음

반복 이벤트는 의도적으로 범위 밖입니다. 명세는 recurrence rule을 클라이언트에 맡기며, 덕분에 릴레이 쪽 인덱싱을 단순하게 유지하고 daylight saving time 변경이나 예외 처리 같은 일반적인 캘린더 edge case를 피합니다.

왜 중요한가

NIP-52는 단순히 회의 하나를 기술하는 수준을 넘습니다. 이벤트 정의, 캘린더 소속, 참석자 응답을 서로 다른 이벤트 kind로 분리합니다. 이 구조 덕분에 한 앱이 이벤트를 게시하고, 다른 앱이 캘린더를 집계하고, 세 번째 앱이 RSVP 상태를 관리하더라도 세 앱이 같은 backend를 공유할 필요가 없습니다.


주요 출처:

언급된 뉴스레터:

같이 보기: