- useInitialSync was not applying sidebarOrder when decrypting settings on
first login, so the remote sidebar layout was silently discarded
- NostrSync's seededTimestamp guard was returning early on the first sync
cycle, meaning sidebarOrder only applied on the second page refresh
- account switches to accounts with no encrypted settings did not reset
sidebarOrder, causing the previous user's sidebar layout to persist
The mobile drawer was showing only a login prompt when logged out,
while the desktop sidebar showed the full nav list. Now the logged-out
mobile drawer matches desktop: login area at top, full nav items
(filtered for auth requirements), and theme selector at bottom.
When logged out, the avatar slot in the mobile top bar was empty,
making it impossible to open the sidebar drawer. Now shows a
hamburger menu icon so logged-out users can access the drawer
(which contains the login prompt).
Sentry SDK is loaded via dynamic import() only when a DSN is configured
and error reporting is enabled, keeping it out of the initial bundle.
Users can control error reporting via a toggle and DSN field in
Advanced Settings, with the DSN synced across devices via encrypted
NIP-78 settings. The ErrorBoundary now reports fatal crashes to Sentry
with component stack context, and a beforeSend hook censors nsec
private keys before any data leaves the browser.
Filter out undefined/empty pubkeys when extracting reply-to authors
from event p tags. Some events have malformed p tags without a pubkey
value, causing nip19.npubEncode to throw 'hex string expected, got
undefined'. Added filtering in both NoteCard (source) and ReplyContext
(defensive guard).
- Copy Event ID now copies naddr1 for addressable events or nevent1 for
others, instead of raw hex
- Add ReportDialog component with NIP-56 kind 1984 reporting (7 report
types, optional details textarea, scrollable on small screens)
- Wire report dialog into both NoteMoreMenu (post reports) and
ProfileMoreMenu (profile reports)
- Mention action opens compose modal with nostr:npub pre-filled
- Fix dialog lifecycle: report/mention state lives in outer component to
survive menu unmount
Reverts 6abe9fa and the fabHidden parts of 7f26beb. The FAB is now
always visible when showFAB is true, restoring sticky positioning
inside the center column. Removes IntersectionObserver logic from
Feed.tsx, fabHidden state from LayoutStore, and the useSetFabHidden
hook.
The composer preview tab was missing webxdc embeds because it manually
rendered only videos and audio, while webxdc rendering lived exclusively
inside NoteCard. Extract NoteMedia into a shared component and
ImetaEntry/parseImetaMap into a shared utility, then wire them into the
ComposeBox preview with proper imeta tag generation on the mock event.
Artwork area (cover image + play button) plays/pauses audio on click.
Info area (title, description, duration) bubbles up to NoteCard for
navigation to the detail page. Removed blanket stopPropagation that
was preventing all clicks from working.
- Add useBookSummary hook that fetches only edition data (1 request vs 3)
- Batch-prefetch ISBNs at the feed level with concurrency control (4 at a time)
- Switch InlineBookCard from useBookDetails to useBookSummary
- Increase cache duration from 30min/1hr to 24hr/48hr for book metadata
Add a search-by-title/author input between the header and feed tabs
that queries OpenLibrary's search API with 300ms debounce. Results
appear in a dropdown with cover thumbnails, titles, authors, and
publish years. Selecting a result navigates to /i/isbn:{isbn} where
users can comment or leave a review.
- New useBookSearch hook with 8-result limit and 5min cache
- Dropdown with skeleton loading, empty state, and outside-click-to-close
- Keyboard support: Enter selects first result, Escape closes
- Clear button to reset the search input
- Add Following/Global feed tabs to Books page with sticky tab bar
- Add KindInfoButton linking to Bookstr (bookstr.xyz) for content creation
- Add text truncation with 'Read more' fade (300px max-height, matching NoteCard)
- Include kind 1111 book comments in the feed with 'commented' badge
- Comments on books navigate to the book page instead of event detail
- Add Reviews tab on book detail pages (/i/isbn:*) alongside Comments
- Add review submission form with 5-star rating, spoiler warnings, and edit support
- Add 'Write Review' button in book page action bar and Reviews tab
- Support useFollowList for follows-tab scoped book queries
Replace the static OpenLibrary trending books list with a live social
feed of book-related Nostr events. The feed queries kind 31985 (book
reviews/ratings) and kind 1 posts tagged #bookstr or referencing ISBNs,
following the Bookstr NIP-XX protocol.
New files:
- src/lib/bookstr.ts: protocol constants, event parsing, ISBN extraction
- src/hooks/useBookFeed.ts: infinite scroll feed of book events
- src/hooks/useBookDetails.ts: OpenLibrary book metadata by ISBN
- src/components/BookFeedItem.tsx: feed item with inline book card,
star ratings, spoiler guards, and full social actions
- PostDetailShell accepts optional title prop for kind-aware loading states
- AddrPostDetailPage derives correct title from addr.kind before event loads
- PostDetailPage shows neutral 'Loading...' during fetch instead of 'Post Details'
- Standardize all detail headers to 'X Details' pattern (Track Details, Playlist Details, Episode Details, Trailer Details)
- Fix music detail headers from text-lg to text-xl for consistency
- Compact feed cards use vertical layout with capped 180px cover image, participant avatars, truncated description, and location pill
- Event detail page uses standard top bar matching other pages
- Date/location/links use sidebar-style rounded pills (bg-background/85)
- RSVP section uses matching rounded container with pill buttons
- Zap and share icons moved inline with organizer row