Developer Tools
This page covers tools that help you build, test, and debug Nostr applications.
Command Line Tools
nak
Swiss army knife for Nostr.
- Repository: github.com/fiatjaf/nak
Install:
go install github.com/fiatjaf/nak@latest
Usage:
# Generate keys
nak key generate
nak key public <nsec>
# Fetch events
nak req -k 1 -l 10 wss://relay.damus.io
# Publish event
echo '{"kind":1,"content":"Hello!"}' | nak event wss://relay.damus.io
# Decode NIP-19
nak decode npub1...
# Verify event
cat event.json | nak verify
nostril
Simple event creator.
- Repository: github.com/jb55/nostril
# Create and sign a note
nostril --sec <hex-secret> --content "Hello Nostr"
# Create with envelope for relay
nostril --sec <hex-secret> --envelope --content "Hello" | websocat wss://relay.damus.io
nostr-tools CLI
CLI from nostr-tools package.
npx nostr-tools generate-key
npx nostr-tools sign-event <event.json>
Browser Extensions
Alby
Lightning + Nostr browser extension.
- Website: getalby.com
- Browsers: Chrome, Firefox, Safari
Features:
- NIP-07 signing
- Lightning wallet
- Budget controls
- Multiple accounts
nos2x
Minimal Nostr signing extension.
- Repository: github.com/fiatjaf/nos2x
- Browsers: Chrome, Firefox
Features:
- Lightweight
- Pure NIP-07
- Open source
Flamingo
Full-featured Nostr extension.
- Website: getflamingo.org
Features:
- NIP-07 signing
- NIP-44 encryption
- Multiple keys
Testing Tools
WebSocket Test Clients
websocat
CLI WebSocket client.
# Install
cargo install websocat
# Connect to relay
websocat wss://relay.damus.io
# Send subscription
["REQ","test",{"kinds":[1],"limit":5}]
wscat
Node.js WebSocket client.
npm install -g wscat
wscat -c wss://relay.damus.io
> ["REQ","sub1",{"kinds":[1],"limit":3}]
Relay Testing
nostr-relay-tester
Test relay NIP compliance.
npx nostr-relay-tester wss://relay.example.com
relay-tools
Relay inspection utilities.
# Check relay info
curl -H "Accept: application/nostr+json" https://relay.example.com/
# Test connection
websocat wss://relay.example.com/ -n
Development Environments
Local Relay for Testing
Run a local relay for development:
# Using strfry
docker run -p 7777:7777 hoytech/strfry
# Using nostream
docker run -p 7777:7777 cameri/nostream
Mock Relay
For unit testing:
import { createMockRelay } from 'nostr-tools/mock';
const relay = createMockRelay();
// Returns events you've injected
Debugging
Event Inspector
Paste events to decode:
// Browser console
const event = JSON.parse('{"id":"...","pubkey":"..."}');
// Decode pubkey
import { nip19 } from 'nostr-tools';
console.log(nip19.npubEncode(event.pubkey));
// Verify signature
import { verifyEvent } from 'nostr-tools/pure';
console.log(verifyEvent(event));
Network Debugging
Chrome DevTools:
- Open Network tab
- Filter by WS (WebSocket)
- Click connection to see messages
Firefox:
- Open Network tab
- Filter by WS
- View Messages panel
Common Debug Patterns
// Log all relay messages
relay.onmessage = (msg) => {
console.log('Received:', JSON.parse(msg.data));
};
// Track subscriptions
const subs = new Map();
function subscribe(id, filter) {
console.log(`Subscribe ${id}:`, filter);
subs.set(id, filter);
}
Key Management
Key Generation
# Using nak
nak key generate
# Using openssl
openssl rand -hex 32
Bech32 Encoding
# Encode pubkey to npub
echo "pubkey-hex" | nak encode npub
# Decode npub to hex
nak decode npub1...
Mnemonic (BIP-39)
import { generateMnemonic, mnemonicToEntropy } from '@scure/bip39';
import { wordlist } from '@scure/bip39/wordlists/english';
const mnemonic = generateMnemonic(wordlist);
console.log(mnemonic);
// witch collapse practice feed shame open despair creek road again ice least
API Tools
Nostr.band API
Query aggregated Nostr data.
# Search notes
curl "https://api.nostr.band/v0/search?q=bitcoin&limit=10"
# Get trending
curl "https://api.nostr.band/v0/trending/notes"
# Get profile
curl "https://api.nostr.band/v0/p/npub1..."
Primal API
Cached Nostr data access.
curl "https://primal.net/api/feed/latest"
Monitoring
nostr.watch
- Website: nostr.watch
Features:
- Relay uptime monitoring
- NIP support detection
- Performance metrics
Relay Stats
Track your relay's metrics:
# Prometheus endpoint (if supported)
curl http://localhost:7777/metrics
# Relay info
curl -H "Accept: application/nostr+json" http://localhost:7777/
Useful Utilities
Event ID Calculation
import { getEventHash } from 'nostr-tools/pure';
const event = {
pubkey: '...',
created_at: Math.floor(Date.now() / 1000),
kind: 1,
tags: [],
content: 'test'
};
const id = getEventHash(event);
NIP-05 Verification
# Check NIP-05 identifier
curl "https://example.com/.well-known/nostr.json?name=alice"
Relay List Discovery
// Get user's relay list (NIP-65)
const filter = {
kinds: [10002],
authors: [pubkey],
limit: 1
};