Quick Start
Get started with NDK Sessions in minutes.
Installation
bash
npm install @nostr-dev-kit/sessions @nostr-dev-kit/ndk
# or
bun add @nostr-dev-kit/sessions @nostr-dev-kit/ndk
Basic Setup
1. Initialize NDK
First, create and connect your NDK instance:
typescript
import NDK from '@nostr-dev-kit/ndk';
const ndk = new NDK({
explicitRelayUrls: [
'wss://relay.damus.io',
'wss://nos.lol',
'wss://relay.nostr.band'
]
});
await ndk.connect();
2. Create Session Manager
Create a session manager with your preferred storage:
typescript
import { NDKSessionManager, LocalStorage } from '@nostr-dev-kit/sessions';
const sessions = new NDKSessionManager(ndk, {
storage: new LocalStorage(),
autoSave: true, // Automatically save changes
saveDebounceMs: 500 // Debounce auto-saves
});
3. Restore Previous Sessions
Restore any previously saved sessions:
typescript
await sessions.restore();
if (sessions.activeUser) {
console.log('Welcome back!', sessions.activeUser.npub);
}
4. Login
Login with a signer. To automatically fetch user data, configure fetches
in the constructor:
typescript
import { NDKPrivateKeySigner } from '@nostr-dev-kit/ndk';
const sessions = new NDKSessionManager(ndk, {
storage: new LocalStorage(),
autoSave: true,
fetches: {
follows: true, // Fetch contact list
mutes: true, // Fetch mute list
relayList: true, // Fetch relay list
wallet: true // Fetch NIP-60 wallet
}
});
const signer = new NDKPrivateKeySigner(nsecKey);
await sessions.login(signer);
// Access session data
console.log('Following:', sessions.activeSession?.followSet?.size, 'users');
console.log('Muted:', sessions.activeSession?.muteSet?.size, 'items');
Storage Options
Browser (LocalStorage)
typescript
import { LocalStorage } from '@nostr-dev-kit/sessions';
const sessions = new NDKSessionManager(ndk, {
storage: new LocalStorage('my-app-sessions') // Custom key
});
Node.js (FileStorage)
typescript
import { FileStorage } from '@nostr-dev-kit/sessions';
const sessions = new NDKSessionManager(ndk, {
storage: new FileStorage('./.ndk-sessions.json')
});
Temporary (MemoryStorage)
typescript
import { MemoryStorage } from '@nostr-dev-kit/sessions';
const sessions = new NDKSessionManager(ndk, {
storage: new MemoryStorage(), // No persistence
autoSave: false
});
Multi-Account Management
Login Multiple Accounts
typescript
// Login first account (automatically active)
const signer1 = new NDKPrivateKeySigner(nsec1);
const pubkey1 = await sessions.login(signer1);
// Login second account
const signer2 = new NDKPrivateKeySigner(nsec2);
const pubkey2 = await sessions.login(signer2, { setActive: false });
console.log('Accounts:', sessions.getSessions().size);
Switch Between Accounts
typescript
// Switch to different account
sessions.switchTo(pubkey2);
console.log('Active:', sessions.activePubkey);
// Switch back
sessions.switchTo(pubkey1);
Logout
typescript
// Logout specific account
sessions.logout(pubkey1);
// Or logout current active account
sessions.logout();
React to Changes
Subscribe to session changes:
typescript
const unsubscribe = sessions.subscribe((state) => {
console.log('Active user:', state.activePubkey);
console.log('Total sessions:', state.sessions.size);
// Update your UI...
});
// Later, cleanup
unsubscribe();
Read-Only Sessions
Create a read-only session without a signer. Configure fetches
in the constructor:
typescript
const sessions = new NDKSessionManager(ndk, {
fetches: {
follows: true,
relayList: true
}
});
const user = ndk.getUser({ pubkey: somePubkey });
await sessions.login(user);
// Data is fetched and cached, but user can't sign events
Using with NIP-07 (Browser Extensions)
typescript
import { NDKNip07Signer } from '@nostr-dev-kit/ndk';
const sessions = new NDKSessionManager(ndk, {
fetches: {
follows: true,
mutes: true
}
});
const signer = new NDKNip07Signer();
await sessions.login(signer);
CLI Example
Complete example for a Node.js CLI tool:
typescript
#!/usr/bin/env node
import NDK from '@nostr-dev-kit/ndk';
import { NDKSessionManager, FileStorage } from '@nostr-dev-kit/sessions';
import { NDKPrivateKeySigner } from '@nostr-dev-kit/ndk';
const ndk = new NDK({ explicitRelayUrls: ['wss://relay.damus.io'] });
await ndk.connect();
const sessions = new NDKSessionManager(ndk, {
storage: new FileStorage('./.ndk-sessions.json'),
autoSave: true,
fetches: {
follows: true
}
});
// Restore previous session
await sessions.restore();
if (!sessions.activeUser) {
// First time - login
const nsec = process.env.NOSTR_NSEC;
if (!nsec) throw new Error('NOSTR_NSEC not set');
const signer = new NDKPrivateKeySigner(nsec);
await sessions.login(signer);
console.log('Logged in as', sessions.activeUser.npub);
} else {
console.log('Welcome back', sessions.activeUser.npub);
}
// Use the active session to publish
const event = new NDKEvent(ndk, {
kind: 1,
content: 'Hello from CLI!'
});
await event.publish();
console.log('Published:', event.id);
// Cleanup
sessions.destroy();
Next Steps
- API Reference - Complete API documentation
- Migration Guide - Migrating from ndk-hooks
- React Hooks - Using with React
- Svelte - Using with Svelte