Store scroll settings (param values, endianness, presence bytes) in
localStorage keyed by event ID. Loads persisted values on mount, saves
on change (skipping initial mount to avoid unnecessary writes). Filters
stale param keys when scroll parameters change between versions.
Closes#266
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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.