Replaces the background-colored stroke hack with an SVG mask
that cuts the ring path out of the planet body, making the gap
genuinely see-through to whatever is behind the button.
Draws the ring path twice: first with a wider background stroke
to carve a visible gap where it crosses the planet body, then
the accent ring on top. This makes the ring distinct from the body.
Reorders SVG elements so the ring is rendered first and the
filled planet body is drawn on top, occluding the ring where
it crosses. This gives a natural Saturn-like appearance.
Uses the Saturn planet SVG as the button shape instead of a
plain circle. The planet body and ring are filled with the
accent color, and the plus icon remains centered on the body.
Switches all sticky headers, bottom nav, and decorative arcs from
bg-background/80 + backdrop-blur-md to solid bg-background. This
unifies the bars and their curved extensions into visually cohesive
elements with no blur seams or transparency mismatches.
Same treatment as the mobile bottom nav: an SVG arc hangs below
the Follows/Ditto/Global tab bar, removing the flat border so
the tabs flow into the content with a smooth curved edge.
Adds an SVG arc on top of the MobileBottomNav that blends
seamlessly with the nav bar, creating a unified curved element.
Removes the top border so they feel like one continuous shape.
Repositions the 'What's on your mind?' ComposeBox to render
after the Follows/Ditto/Global tab bar instead of above it,
so the tab navigation stays directly under the top header.
Remove the inline toggle from the post composer toolbar and add
imageQuality to AppConfig instead. The setting now lives in
Settings > Network under 'Image Uploads' with a Compressed/Original
pill toggle, persisted to localStorage like other app settings.
Remove the 'X members' subtitle from the header and add a row of stacked
member avatars (up to 8) with a clickable '+X more' that switches to the
Members tab, matching the style used in quote post list cards.
Starter pack pages now have two tabs: Feed (default) shows posts from all
pack members using useStreamPosts, and Members shows the existing member
list with follow/unfollow buttons.
Adds a Compressed/Original toggle button in the ComposeBox toolbar.
When set to Original, images are uploaded as-is without resizing or
re-encoding. Defaults to Compressed.
Instead of always converting to JPEG, encode both JPEG and PNG in
parallel and keep whichever is smaller. Skip re-encoding entirely
when the image already fits within the dimension limit.
Instead of showing just the site name (e.g. 'Internet Archive'), parse the
URL path for a readable slug and title-case it. Falls back to embed site
name or hostname when the path has no meaningful slug.
ExternalContentSidebarItem now fetches the book title from OpenLibrary
via useBookInfo for ISBN entries instead of showing the generic 'Books'
label. The icon uses BookOpen instead of the Globe fallback.
ExternalContentPage (country, URL, ISBN pages) gains a 3-dots menu on
the right side of the action bar with Add/Remove from sidebar.
NoteMoreMenu gets an Add/Remove from sidebar item after 'Add to list',
so any post can be pinned to the sidebar from its options menu.
Both locations toggle between add (PanelLeft icon) and remove (Trash2
icon) based on whether the item is already in the sidebar.
Remove all non-standard NIP-58 extensions:
- Delete BadgeTierPill component and badge tier system (bronze/silver/gold/diamond)
- Delete isShopBadge, isAchievementBadge, getBadgeTier, BadgeTier type
- Delete publish-achievement-badges.sh script
- Remove kind 30009 section from NIP.md
- Clean up badge category pills from detail page and tier pills from badge rows
Badges now use pure standard NIP-58 with no custom tags.
The share dropdown on ListDetailPage now shows 'Remove from sidebar'
with a trash icon when the list is already pinned, instead of hiding
the action entirely. This lets users unpin lists without entering
sidebar edit mode.
External i-tag identifiers like https:// URLs, iso3166:US country
codes, and isbn: values can now be added as sidebar menu items.
URLs show their favicon and hostname. Country codes show their
flag emoji and name. ISBN shows the book label. Clicking navigates
to /i/<encoded-value>.
The 'Add link' input (renamed from 'Add Nostr link') now accepts
all identifier types: Nostr URIs, URLs, iso3166 codes, and ISBNs.
The badge detail page now has three tabs: Awarded To, Feed, and
Comments. The Feed tab shows an infinite-scroll feed of kind 1 posts
authored by users who hold the badge, giving a community-feed view
centered around each badge.
Follows tab is now first (left) and the default. The pending badges
hook is lifted to the page level so the count can be displayed as a
pill badge on the My Badges tab title, giving users a clear indicator
of badges awaiting acceptance.
Kind 30000 (NIP-51 lists) now shows the Scroll icon instead of the
generic FileText fallback. Added a KNOWN_KIND_ICONS map in
NostrEventSidebarItem for kinds not covered by EXTRA_KINDS.
ListDetailPage gains an 'Add to sidebar' dropdown action that
creates a nostr:naddr sidebar entry for the current list. The
option is hidden once the list is already pinned.
useEventStats now accepts an optional event object. For addressable
events (kinds 30000-39999), it queries kind 30384 stats by the a-tag
coordinate instead of kind 30383 by event ID, so reply/reaction counts
display correctly for badge collections, badge definitions, articles,
and other addressable event types.
All 8 call sites updated to pass the event object.
The profile badges detail page now shows a ComposeBox and threaded
reply list (NIP-22 kind 1111) below the NoteCard, so replies are
visible and users can comment directly on badge collection events.
Support nostr: URIs (npub, nprofile, note, nevent, naddr) as
sidebar menu items. Profiles show their avatar and display name;
other events show a kind-based icon and label fetched from relays.
Users can add Nostr links via the 'Add Nostr link' button in
sidebar edit mode. Clicking navigates to /:nip19.
Kind 30009 badge definition embeds now show a smaller version of the
badge showcase (centered image with rotating light rays, name, and
description) instead of the generic link-preview card with cover image.
Previously, navigating to a profile badges event (kind 30008) from the
follows tab fell through to the generic PostDetailContent, which treated
it as a text note and misinterpreted its e/p tags as reply threading.
Now kind 30008 is intercepted in AddrPostDetailPage and rendered with
NoteCard, matching the feed presentation.
- Add action bar with ReactionButton (kind 7), RepostMenu (kind 16),
and comment count button below the badge info section
- Replace flat awardees list with tabbed interface: 'Awarded To' and
'Comments'
- Comments tab uses useComments (NIP-22 kind 1111 on addressable event),
ComposeBox for inline composition, and ThreadedReplyList for display
- Add rotating light rays spotlight effect to the badge detail hero
- Replace full-width image with centered badge showcase (size-36)
Replace the link-preview-style layout (full-width image + text below) with
a centered badge showcase: the image is displayed at badge size (112px)
with name and description centered beneath it, and a slow-rotating conic
gradient spotlight behind it for a grand presentation feel.
- Replace three separate pages (/badges/create, /badges/created,
/badges/manage) with a single /badges page
- Two tabs: 'My Badges' (accepted + pending + created sections)
and 'Follows' (badge feed from followed users)
- Convert badge creation form into a CreateBadgeDialog opened via FAB
- Remove Global tab
- Delete BadgeCreatePage, BadgeCreatedPage, BadgeManagePage
- Update BadgeShowcaseGrid editPath to /badges
- Simplify useBadgeFeed to only support follows tab
- Delete AchievementsPage and DVM claim-achievement hook (mockup, not real)
- Delete ShopPage shop tab (catalog with no purchase flow)
- Delete shopCategories, useBadgeHolders (unused)
- Create BadgesPage with Follows/Global feed tabs and FAB for badge creation
- Rename /shop -> /badges, redirect /shop -> /badges for bookmarks
- Rename sidebar item from 'Badge Shop' to 'Badges' with Award icon
- Add sidebar ID migrations: shop -> badges, achievements -> badges
- Keep My Badges and Created Badges buttons at top of feed
- Remove DVM constants, BADGE_ACCOUNT_PUBKEY, unused utils from badgeUtils
- Remove DVM documentation from NIP.md
- Update back-links in badge sub-pages to /badges
- Fix incorrect npub in publish-achievement-badges.sh (was wrong bech32 encoding)
- Show actual badge names in award notifications by fetching kind 30009 definitions,
with fallback to un-slugified d-tag identifier
- Strip price/supply UI from shop page and badge detail (no purchase flow exists)
- Document custom badge tag extensions and DVM claim-achievement flow in NIP.md
- Remove unused badge-glow CSS animation (duplicate of pending-glow in Tailwind)
- Make badge award notifications respect user preferences instead of force-enabled
- Add badges toggle to notification settings page