- Add notificationsEnabled to EncryptedSettings schema and interface
- NotificationSettings now persists the toggle to encrypted settings (synced across devices) instead of ephemeral local state
- useNativeNotifications: Capacitor path skips DittoNotification.configure when notificationsEnabled is false
- useNativeNotifications: web/PWA path opens a live Nostr req subscription and fires browser Notification API events when permission is granted and the setting is enabled
When disableEmbeds is true, image-embed tokens now return null instead of
rendering the raw URL as a link. This fixes the triple-dot (more menu)
preview showing bare blossom/image URLs instead of clean post text.
- Images now render inline via NoteContent at the position of their URL
rather than collected into a gallery block below the text
- Clicking an inline image opens a full lightbox with navigation across
all images in the post; lightbox index is tracked by position so
duplicate URLs open at the correct index
- Removed separate ImageGallery/extractImages from NoteCard,
PostDetailPage, and ComposeBox to prevent double-rendering
- Added disableEmbeds to NoteMoreMenu clamped preview to avoid block
embeds inside a line-clamp-3 container
- Fixed hasPreviewableContent in ComposeBox to detect image-only posts
so the Preview tab appears correctly
- Removed mp3/ogg/wav/pdf from MEDIA_URL_REGEX suppression list; those
URLs now render as clickable links instead of being silently dropped
- Added avif to IMAGE_URL_REGEX; added cursor-pointer to InlineImage
Publish a new kind 11667 event with empty content and tags to clear
the active profile theme, replacing the previous kind 5 deletion
approach. The parser already returns null for empty content, so the
toggle state updates correctly.
Pass the event ID of the active profile theme to clearActiveTheme so
the kind 5 deletion includes both an 'a' tag and an 'e' tag. Updated
all call sites (ThemeSelector and EditProfileForm).
Merge upstream changes with the theme settings refactor. Adds a
'Display my theme to others' toggle that publishes a kind 11667
active profile theme event when enabled and issues a kind 5 deletion
when disabled. Split /settings/appearance into /settings/theme and
/settings/content. Move theme builder to /settings/theme/edit.
Add 'theme' to BUILTIN_SIDEBAR_ITEMS so it can be added to the left
sidebar via the More menu or drag-and-drop. Uses the Paintbrush icon
and navigates to /settings/theme. Active state detection distinguishes
it from the general Settings highlight.
The color pickers are now always visible below the theme grid,
reflecting the effective colors of whatever theme is active. Changing
a color automatically switches to a custom theme. Removed the
explicit Custom card and the customSelected state tracking.
Remove 'Create Theme' and 'Public Themes' buttons from the theme
selector. Add a 'Custom' option at the end of the presets grid that
opens an inline color editor (background, text, primary) with live
preview. The Custom option auto-selects on page load when the active
theme doesn't match any preset.
Replace the tabbed Appearance settings page with two separate pages:
- /settings/theme for theme selection
- /settings/content for feed and content preferences
Move the theme builder from /settings/theme to /settings/theme/edit to
avoid the route conflict. Update all navigation links across the codebase.
When sidebarOrder was empty (fresh install), addToSidebar and
removeFromSidebar would spread the empty array and append/filter,
producing an array with just the new item. Now they fall back to
the computed orderedItems (the default order) before mutating.
Add explicit `id` field to ExtraKindDef and remove the `__` prefix
convention for built-in items. Item IDs are now plain strings that don't
need to match URL paths. Route resolution goes through the definition's
`route` field instead of assuming id === route.