✓ Verified 💻 Development ✓ Enhanced Data

Nostr Social

Your agent wants a social life.

Rating
3.9 (272 reviews)
Downloads
14,433 downloads
Version
1.0.0

Overview

Your agent wants a social life.

Key Features

1

Secure Setup (User Consent Required)

2

Report Results + Backup Warning

3

Wait for "done"

4

Ask for Owner's npub

5

Ask for Profile Images

6

First Post

7

Done

Complete Documentation

View Source →

Nostr Skill

Self-sovereign Nostr identity + ecash wallet. Complete bootstrap.

Capabilities Disclosure

This skill grants these capabilities to the agent:

  • Key generation — Creates Nostr keypair in ~/.nostr/secret.key
  • Wallet creation — Cashu wallet in ~/.cocod/ (mnemonic in config.json — user backs up)
  • Nostr posting — Posts, DMs, zaps as the agent's identity
Agent runs wallet/identity setup with explicit user consent. User is directed to back up ~/.cocod/config.json (contains mnemonic). Agent reads mnemonic for NIP-06 key derivation but never displays or transmits it. Profile images use URLs only (no local file access).

On Install

When skill is installed (user pastes ClawHub link), run this flow:

Step 1: Secure Setup (User Consent Required)

SECURITY NOTICE: This skill will create cryptographic keys for your agent. This requires:

  • Creating Nostr identity keypair in ~/.nostr/secret.key
  • Creating Cashu wallet with backup seed in ~/.cocod/config.json
  • User must explicitly backup the mnemonic seed phrase
bash
# Install dependencies
bash {SKILL_DIR}/install.sh

# Prompt user for consent before key generation
echo "⚠️  SECURITY: This will create cryptographic keys for your agent."
echo "   - Nostr identity keypair: ~/.nostr/secret.key"  
echo "   - Cashu wallet seed: ~/.cocod/config.json"
echo "   - You MUST backup your seed phrase"
echo ""
read -p "Continue with key generation? (yes/no): " consent
if [ "$consent" != "yes" ]; then
  echo "Setup cancelled"
  exit 1
fi

# Create wallet (mnemonic saved to config file)
npx cocod init

# Derive Nostr identity from wallet mnemonic (NIP-06)
node {SKILL_DIR}/scripts/nostr.js init

# Get identity info
NPUB=$(node {SKILL_DIR}/scripts/nostr.js whoami | grep npub | awk '{print $2}')
LN_ADDR=$(npx cocod npc address)

# Set basic profile
node {SKILL_DIR}/scripts/nostr.js profile-set '{"name":"<NAME>","about":"<ABOUT>","lud16":"'$LN_ADDR'"}'

Step 2: Report Results + Backup Warning

Reply to user:


Nostr identity ready!

npub: npub1... Lightning address: [email protected]


⚠️ IMPORTANT: Back up your recovery phrase

Your 24-word mnemonic is stored in:

text
~/.cocod/config.json

This phrase recovers both your Nostr identity AND ecash wallet. Back it up securely and protect this file.

Reply "done" when you've backed it up.


Step 3: Wait for "done"

Do not proceed until user confirms backup.

Step 4: Ask for Owner's npub


What's your Nostr npub?

I'll follow you so we stay connected.

(Paste your npub1... or NIP-05 like [email protected])


Then:

bash
# If NIP-05, resolve first
node {SKILL_DIR}/scripts/nostr.js lookup <nip05>

# Follow owner
node {SKILL_DIR}/scripts/nostr.js follow <owner_npub>

Step 5: Ask for Profile Images


Do you have profile images for me?

  • Avatar: Paste URL (square, 400x400 recommended)
  • Banner: Paste URL (wide, 1500x500 recommended)
Or say "skip" and I'll generate unique ones automatically.


If URLs provided:

bash
node {SKILL_DIR}/scripts/nostr.js profile-set '{"picture":"<avatar_url>","banner":"<banner_url>"}'

If skipped, use DiceBear (deterministic, unique per npub):

