- Add visible border-t dividers between FAQ category sections
- Shorten relay question to just 'What are relays?'
- Make questions bigger (text-base) and bolder (font-semibold)
- Darken answer text from muted-foreground to foreground/80
- Clarify report answer to mention the three-dot menu on posts
Introduce a new /help route with beginner-friendly FAQ content covering
getting started, apps, payments, content safety, and why Nostr differs
from big tech. Includes reusable HelpFAQSection and TeamSoapboxCard
components that can be embedded on other pages. Help appears in the
default sidebar so new users see it without manual configuration.
The onboarding modal was setting a hardcoded sidebarOrder, overriding
the default from useFeedSettings. Remove the sidebar order logic from
onboarding so new users get the standard default sidebar instead.
- Rename 'Feed' to 'Home Feed' in settings hub, page header, and SEO title
- Rename 'Notes' section to 'Basic Home Feed Options'
- Rename 'Other Stuff' to 'Show More Content Types in Home Feed'
- Rename 'Reposts' to 'Reposted Notes', 'Generic Reposts' to 'Reposted Other Content'
- Only show community domain management when community feed toggle is on
Convert 10 collapsible sections to always-visible static sections with
plain subheaders across Feed, Content, Network, Profile, and Lists pages.
The 'Advanced' section on Profile and all sections within AdvancedSettings
remain collapsible.
- Remove 'Codex of Configuration' heading, ornament dividers, and bottom ornament from settings hub
- Remove Lists from settings menu; add as sidebar item with Scroll icon at /lists
- Reverse the /lists <-> /settings/lists redirect for backward compatibility
- Add persistent pencil icon badges on avatar and banner in ProfileCard edit mode
- Pencil badges fade on hover to reveal the full camera overlay
Move overflow-y-auto from DialogContent to an inner wrapper div so the
color picker popover (portaled into the dialog) is not clipped by the
overflow boundary. The dialog container uses overflow-visible while the
inner div handles scrolling.
Portal popover content into the Dialog DOM tree via PortalContainerProvider
so Radix Dialog's RemoveScroll doesn't block scroll events on the font
picker dropdown list. Fixes both ThemeSelector builder and ProfilePage
edit profile theme dialogs.
All content types are already enabled by default, so the 'What interests
you?' step was redundant. The onboarding flow now goes directly from
theme selection to content safety.
Replace items-center/justify-center on the scroll container with
my-auto/mx-auto on the child. The flex centering was pushing the top
of the content above the scroll boundary when the theme grid exceeded
the viewport height, making it unreachable.
Extract useFeedTab hook that persists the active Follows/Global tab
in sessionStorage with a per-feed key (e.g. ditto:feed-tab:home,
ditto:feed-tab:vines). Each feed page remembers its own tab
independently — switching to Global on the home feed no longer
affects Vines, Videos, Photos, etc.
Applied to Feed.tsx (home), KindFeedPage, BooksPage, VideosFeedPage,
VinesFeedPage, PhotosFeedPage, and EventsFeedPage.
Kind 1063 is generic file metadata, so webxdc events require filtering
by #m=application/x-webxdc. Add extraFilters support to useInfiniteHotFeed
and pass webxdc as a separate filter object with the MIME constraint.
Switch the logged-out hot feed from useInfiniteSortedPosts (kind 1 only)
to useInfiniteHotFeed with a curated list of visually rich content types:
photos, videos, articles, vines, music, themes, polls, calendar events,
color moments, follow packs, and emoji packs.
The active feed tab (Follows/Global/Communities/saved feeds) was stored
in useState, so it was destroyed when navigating to a post and reset
to 'follows' on return. Now the selected tab is saved to sessionStorage
on change and restored on mount, surviving navigation while still
resetting when the browser tab is closed.
Validates stored tab against core tabs and saved feed IDs to prevent
restoring a deleted feed.
Closes#82
When searching from the sidebar while already on /search, the
SearchPage component stayed mounted and its internal state (allEvents,
isLoading) from the previous search would briefly flash before the
new query's effect could clear it.
Fix: wrap SearchPage with a keyed component that uses ?q as the React
key. When the query changes, React unmounts the old instance entirely
and mounts a fresh one — all state initializes cleanly from the new
URL with no transitional renders showing stale data.
Closes#72
Replace the plain 'Join' CTA banner with an engaging first-impression
experience: logo + tagline, interactive theme swatches that transform
the page on click, and a trending hashtags strip — all above the
existing hot feed. Staggered fade-in animations add polish.
The useEffect that clears allEvents runs *after* render, so the posts
useMemo would still filter/return old events during the first render
with the new query. Track the current query in a ref and return an
empty array from the useMemo when the query has just changed, preventing
stale results from ever reaching the UI.
When navigating from the sidebar search, the URL param (?q=) updates
immediately but the local searchQuery state lagged one render cycle
behind (synced via useEffect). During that gap, the old query's
results would briefly flash before being cleared.
Fix: derive an effectiveQuery directly from the URL search params and
use it for all data fetching and conditional rendering. The local
searchQuery state is kept only as the controlled input value.
Closes#72
On desktop the URL bar and 'Copy Link' in the More menu already
cover sharing. The native share sheet is the unique value on mobile,
so hide the button at the sidebar breakpoint (900px+).
Add a dedicated Share button using the Web Share API with clipboard
fallback across three locations:
- NoteCard action bar (between Zap and More)
- PostDetailPage action bars (both compact and expanded views)
- ProfilePage header (between More and Zap buttons)
On mobile and supported desktop browsers, tapping Share opens the
native OS share sheet with all installed apps (Twitter, WhatsApp,
etc.). On unsupported browsers, falls back to copying the link to
clipboard with a toast confirmation.
Closes#39
Rename toggle to 'Sync app theme with your profile theme' and update
description to explain what disabling it actually does, so users
understand it unsyncs the two themes rather than just stopping posts.
Consistent wording across both ThemeSelector and ThemesPage.
Closes#80