The archive.org embed page has a responsive player for videos/audio
but renders software/games at fixed native pixel dimensions. Fetch the
item's mediatype from the metadata API and branch accordingly.
The archive.org embed renders content at native pixel dimensions and
doesn't scale to fill the iframe like YouTube does. On mobile the
550px-wide content overflowed the ~370px container.
Fix: give the iframe its native dimensions and use transform: scale()
with a ResizeObserver to shrink it to fit the container width. Also
reverts the unnecessary overflow-x-hidden on ExternalContentPage.
The CSS aspect-ratio property can cause overflow on narrow viewports.
The padding-bottom percentage trick is always relative to the parent
width, so it scales correctly on mobile.
Enter/submit now always performs a text search instead of redirecting
when the query looks like a NIP-05, npub, nevent, etc.
Identifiers are detected in real-time and shown as autocomplete items:
- NIP-05 (user@domain.com, domain.com): resolves to profile via .well-known
- npub/nprofile: shows profile with avatar and metadata
- note/nevent: shows event content preview with author
- naddr: shows addressable event with title/content preview
- hex: shows navigable link to the identifier
Resolved profiles are deduplicated from regular search results.
Works in both desktop sidebar and mobile bottom sheet search.
Replace the confusing externalLink/hideActions/showDiscuss props with
a clearer model:
- navigateToComments: opt-in to /i/ navigation (default: card opens
the URL externally, which is the natural expectation)
- showActions: single prop controlling the action button across both
LinkPreview and DiscussBar (default: true)
The action button always offers the opposite of what clicking the card
does: 'Discuss' when the card opens externally, 'Open' when the card
navigates to /i/.
Link previews now show the correct action button based on context:
- In posts (externalLink): card opens externally, shows 'Discuss' button
- In hover cards (!externalLink): card navigates to /i/, shows 'Open' button
- On /i/ page (hideActions): no action button since both would be redundant
LinkEmbed now defaults externalLink to true so link previews embedded
in post content open the URL externally as expected. Only standalone
uses of LinkPreview (like the CommentContext hover card) navigate to
the /i/ comment page.
When the card navigates to /i/ (the default), show an 'Open' button
with an external link icon that opens the original URL in a new tab.
Hidden when externalLink is true since the whole card already opens
the URL externally.
Remove the Discuss button from LinkPreview since the whole card now
navigates to /i/:url. Add externalLink prop so the card opens the URL
in a new tab instead when already on the /i/ page or in a hover card.
Fetch OEmbed link preview for URL identifiers in CommentContext so
'Commenting on' displays the page title alongside the site favicon
instead of a raw hostname+pathname.
When a full URL (http/https) is entered in the search bar, a new
'Comment on this link' option appears below the existing 'Search for'
option. Clicking it navigates to /i/<url> for commenting. The option
shows a link preview thumbnail (fetched via OEmbed) on the left where
avatars usually are, with the site's favicon as fallback. Works in
both the desktop sidebar dropdown and mobile bottom nav search sheet.
Keyboard navigation updated to support the new item.
The profile feed queried all enabled kinds (20+) with limit:15, but the
Posts tab filters client-side to only show non-reply posts. Events from
other kinds (badges, themes, emojis, etc.) consumed the limit, and the
pagination cursor jumped over time ranges containing visible posts.
Three-pronged fix:
- Filter kinds per active tab at query time (exclude kind 1111 on Posts)
- Over-fetch 3x the page size to compensate for reply filtering
- Auto-fetch next page when visible items fall below threshold
Closes#146
The same stripes + glitch icon + title + npub + reason layout was
duplicated across EmbeddedVanishCard, EmbeddedVanishPost,
VanishEventContent compact mode, and an inline version in NoteCard's
threaded branch. Extract a single VanishCardCompact component and
replace all four copies with it.
Net reduction of 76 lines.
The vanish layout (kind 62) in NoteCard didn't handle the threaded/
threadedLast props, so when rendered as a parent in AncestorThread,
it used the standard feed card layout where the caution stripes are
siblings of the bordered container — visually appearing to escape
above and below the card.
Add a dedicated threaded branch for vanish cards that:
- Uses the avatar column + connector line pattern like other threaded cards
- Places the stripes INSIDE the bordered container (as top/bottom bands)
so they stay visually contained within the card boundary
Allow users to browse and restore historical versions of their
kind 10000 mute list, similar to the existing Profile Recovery
dialog. Each snapshot is decrypted and displays a summary of
muted items by type (users, hashtags, words, threads).
The replay integration hooks into every DOM mutation via rrwebWrapped
event listeners, adding ~133ms of overhead during heavy re-renders.
We only use Sentry for error reporting, not session replay.
The IndexedDB profile cache (d9e943d0) introduced a regression where
parseAuthorEvent() — which runs the full Zod n.metadata().parse() chain —
was called synchronously on every render via TanStack Query's initialData
option. With 50+ NoteCards in a feed and no React.memo, this caused ~970ms
of Zod validation + ~1.3s of Nostrify core overhead per tab navigation.
Fix by:
1. Storing pre-parsed metadata in ProfileCacheEntry so useAuthor can
provide initialData without re-running Zod on every render
2. Wrapping NoteCard in React.memo to prevent re-renders when props
haven't changed (event objects are referentially stable from the
query cache)
Images attached via ComposeBox are now resized (max 1920px) and
converted to JPEG before uploading, matching the BackgroundPicker
behavior. Non-image files (audio, video, .xdc) are unaffected.
Blurhash is computed from the resized file for consistency.
Background images uploaded via BackgroundPicker are now resized to a
max of 1920px on the longest side and converted to JPEG (quality 0.85)
before uploading. Images that are already small JPEGs are passed through
unchanged. This reduces file size and improves load times when visiting
profiles with custom backgrounds.
Adds a check in useNostrPublish that compares the pubkey on the signed
event against the currently selected user's pubkey. This prevents
publishing events from a mismatched signer (e.g. a browser extension
or bunker configured for a different account).
When replying to a Request to Vanish event, the reply composer now
shows a styled vanish preview instead of the generic author+content
card that looked broken for nuked accounts.
Register kind 62 in the EXTRA_KINDS feed system so Request to Vanish
events from followed users appear in the home feed. Enabled by default
via the feedIncludeVanish toggle, and can be disabled in feed settings.
When a Request to Vanish event is quoted/embedded inside another
post, it renders as a compact card with caution stripes, the glitch
icon, title, npub, and optional reason — matching the dramatic style
of the full vanish display.
Implement a visually striking display for kind 62 vanish events with
animated caution stripes, glitch effects, and a grand exit aesthetic.
Since the user has nuked their account, the npub is shown instead of
profile info. Supports both compact feed cards and full detail view
with comments and sharing.
The activity indicator header above the post already shows the git
branch icon and 'shared a repository' text, making the in-card icon
redundant. Hashtags and the Public badge add noise without value.
Use a GitHub-inspired structure: repo icon + name (as primary-colored
link text) + Public/Fork pill badge on the first line, description on
the second line, and hashtags rendered as language-dot metadata in a
compact bottom row. Clone URL and action buttons follow below.
Wrap GitRepoCard, PatchCard, PullRequestCard, and CustomNipCard content
in rounded-2xl bordered containers matching the quote post / embedded
note visual pattern. Add KIND_HEADER_MAP entries for all four dev kinds
(30617, 1617, 1618, 30817) so the feed shows activity labels like
'shared a repository', 'submitted a patch', 'opened a pull request',
and 'proposed a NIP' above each post.