Extract shared useEventActions hook so EventMenu and EventContextMenu
share a single set of hook subscriptions instead of duplicating them.
Wrap callbacks in useCallback and memoize KindRenderer/DetailKindRenderer
to reduce unnecessary re-renders in event feeds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace hand-rolled ~350-entry emoji list with unicode-emoji-json (~1,900 emojis) and emojilib
keywords for richer search matching. Move EmojiSearchService to a singleton with Dexie-backed
caching for instant availability on startup. Add recency+frequency emoji usage tracking shared
across the emoji picker and editor autocomplete.
- Use AGGREGATOR_RELAYS as fallback for follows without kind:10002,
not the user's personal relays. Personal inbox/write relays were
being assigned as outbox for hundreds of unknown follows, inflating
counts and sending unnecessary queries to niche relays.
- Per-relay REQ badges now show assigned count (from reasoning) as
the primary number, with unassigned users shown dimmed as +N.
Tooltips show the full breakdown.
- Switch to useStableRelayFilterMap for structural comparison.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Stabilizes relay filter map references using isFilterEqual per relay
instead of JSON.stringify. Avoids serialization overhead for large
filter maps with many relays and pubkeys.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Skip duplicate events in setEventsMap (return prev if event.id exists)
- Only create new relayStates Map on actual state transitions (waiting→receiving),
not on every event — counter increments applied in-place
- Don't add unknown relays to the state map (skip defensive init)
- Cap streaming eventsMap at 2000 with 25% batch eviction of oldest events
- Decouple relay filter map from subscription lifecycle: store in ref,
only tear down subscriptions when the relay SET changes (not filter content)
- Use useStableRelayFilterMap for structural comparison instead of JSON.stringify
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extend relay filter chunking to route #p tags to inbox/read relays,
matching the existing outbox/write routing for authors. Remove debug
console.log statements across the codebase while preserving error-level
logging. Delete unused logger utility. Expand test coverage for all
chunking scenarios.
Uncomment kind 10051 in kinds registry with NIP-EE attribution and add
it to the relay list editor so users can manage MLS KeyPackage relays.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Spellbook URLs only queried hardcoded aggregator relays, missing events
published to other relays. Now fetches the author's kind:10002 relay list
and includes their outbox relays when loading kind:30777 spellbook events.
Extract useUserRelays hook from inline pattern and refactor
useRepositoryRelays to use it.