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)
| File | Size | Uploaded | |
|---|---|---|---|
| nostrcalendar-0.2.5.tar.gz | 29.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|