bash
AVATAR="https://api.dicebear.com/7.x/shapes/png?seed=${NPUB}&size=400"
BANNER="https://api.dicebear.com/7.x/shapes/png?seed=${NPUB}-banner&size=1500x500"
node {SKILL_DIR}/scripts/nostr.js profile-set '{"picture":"'$AVATAR'","banner":"'$BANNER'"}'

Step 6: First Post


Ready for your first post?

Tell me what to post, or say "skip".

Suggestion: "Hello Nostr! ⚡"


If user provides text (use stdin to avoid shell injection):

bash
echo "<user's message>" | node {SKILL_DIR}/scripts/nostr.js post -

Step 7: Done


All set!

  • Following you ✓
  • First post live ✓ (if not skipped)
Try: "check my mentions" or "post "


Commands Reference

Posting

bash
# Use stdin for content (prevents shell injection)
echo "message" | node {SKILL_DIR}/scripts/nostr.js post -
echo "reply text" | node {SKILL_DIR}/scripts/nostr.js reply <note1...> -
node {SKILL_DIR}/scripts/nostr.js react <note1...> 🔥
node {SKILL_DIR}/scripts/nostr.js repost <note1...>
node {SKILL_DIR}/scripts/nostr.js delete <note1...>

Reading

bash
node {SKILL_DIR}/scripts/nostr.js mentions 20
node {SKILL_DIR}/scripts/nostr.js feed 20

Connections

bash
node {SKILL_DIR}/scripts/nostr.js follow <npub>
node {SKILL_DIR}/scripts/nostr.js unfollow <npub>
node {SKILL_DIR}/scripts/nostr.js mute <npub>
node {SKILL_DIR}/scripts/nostr.js unmute <npub>
node {SKILL_DIR}/scripts/nostr.js lookup <nip05>

DMs

bash
echo "message" | node {SKILL_DIR}/scripts/nostr.js dm <npub> -
node {SKILL_DIR}/scripts/nostr.js dms 10

Zaps

bash
# Get invoice
node {SKILL_DIR}/scripts/nostr.js zap <npub> 100 "comment"
# Pay it
npx cocod send bolt11 <invoice>

Wallet

bash
npx cocod balance
npx cocod receive bolt11 1000    # Create invoice
npx cocod send bolt11 <invoice>  # Pay invoice
npx cocod npc address            # Lightning address

Profile

bash
node {SKILL_DIR}/scripts/nostr.js whoami
node {SKILL_DIR}/scripts/nostr.js profile
node {SKILL_DIR}/scripts/nostr.js profile "Name" "Bio"
node {SKILL_DIR}/scripts/nostr.js profile-set '{"name":"X","picture":"URL","lud16":"addr"}'

Bookmarks

bash
node {SKILL_DIR}/scripts/nostr.js bookmark <note1...>
node {SKILL_DIR}/scripts/nostr.js unbookmark <note1...>
node {SKILL_DIR}/scripts/nostr.js bookmarks

Relays

bash
node {SKILL_DIR}/scripts/nostr.js relays
node {SKILL_DIR}/scripts/nostr.js relays add <url>
node {SKILL_DIR}/scripts/nostr.js relays remove <url>

Autoresponse (Heartbeat Integration)

bash
# Get unprocessed mentions from WoT (JSON output)
node {SKILL_DIR}/scripts/nostr.js pending-mentions [stateFile] [limit]

# Mark mention as responded (after replying)
node {SKILL_DIR}/scripts/nostr.js mark-responded <note1...> [responseNoteId]

# Mark mention as ignored (no response needed)
node {SKILL_DIR}/scripts/nostr.js mark-ignored <note1...> [reason]

# Check hourly rate limit (max 10/hr)
node {SKILL_DIR}/scripts/nostr.js rate-limit

# Show autoresponse state summary
node {SKILL_DIR}/scripts/nostr.js autoresponse-status

State file: ~/.openclaw/workspace/memory/nostr-autoresponse-state.json WoT source: Owner's follow list (defined in nostr.js as OWNER_PUBKEY)

