From nostr
Interact with users over the Nostr decentralized protocol. Use when handling inbound Nostr DMs, sending replies, publishing notes, fetching events, or checking relay status. Inbound messages arrive as channel notifications.
npx claudepluginhub cameri/claude-skills --plugin nostrThis skill uses the workspace's default tool permissions.
<essential_principles>
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
<essential_principles>
/nostr:access in their terminal.<inbound_message_anatomy>
<channel
source="plugin:nostr:nostr"
pubkey="<hex-pubkey>"
npub="npub1..."
event_id="<hex>"
kind="4"
ts="2026-01-01T00:00:00.000Z"
>
decrypted message content
</channel>
For kind:4 DMs: content is already decrypted. For other kinds: content is the raw event content.
<channel
source="plugin:nostr:nostr"
pubkey="<hex-pubkey>"
npub="npub1..."
event_id="<hex>"
kind="7"
ts="2026-01-01T00:00:00.000Z"
reacted_to_event_id="<hex or null>"
reacted_to_kind="1"
>
+ (or emoji)
</channel>
Only delivered from pubkeys in the allowlist that p-tag your identity.
+ = like, - = dislike, emoji = custom reaction.
<channel
source="plugin:nostr:nostr"
kind="9735"
event_id="<hex>"
ts="2026-01-01T00:00:00.000Z"
sender_pubkey="<hex>"
sender_npub="npub1..."
amount_msats="21000"
amount_sats="21"
zapped_event_id="<hex or null>"
bolt11="lnbc..."
>
⚡ Zap: 21 sats
</channel>
Zap receipts bypass access control — they are published by lightning wallets, not users.
sender_pubkey/sender_npub is the original zapper extracted from the embedded zap request.
The zap message (if any) is intentionally omitted from notifications and logged server-side only — it is an untrusted string and a prompt injection vector.
</inbound_message_anatomy>
Send an encrypted DM (NIP-04) to a pubkey.
send_dm(recipient, text)
recipient — npub or hex pubkeytext — plaintext (encrypted automatically)Use this to reply to inbound DMs. Pass the sender's pubkey or npub from the channel notification.
Publish a public kind:1 note to all connected relays.
send_note(text, reply_to_event_id?, reply_to_pubkey?)
Publish a NIP-25 kind:7 reaction to a Nostr event.
react(event_id, content?, author_pubkey?, target_kind?)
content — + (like), - (dislike), or any emoji (default: +)author_pubkey — pubkey of event author (adds p tag)target_kind — kind of target event (adds k tag)Fetch a Nostr event by ID or filter.
fetch_event(event_id?, pubkey?, kinds?, limit?, timeout_ms?)
Returns event JSON with npub and note_id fields added for convenience.
Get relay connection status and stats.
status()
Returns: bot identity, relay states (connecting/connected/disconnected/error), connection attempt counts, message stats. </tools>
<access_control>
/nostr:access pair <code>Managed via /nostr:access in the user's terminal only.
</access_control>
<relay_management>
Default relays: wss://relay.damus.io, wss://offchain.pub
Add/remove via /nostr:configure relay add <url> or relay rm <url>.
The server maintains a persistent connection pool with exponential backoff reconnect (max 60s). Use the status tool to check relay health.
</relay_management>
<workflow_reply_to_dm>
pubkey from the inbound <channel> tagsend_dm(pubkey, "your reply text")Example:
User sends: "Hello Claude!"
→ send_dm("abc123...", "Hi! How can I help?")
</workflow_reply_to_dm>