Skip to main content

NostrCalendar for OpenClaw

Give your AI agent a calendar.

Nostr-native scheduling that lets AI agents manage availability, book meetings, and negotiate times — all over relays, no centralized server. Think Calendly, but sovereign.

Why?

Scheduling is one of the most common things humans delegate. But every scheduling tool today is a walled garden — your availability lives on someone else's server, behind someone else's login.

NostrCalendar stores availability as Nostr events on your relay. Your AI agent reads and writes these events with its own keypair. Two agents can negotiate a meeting for their humans without either human lifting a finger.

What your agent can do:

  • Publish and update availability schedules
  • Check anyone's free slots on any relay
  • Send encrypted booking requests via DM
  • Accept, decline, or cancel meetings
  • Negotiate times with other agents (agent-to-agent)
  • Find mutual availability across multiple days

Install

pip install nostrcalendar

v0.2.4 — part of the coordinated 2026-07 correctness release (staged, pending PyPI publish). The whole Nostr library family was audited together and every package is now verified against a shared spine of known-answer test vectors (NIP-44 v2, NIP-49, NIP-19 TLV, BIP-340) so encode/decode bugs can't hide inside self-round-trip tests. This release fixes the encrypt/decrypt argument order so every booking and negotiation flow actually publishes. See CHANGELOG.md.

Quick Start

import asyncio
from nostrkey import Identity
from nostrcalendar import (
    AvailabilityRule, DayOfWeek, TimeSlot,
    publish_availability, get_free_slots, create_booking,
)
from datetime import datetime

async def main():
    identity = Identity.generate()
    relay = "wss://relay.nostrkeep.com"

    # Publish availability
    rule = AvailabilityRule(
        slots={
            DayOfWeek.MONDAY: [TimeSlot("09:00", "12:00"), TimeSlot("14:00", "17:00")],
            DayOfWeek.WEDNESDAY: [TimeSlot("10:00", "16:00")],
        },
        slot_duration_minutes=30,
        buffer_minutes=15,
        timezone="America/Vancouver",
    )
    await publish_availability(identity, rule, relay)

    # Check someone's availability
    slots = await get_free_slots("their_pubkey_hex", relay, datetime(2026, 3, 15))
    for slot in slots:
        print(f"{slot.start} - {slot.end}")

asyncio.run(main())

Agent-to-Agent Negotiation

from nostrcalendar import find_mutual_availability
from datetime import datetime, timedelta

dates = [datetime(2026, 3, d) for d in range(15, 20)]
mutual = await find_mutual_availability(my_agent, other_pubkey, relay, dates)

for date, slots in mutual.items():
    print(f"{date}: {', '.join(f'{s.start}-{s.end}' for s in slots)}")

NIPs Implemented

NIP Purpose
NIP-01 Basic event structure
NIP-04 Encrypted DMs (booking requests)
NIP-09 Event deletion (cancellations)
NIP-52 Calendar events & RSVPs
NIP-78 App-specific data (availability rules)

OpenClaw Skill

NostrCalendar is published on ClawHub as the nostrcalendar skill. Install it in your OpenClaw agent to give it scheduling capabilities.

License

MIT — Humanjava Enterprises Inc.

Release files for nostrcalendar 0.2.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nostrcalendar 0.2.5
File Size Uploaded
nostrcalendar-0.2.5.tar.gz 29.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nostrcalendar 0.2.5
File Interpreter ABI Platform
nostrcalendar-0.2.5-py3-none-any.whl Python 3 none any Details

Total release size:45.7 kB

Release files / nostrcalendar-0.2.5.tar.gz

Download URL nostrcalendar-0.2.5.tar.gz
Size 29.1 kB
Tags Source
SHA-256 checksum
How to use checksums
fd9007c8b9d516a2273f7e6dabdf94b25f337bbb3880e56a3271e925e6956992
BLAKE2b-256 checksum
How to use checksums
52b43f9430f4275ec0eca919a416760be3d4a37ff7d01adc9f7dbea02d1d61f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / nostrcalendar-0.2.5-py3-none-any.whl

Download URL nostrcalendar-0.2.5-py3-none-any.whl
Size 16.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
833a483ee32ce1ad52e77990c359b67656504a876df6a6b4c50aab999ebc4371
BLAKE2b-256 checksum
How to use checksums
6b0a76f9db1f60639381661998bec08981c5f9c2676fbc42e90ede1763e67369
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release history Release notifications | RSS feed

This release

0.2.5 This release

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page