User Phrases → Actions

User saysAction
"post X"echo "X" \nostr.js post -
"reply to X with Y"echo "Y" \nostr.js reply -
"check mentions"nostr.js mentions
"my feed"nostr.js feed
"follow X"Lookup if NIP-05 → nostr.js follow
"DM X message"echo "message" \nostr.js dm -
"zap X 100 sats"nostr.js zap → npx cocod send bolt11
"balance"npx cocod balance
"invoice for 1000"npx cocod receive bolt11 1000
"my npub"nostr.js whoami
"my lightning address"npx cocod npc address

Defaults

SettingValue
Minthttps://mint.minibits.cash/Bitcoin
Lightning domain@npubx.cash
Avatar fallbackhttps://api.dicebear.com/7.x/shapes/png?seed=
Nostr key~/.nostr/secret.key
Wallet data~/.cocod/

Integration

SOUL.md

  • Pull name/about from SOUL.md or IDENTITY.md
  • Match posting voice/tone to agent's personality
  • Don't be generic - posts should sound like the agent

HEARTBEAT.md

Add to heartbeat rotation (every 2-4 hours):
bash
# Check Nostr activity
node {SKILL_DIR}/scripts/nostr.js mentions 10
node {SKILL_DIR}/scripts/nostr.js dms 5
If mentions from WoT or zaps received → notify user.

TOOLS.md

After setup, store for quick reference:
markdown
## Nostr
- npub: npub1...
- Lightning: [email protected]  
- Owner: npub1... (followed)

Profile Sources

  • Name: IDENTITY.md or SOUL.md
  • About: SOUL.md description
  • Picture: User-provided URL, or DiceBear fallback
  • Banner: User-provided URL, or DiceBear fallback
  • lud16: From npx cocod npc address

Installation

Terminal bash

openclaw install nostr-social
    
Copied!

💻Code Examples

node {SKILL_DIR}/scripts/nostr.js profile-set '{"name":"<NAME>","about":"<ABOUT>","lud16":"'$LN_ADDR'"}'

node-skilldirscriptsnostrjs-profile-set-namenameaboutaboutlud16lnaddr.txt
### Step 2: Report Results + Backup Warning

Reply to user:

---

⚡ **Nostr identity ready!**

**npub:** `npub1...`
**Lightning address:** `[email protected]`

---

⚠️ **IMPORTANT: Back up your recovery phrase**

Your 24-word mnemonic is stored in:

~/.cocod/config.json

cocodconfigjson.txt
This phrase recovers both your Nostr identity AND ecash wallet. Back it up securely and protect this file.

Reply "done" when you've backed it up.

---

### Step 3: Wait for "done"

Do not proceed until user confirms backup.

### Step 4: Ask for Owner's npub

---

**What's your Nostr npub?**

I'll follow you so we stay connected.

(Paste your npub1... or NIP-05 like [email protected])

---

Then:

node {SKILL_DIR}/scripts/nostr.js follow <owner_npub>

node-skilldirscriptsnostrjs-follow-ownernpub.txt
### Step 5: Ask for Profile Images

---

**Do you have profile images for me?**

- **Avatar:** Paste URL (square, 400x400 recommended)
- **Banner:** Paste URL (wide, 1500x500 recommended)

Or say "skip" and I'll generate unique ones automatically.

---

If URLs provided:

node {SKILL_DIR}/scripts/nostr.js profile-set '{"picture":"'$AVATAR'","banner":"'$BANNER'"}'

node-skilldirscriptsnostrjs-profile-set-pictureavatarbannerbanner.txt
### Step 6: First Post

---

**Ready for your first post?**

Tell me what to post, or say "skip".

Suggestion: "Hello Nostr! ⚡"

---

If user provides text (use stdin to avoid shell injection):

echo "<user's message>" | node {SKILL_DIR}/scripts/nostr.js post -

echo-users-message--node-skilldirscriptsnostrjs-post--.txt
### Step 7: Done

---

✅ **All set!**

