Skip to content

Stores and Loaders

The @welshman/app package provides a powerful system of collection-based reactive stores and loader utilities.

These utilities follow a consistent pattern for working with various types of Nostr data, making it easy to:

  1. Query data from the repository
  2. Transform it into application-specific structures
  3. Access it reactively in your UI
  4. Trigger network loading when needed

Core Concept

Each collection-based module exports a similar set of utilities:

typescript
// Common pattern across collection-based modules
export const {
  // Main collection store (derived from repository)
  store: follows,

  // Indexed map for efficient lookup
  indexStore: followsByPubkey,

  // Function to get a reactive store for a specific item
  deriveItem: deriveFollows,

  // Function to trigger loading an item from the network
  loadItem: loadFollows
} = collection({
  name: "collection-name",
  store: baseStore,
  getKey: item => item.keyProperty,
  load: async (key) => { /* Loading logic */ }
})

Available Collections

CollectionKeyKindDescription
followspubkey3User follow lists
mutespubkey10000User mute lists
pinspubkey10001User pinned items
profilespubkey0User profile metadata
relaySelectionspubkey10002User relay preferences
inboxRelaySelectionspubkey10005User inbox relay settings
zapperslnurl-Lightning zapper metadata
handlesnip05-NIP-05 identifier metadata

Usage Examples

Loading and Accessing Data

typescript
import { loadProfile, deriveProfile, profilesByPubkey } from '@welshman/app'

// Trigger loading a profile from the network
await loadProfile('pubkey123')

// Get a reactive store for a specific profile
const profile = deriveProfile('pubkey123')

// Access all profiles by pubkey
const allProfiles = profilesByPubkey.get()
const specificProfile = allProfiles.get('pubkey123')

User-Specific Collections

Several modules provide user-specific derived stores that automatically load data for the currently signed-in user:

typescript
import { userProfile, userFollows, userMutes, userPins } from '@welshman/app'

// These are derived stores that automatically:
// 1. Watch for changes to the current user's pubkey
// 2. Load the appropriate data when the user changes
// 3. Provide the data reactively

userProfile.subscribe(profile => {
  // Current user's profile data
})

userFollows.subscribe(follows => {
  // Current user's follow list
})

Web of Trust Utilities

The wot.ts module provides additional utilities for analyzing the social graph:

typescript
import { getFollows, getFollowers, getNetwork, getWotScore } from '@welshman/app'

// Get users followed by a pubkey
const followedUsers = getFollows('pubkey123')

// Get users following a pubkey
const followers = getFollowers('pubkey123')

// Get extended network (follows-of-follows)
const network = getNetwork('pubkey123')

// Calculate trust score between users
const score = getWotScore('userPubkey', 'targetPubkey')