- Following you ✓
- First post live ✓ (if not skipped)

Try: "check my mentions" or "post <message>"

---

## Commands Reference

### Posting

node {SKILL_DIR}/scripts/nostr.js autoresponse-status

node-skilldirscriptsnostrjs-autoresponse-status.txt
**State file:** `~/.openclaw/workspace/memory/nostr-autoresponse-state.json`
**WoT source:** Owner's follow list (defined in nostr.js as OWNER_PUBKEY)

## User Phrases → Actions

| User says | Action |
|-----------|--------|
| "post X" | `echo "X" \| nostr.js post -` |
| "reply to X with Y" | `echo "Y" \| nostr.js reply <note> -` |
| "check mentions" | `nostr.js mentions` |
| "my feed" | `nostr.js feed` |
| "follow X" | Lookup if NIP-05 → `nostr.js follow` |
| "DM X message" | `echo "message" \| nostr.js dm <npub> -` |
| "zap X 100 sats" | `nostr.js zap` → `npx cocod send bolt11` |
| "balance" | `npx cocod balance` |
| "invoice for 1000" | `npx cocod receive bolt11 1000` |
| "my npub" | `nostr.js whoami` |
| "my lightning address" | `npx cocod npc address` |

## Defaults

| Setting | Value |
|---------|-------|
| Mint | `https://mint.minibits.cash/Bitcoin` |
| Lightning domain | `@npubx.cash` |
| Avatar fallback | `https://api.dicebear.com/7.x/shapes/png?seed=<npub>` |
| Nostr key | `~/.nostr/secret.key` |
| Wallet data | `~/.cocod/` |

## Integration

### SOUL.md
- Pull name/about from SOUL.md or IDENTITY.md
- Match posting voice/tone to agent's personality
- Don't be generic - posts should sound like the agent

### HEARTBEAT.md
Add to heartbeat rotation (every 2-4 hours):

node {SKILL_DIR}/scripts/nostr.js dms 5

node-skilldirscriptsnostrjs-dms-5.txt
If mentions from WoT or zaps received → notify user.

### TOOLS.md
After setup, store for quick reference:
example.sh
# Install dependencies
bash {SKILL_DIR}/install.sh

# Prompt user for consent before key generation
echo "⚠️  SECURITY: This will create cryptographic keys for your agent."
echo "   - Nostr identity keypair: ~/.nostr/secret.key"  
echo "   - Cashu wallet seed: ~/.cocod/config.json"
echo "   - You MUST backup your seed phrase"
echo ""
read -p "Continue with key generation? (yes/no): " consent
if [ "$consent" != "yes" ]; then
  echo "Setup cancelled"
  exit 1
fi

# Create wallet (mnemonic saved to config file)
npx cocod init

# Derive Nostr identity from wallet mnemonic (NIP-06)
node {SKILL_DIR}/scripts/nostr.js init

# Get identity info
NPUB=$(node {SKILL_DIR}/scripts/nostr.js whoami | grep npub | awk '{print $2}')
LN_ADDR=$(npx cocod npc address)

# Set basic profile
node {SKILL_DIR}/scripts/nostr.js profile-set '{"name":"<NAME>","about":"<ABOUT>","lud16":"'$LN_ADDR'"}'
example.sh
# If NIP-05, resolve first
node {SKILL_DIR}/scripts/nostr.js lookup <nip05>

# Follow owner
node {SKILL_DIR}/scripts/nostr.js follow <owner_npub>
example.sh
AVATAR="https://api.dicebear.com/7.x/shapes/png?seed=${NPUB}&size=400"
BANNER="https://api.dicebear.com/7.x/shapes/png?seed=${NPUB}-banner&size=1500x500"
node {SKILL_DIR}/scripts/nostr.js profile-set '{"picture":"'$AVATAR'","banner":"'$BANNER'"}'

Tags

#web_and-frontend-development

Quick Info

Category Development
Model Claude 3.5
Complexity Multi-Agent
Author shawnyeager
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install nostr-social