diff --git a/CHANGELOG.md b/CHANGELOG.md
index e171f614..8edf9bd8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,234 +11,119 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Move add bookmark button to filter bar
- - Moved add bookmark button from web section header to filter bar
- - Positioned button on the right side of filter bar
- - Removed conditional rendering (always show button)
- - Added bookmark-filters-wrapper styling for proper layout
+- Moved add bookmark button to filter bar
### Fixed
-- Align add bookmark button with filter buttons
- - Matched CompactButton styling to filter-btn when inside filter bar
- - Ensured same size, padding, and alignment for consistent appearance
+- Aligned add bookmark button with filter buttons
## [0.10.30] - 2025-11-01
### Added
- Navigate to author's writings page from article author card
- - Clicking the author card at the end of an article now navigates to `/p/${npub}/writings`
- - Previously navigated to the author's profile page
- - Better discovery of author's published articles
### Fixed
- Reset scroll to top when navigating to profile pages
- - Profile pages (including writings page) now scroll to top on navigation
- - Prevents landing in the middle of the page when navigating from articles
- - Better user experience when browsing author profiles
- Preserve image aspect ratio when full-width images setting is enabled
- - Images maintain their aspect ratio when full-width setting is active
- - Prevents image distortion when enlarging small images
## [0.10.29] - 2025-11-01
### Fixed
-- Full-width images setting now uses width instead of max-width
- - Change from --image-max-width CSS variable to --image-width
- - When enabled, sets images to width: 100% (enlarging small images)
- - Always constrains with max-width: 100% to prevent overflow
- - Update mobile responsive styles to respect the setting
+- Full-width images setting uses width instead of max-width
## [0.10.28] - 2025-11-01
### Fixed
- Nostr URI processing in markdown links
- - Prevent double-processing of markdown to avoid nested links
- - Add HTTP URL detection to prevent processing nostr URIs in URLs
- - Use parser-based approach to detect markdown link URLs
- - Prevent nostr URI replacement inside markdown link URLs
- - Remove unused variables in nostrUriResolver
- - Improved blog post rendering with proper link handling
### Removed
- Debug console.log statements from nostrUriResolver
- - Cleaned up debug logging used during troubleshooting
- - Cleaner console output in production
## [0.10.27] - 2025-10-31
### Added
- Refresh button to highlights sidebar header
- - Users can manually refresh highlights panel
- - Better control over highlights data updates
- Image preloading in BlogPostCard for better caching
- - Images are preloaded when blog posts are displayed
- - Improved offline access to article images
- Preload logged-in user profile image for offline access
- - User profile picture is cached for offline viewing
- - Better user experience when network is unavailable
- Development Service Worker for testing image caching
- - Service Worker enabled in development mode
- - Improved testing capabilities for offline functionality
### Fixed
- Service Worker registration error handling
- - Better error handling for Service Worker registration failures
- - More robust development mode Service Worker support
- - Proper error handling for fetch requests in Service Worker
- Article loading race conditions
- - Resolved race condition when loading articles from cache
- - Cache is checked synchronously before setting loading state
- - Articles are populated in cache from explore view
- Image caching issues
- - Images are properly preloaded when loading articles from cache
- - Removed bulk image preloading to prevent resource exhaustion errors
- - Avoid redundant image preload when using preview data
- Scroll position management
- - Scroll position is reset when switching articles
- - Save suppression added when resetting scroll position
- - Reader content is cleared immediately when article changes
- React hook ordering issues
- - useEffect moved before early return in BlogPostCard
- - Prevents React hooks dependency violations
- TypeScript and linting issues
- - Cache save logic simplified to avoid TypeScript errors
- - Unused settings parameter marked as intentionally unused
- - Articles are saved to localStorage cache after loading from relays
- - Cache is saved immediately when first event is received
### Performance
- Avoid redundant image preload when using preview data
- - Prevents unnecessary image loading operations
- - Improved resource utilization
### Removed
- Debug console.log statements
- - Removed all debug console output from article cache and service worker
- - Removed debug logging from useImageCache hook
- - Cleaner console output in production
- Unused refresh button from highlights panel header
- - Cleaned up unused UI component
## [0.10.26] - 2025-10-31
### Added
- Persist highlight metadata and offline events to localStorage
- - Highlights created offline are now preserved across sessions
- - Better data persistence for flight mode highlights
- Proper relay response tracking for flight mode
- - Accurate detection of which relays have received highlight events
- - Improved flight mode indicator accuracy
### Changed
- Implemented proper flight mode detection for highlights
- - More reliable identification of highlights created offline
- - Better tracking of highlight publication status
- Refactored to use isLocalOnly flag instead of isOfflineCreated
- - More consistent naming and clearer intent
- - Improved code maintainability
### Fixed
- Show airplane icon for flight mode highlights
- - Visual indicator now correctly displays for offline-created highlights
- - Better user feedback for highlights pending publication
- Prioritize isLocalOnly check to show airplane icon
- - Icon display logic now correctly identifies flight mode highlights
- Preserve isLocalOnly and publishedRelays in eventToHighlight conversion
- - Highlight metadata is maintained during event transformations
- - Flight mode status preserved across data conversions
- Use metadata cache to preserve highlight properties across EventStore
- - Highlights maintain their properties when stored in EventStore
- - Prevents loss of flight mode metadata
- Add fallback logic for detecting flight mode highlights
- - More robust detection when primary methods fail
- - Better handling of edge cases
- Determine isLocalOnly before publishing, not after
- - Correct timing for flight mode detection
- - Prevents incorrect status during highlight creation
- Store event in EventStore after updating properties
- - Ensures all highlight properties are saved correctly
- - Prevents data loss during highlight creation
- Manually set highlight properties after eventToHighlight conversion
- - Ensures all metadata is properly assigned
- - Correct property mapping during conversions
- Prevent duplicate highlights
- - Eliminates duplicate highlight entries
- - Cleaner highlight list display
- Publish only to connected relays to avoid long timeouts
- - Faster highlight publishing
- - Better user experience when some relays are unavailable
- Prevent unnecessary relay queries when article content is cached
- - Improved performance by avoiding redundant network requests
- - Better resource utilization
- Remove relayPool dependency from content loaders
- - Cleaner architecture and reduced coupling
- - Better separation of concerns
- Check EventStore before setting loading state
- - Prevents unnecessary loading states
- - Better state management
- Remove eventStore and setter functions from useEffect dependencies
- - Fixes React hook dependency issues
- - Prevents unnecessary re-renders
- Replace require() with ES module imports
- - Modern JavaScript module system
- - Better compatibility with build tools
- Resolve all linting errors and type issues
- - Improved code quality
- - Better type safety
- Remove unused variables to resolve lint errors
- - Cleaner codebase
- - Eliminates lint warnings
### Performance
- Remove excessive debug logging for better performance
- - Reduced overhead from logging operations
- - Improved application performance
### Removed
- Debug console.log statements
- - Cleaner console output
- - Production-ready code
## [0.10.25] - 2025-01-27
### Added
- Reading progress bar for all bookmark types across all view modes
- - Consistent progress tracking for articles, videos, and other content types
- - Visual progress indicator in compact, medium, and large card views
- Title display for regular bookmarks/links
- - Better content identification for web bookmarks
- - Improved visual hierarchy in bookmark cards
### Changed
- Redesigned medium-sized bookmark cards with left-side thumbnails
- - More compact and visually appealing card layout
- - Better use of space with thumbnail positioning
- Made bookmark cards significantly more compact
- - Reduced vertical spacing and improved density
- - Better information display in limited space
- Moved bookmark type icon to bottom right footer
- - Cleaner card layout with consistent icon positioning
- - Better visual organization of card elements
- Enhanced card layout with author positioning in bottom-left corner
- - Improved visual hierarchy and content organization
- - Better balance between content and metadata
### Fixed
@@ -254,391 +139,201 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Removed
- Type icon from medium-sized bookmark cards
- - Cleaner visual design with reduced clutter
- - Focus on content rather than type indicators
- Text expansion mechanic from medium-sized cards
- - Simplified interaction model
- - More consistent card behavior across view modes
- URL display from medium-sized bookmark cards
- - Cleaner card appearance
- - Better focus on title and content
## [0.10.24] - 2025-01-27
### Added
- Dynamic browser title based on content
- - Browser title now updates to reflect the current content being viewed
- - Improves user experience and bookmark identification
- Enhanced Links type bookmarks with OpenGraph data
- - Web bookmarks now include rich OpenGraph metadata
- - Better visual representation and content preview for web bookmarks
### Changed
- Replaced custom OpenGraph extraction with fetch-opengraph library
- - More reliable and standardized OpenGraph data extraction
- - Better performance and maintainability for web bookmark processing
### Fixed
- Description extraction from web bookmark content field
- - Improved extraction of descriptions from web bookmark content
- - Better content identification and display for web bookmarks
- Resolved all linting and TypeScript issues
- - Code quality improvements and type safety enhancements
- - Cleaner codebase with better maintainability
## [0.10.23] - 2025-01-27
### Added
- Video thumbnail support for cover images
- - Extracts and displays video thumbnails for YouTube and Vimeo content
- - Improves visual representation of video content in bookmark views
- Note content support for direct video URLs
- - Uses note content as title for direct video URLs when available
- - Better content identification for video bookmarks
- Smart highlight clearing for articles
- - Automatically clears highlights when switching between articles
- - Prevents highlight confusion between different articles
- Robust highlight loading with fallback mechanisms
- - Implements multiple fallback strategies for highlight loading
- - Ensures highlights are loaded even when primary methods fail
### Changed
- Home button alignment moved to left next to profile button
- - Improved navigation layout consistency
- Video functionality extracted into dedicated VideoView component
- - Better code organization and maintainability
- - Cleaner separation of concerns for video handling
### Fixed
- Article loading performance and error handling improvements
- - Better error handling for failed article loads
- - Improved loading performance with optimized data fetching
- Highlight loading issues for articles
- - Resolved race conditions between content loaders
- - Fixed missing relayPool dependency in useEffect
- - Proper filtering of Nostr article highlights in sidebar
- Skeleton loader improvements
- - Consolidated multiple skeleton loaders in article view
- - Replaced markdown loading spinner with skeleton
- - Replaced 'No readable content found' with skeleton loader
- Video metadata extraction improvements
- - Enhanced YouTube and Vimeo metadata extraction
- - Better handling of video content identification
## [0.10.22] - 2025-01-27
### Added
- Mobile-optimized tab interface for `/my` and `/p/` pages
- - Tab text labels hidden on mobile screens (≤768px) to save space
- - Shows only icons for highlights, bookmarks, reads, links, and writings tabs
- - Maintains full functionality while improving mobile UX
### Changed
- Updated brand tagline from "Nostr Bookmarks" to "Read, Highlight, Explore"
- - Updated across HTML meta tags, PWA manifest, and Open Graph metadata
- - Better reflects core functionality: reading, highlighting, and exploring content
- Reordered bookmarks bar navigation buttons
- - New order: Home, Explore, Settings (previously: Home, Settings, Explore)
- Moved highlight button higher up on screen
- - Changed position from `bottom: 32px` to `bottom: 80px` for better accessibility
### Fixed
- Mobile sidebar not closing when navigating to profile sections
- - Fixed issue where clicking "My Reads", "My Highlights", etc. didn't close mobile sidebar
- - Added mobile sidebar close logic to all navigation buttons
- - Improved mobile navigation experience
- Removed unnecessary versioning from reading progress implementation
- - Simplified reading progress events by removing `ver` field
- - Updated cache key to remove version suffix
- - Cleaner, more maintainable code
## [0.10.21] - 2025-10-23
### Fixed
- Reading position tracking for internal event URLs
- - Prevents tracking for `nostr-event:` sentinel URLs (internal convention, not a valid Nostr URI per NIP-21)
- - Fixes "String must be lowercase or uppercase" error when loading base64-encoded event URLs
- - These internal sentinels are no longer saved to reading position data
- Compact bookmark view display
- - Articles now show title instead of summary in compact view
- - Extracts article title from NIP-23 metadata tags
- - Removed unused `articleSummary` prop to keep code DRY
- Bookmark deduplication in profile view
- - Same article appearing in multiple bookmark lists/sets now displays only once
- - Uses coordinate-based deduplication (`kind:pubkey:identifier`) for articles
- - Applies `dedupeBookmarksById` when flattening bookmarks from different sources
## [0.10.20] - 2025-10-23
### Added
-- Web Bookmarks section now appears first when bookmarks are grouped by source
- - Provides quicker access to external URL bookmarks
- - Better organization for mixed bookmark collections
+- Web Bookmarks section appears first when bookmarks are grouped by source
### Fixed
- Mobile scroll position preservation when toggling highlights panel
- - Opening/closing the highlights sidebar no longer resets scroll to top
- - Scroll position is saved before locking and restored after unlocking
- - Uses `requestAnimationFrame` to ensure DOM updates before restoring
- Infinite loop in reading position tracking
- - Fixed "Maximum update depth exceeded" error in `useReadingPosition` hook
- - Callbacks now stored in refs to avoid dependency array issues
- - Prevents unnecessary re-renders during scroll tracking
- Skeleton loading state for articles with zero highlights
- - Articles without highlights no longer show infinite loading skeletons
- - Properly transitions to empty state message
- Navigation to bookmarked articles
- - Clicking bookmarked kind:30023 articles now navigates to `/a/:naddr` route
- - Fixes issue where clicking showed "Select a bookmark" message instead
- - Applies to both compact view and bookmark item interactions
## [0.10.19] - 2025-10-23
### Added
- Profile dropdown menu in sidebar header
- - Click profile picture to access quick navigation menu
- - Menu items: My Highlights, My Bookmarks, My Reads, My Links, My Writings
- - Logout option included with separator
- - Click outside to close
- - Smooth slide-in animation
### Changed
- Profile picture interaction updated
- - Now triggers dropdown menu instead of navigating to profile page
- - More efficient access to all profile sections
- Collapse buttons repositioned for symmetry
- - Highlights collapse button moved to left side of header
- - Both bookmarks and highlights collapse buttons now left-aligned
- - Consistent visual hierarchy across panels
- Grouping toggle button repositioned
- - Moved from right/center to left side
- - Now next to support button (orange heart)
- - Better logical grouping of controls
- Collapse button styling standardized
- - Highlights collapse button now matches bookmarks style
- - Consistent 33x33px size, border radius, and hover states
- - Uses native button element for better consistency
### Removed
- Redundant logout button from sidebar header
- - Previously next to Explore button
- - Now only accessible via profile dropdown menu
- Refresh buttons from sidebars
- - Removed from bookmarks sidebar
- - Removed from highlights sidebar
- - Pull-to-refresh functionality remains available
### Fixed
- Cleaned up unused component props and parameters
- - Removed `lastFetchTime` from BookmarkList
- - Removed `loading` and `onRefresh` from HighlightsPanelHeader
- - All linting errors resolved
- - Type checking passing
## [0.10.18] - 2025-10-23
### Changed
- User profile routes renamed from `/me` to `/my`
- - `/my/highlights` - User's highlights
- - `/my/bookmarks` - User's bookmarks
- - `/my/reads` - Nostr-native articles with reading progress
- - `/my/links` - External URLs with reading progress
- - `/my/writings` - User's published articles
- - All navigation, tabs, and internal links updated
- - Documentation updated to reflect new paths
### Fixed
-- `/my/writings` now displays all user writings
- - Removed incremental loading with `since` filters from writingsController
- - Controller now fetches ALL writings without limits
- - Ensures complete results on profile and my pages
-- `/my/highlights` now displays all user highlights
- - Removed incremental loading with `since` filters from highlightsController
- - Controller now fetches ALL highlights without limits
- - Consistent behavior across all profile views
+- `/my/writings` displays all user writings
+- `/my/highlights` displays all user highlights
### Refactored
- Centralized data fetching in controllers
- - Removed duplicate background fetch logic from Me.tsx and Profile.tsx
- - All writings fetching now handled by writingsController
- - All highlights fetching now handled by highlightsController
- - Single source of truth following controller pattern: stream, dedupe, store, emit
- - Cleaner, more maintainable code (DRY principle)
## [0.10.17] - 2025-10-23
### Added
- Setting to control auto-scroll to reading position
- - New toggle in Settings > Reading Experience
- - Allows users to disable automatic scroll restoration
- - Defaults to enabled (preserves existing behavior)
### Fixed
- Blockquote styling on mobile devices
- - Added equal right padding to match left padding (2rem on both sides)
- - Prevents awkward text cutoff on narrow screens
-- Timestamp clicks in highlight cards now navigate within app
- - Articles (kind:30023) open via `/a/{naddr}` route
- - External URLs open via `/r/{encodedUrl}` route
- - Previously opened external search portal (ants.sh)
- - Highlight automatically scrolls into view with sidebar open
-- Hero images now properly extend edge-to-edge on mobile
- - Adjusted negative margins to match new reader padding
- - Image bleeds to screen edges while text maintains comfortable margins
-- Article relay links now open via `/a/` path instead of `/r/`
- - Ensures nostr-native articles route correctly
- - External links continue to use `/r/` path
+- Timestamp clicks in highlight cards navigate within app
+- Hero images properly extend edge-to-edge on mobile
+- Article relay links open via `/a/` path instead of `/r/`
### Changed
- Mobile reader padding increased for better readability
- - Horizontal padding increased from 0.5rem to 1rem
- - Title, summary, and body text now properly aligned
- - More comfortable reading experience on small screens
- Reading position save interval reduced from 3s to 1s
- - More frequent auto-saves during active reading
- - Better preservation of reading progress
## [0.10.16] - 2025-10-22
### Fixed
-- Reading position auto-save now works correctly during continuous scrolling
- - Fixed critical bug where save timer was cleared when tracking toggled
- - Timer now persists across tracking state changes
- - Saves fire reliably every 3 seconds during active reading
- - Throttle mechanism now works as intended
+- Reading position auto-save works correctly during continuous scrolling
- Reading position tracking stability improved
- - Tracking state no longer toggles erratically
- - Content stability checks refined to prevent false negatives
- - Infinite loop fixed in position save handler
### Changed
- Reading position save mechanism changed from debounce to throttle
- - Ensures saves happen at regular 3-second intervals during continuous scrolling
- - Previous debounce approach could skip saves during slow continuous scrolling
- - More predictable save behavior for users
- Simplified reading position logic by removing unused complexity
- - Removed 5% delta requirement for scheduling saves
- - Removed unnecessary state tracking (lastSavedPosition, hasSavedOnce, lastSavedAtRef)
- - Cleaner, more maintainable code
### Fixed
-- Highlights now scroll into view when clicked from `/my/highlights` page
- - Navigation state properly passes highlight ID and openHighlights flag
- - Works for both article links and external URL links
+- Highlights scroll into view when clicked from `/my/highlights` page
## [0.10.15] - 2025-01-22
### Changed
-- Reading position restore now uses pre-loaded data from controller
- - No longer fetches position from scratch when opening articles
- - Uses position already loaded and displayed on bookmark cards
- - Faster restore with no network wait
- - Simpler code without stabilization window complexity
+- Reading position restore uses pre-loaded data from controller
- Reading position scroll animation restored to smooth behavior
- - Changed from instant jump back to smooth animated scroll
- - Better user experience when restoring position
### Fixed
- Reading position no longer saves 0% during back navigation on mobile
- - Removed save-on-unmount behavior that was error-prone
- - Browser scroll-to-top during back gesture no longer overwrites progress
- - Auto-save with 3-second debounce is sufficient for normal reading
- - Prevents accidental reset of reading progress when navigating away
## [0.10.14] - 2025-01-27
### Added
- Third relay education article link in PWA settings
- - Added "Relay Setup 101" article to relay information section
- - Now links to three educational resources about relays
### Changed
-- Timestamp links in bookmark cards now navigate within app
- - Articles (kind:30023) open in `/a/{naddr}` route
- - Notes (kind:1) open in `/e/{eventId}` route
- - External URLs open in `/r/{encodedUrl}` route
- - Uses React Router Link for client-side navigation instead of external search
+- Timestamp links in bookmark cards navigate within app
- Relay article links punctuation improved for better readability
- - Changed from "here and here" to "here, here, and here"
### Fixed
- Duplicate video embeds and stray HTML artifacts eliminated
- - VideoEmbedProcessor now processes HTML and extracts URLs in single pass
- - Placeholder indices now correctly match collected video URLs
- - Empty HTML parts no longer rendered, preventing stray characters like `">`
- Highlights loading spinner no longer spins forever when article has zero highlights
- - Loading state properly cleared when no highlights exist
- - "No highlights" message displays immediately
## [0.10.13] - 2025-01-27
### Added
- Instant article preview when navigating from blog post cards
- - Title, image, summary, and date display immediately via navigation state
- - No skeleton loading for metadata already visible on cards
- - Article content loads seamlessly in background from eventStore or relays
- Reliable relay fallback for article fetching
- - Queries nostr.band, primal, damus, and nos.lol if initial fetch returns no events
- - Reduces "Article not found" errors
### Changed
-- Article loading now follows local-first controller pattern
- - Uses eventStore and queryEvents for streaming results
- - Emits content immediately on first event from store or local relays
- - Finalizes with newest version after EOSE (no artificial timeouts)
- - Background relay query continues to check for updates
-- Service Worker now only registers in production builds
- - Disabled in development to avoid stale cache issues
- - Preserves PWA functionality in production
+- Article loading follows local-first controller pattern
+- Service Worker only registers in production builds
- Article fetching queries union of naddr relay hints and configured relays
- - Prevents failures when naddr contains stale or unreachable relay hints
- - Maintains fast local/hinted paths with reliable fallback
### Fixed
- Article loading race conditions eliminated
- - Request ID guards prevent stale fetches from overwriting current content
- - Stale highlights from previous articles no longer appear
- Content/title mismatch when switching articles resolved
- - Markdown preview clears immediately on content change
- - Forced re-mount of rendered HTML per article via stable content keys
- - Request guards in external URL loader prevent cross-article bleed
- Article re-fetching on settings changes prevented
- - Settings memoized via ref to avoid triggering effect dependencies
-- Explore writings tab now shows skeletons instead of spinner when loading
- - Consistent loading UI across all views
+- Explore writings tab shows skeletons instead of spinner when loading
## [0.10.12] - 2025-01-27
@@ -650,14 +345,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Explore icon changed from newspaper to person hiking for better semantic meaning
- Settings button moved before explore button in sidebar navigation
-- Profile avatar button now uses 44px touch target on mobile (matches other icon buttons)
+- Profile avatar button uses 44px touch target on mobile
### Fixed
-- Web bookmarks (kind:39701) now properly deduplicate by d-tag
-- Same URL bookmarked multiple times now only appears once
-- Web bookmark IDs use coordinate format (kind:pubkey:d-tag) for consistent deduplication
-- Profile avatar button sizing on mobile now matches other IconButton components
+- Web bookmarks (kind:39701) properly deduplicate by d-tag
+- Same URL bookmarked multiple times only appears once
+- Web bookmark IDs use coordinate format (kind
+- Profile avatar button sizing on mobile matches other IconButton components
- Removed all console.log statements from bookmarkController and bookmarkProcessing
## [0.10.11] - 2025-01-27
@@ -671,24 +366,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Default bookmark view changed to flat chronological list (newest first)
+- Default bookmark view changed to flat chronological list
- Bookmark URL changed from `/my/reading-list` to `/my/bookmarks`
- Router updated to handle `/my/reading-list` → `/my/bookmarks` redirect
-- Me.tsx bookmarks tab now uses dynamic filter titles and chronological sorting
+- Me.tsx bookmarks tab uses dynamic filter titles and chronological sorting
- Me.tsx updated to use faClock icon instead of faBars
- Removed bookmark count from section headings for cleaner display
- Hide close/collapse sidebar buttons on mobile for better UX
### Fixed
-- Bookmark sorting now uses proper display time (created_at || listUpdatedAt) with nulls last
+- Bookmark sorting uses proper display time (created_at || listUpdatedAt) with nulls last
- Robust sorting of merged bookmarks with fallback timestamps
- Corrected bookmark timestamp to use bookmark list creation time, not content creation time
- Preserved content created_at while adding listUpdatedAt for proper sorting
-- Removed synthetic added_at field, now uses created_at from bookmark list event
+- Removed synthetic added_at field, uses created_at from bookmark list event
- Consistent chronological sorting with useMemo optimization
- Removed unused faTimes import
-- Bookmark timestamps now show sane dates using created_at fallback to listUpdatedAt
+- Bookmark timestamps show sane dates using created_at fallback to listUpdatedAt
- Guarded formatters to prevent timestamp display errors
### Refactored
@@ -701,112 +396,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Version bump for consistency (no user-facing changes)
+- Version bump for consistency
## [0.10.9] - 2025-10-21
### Fixed
- Event fetching reliability with exponential backoff in eventManager
- - Improved retry logic with incremental backoff delays
- - Better handling of concurrent event requests
- - More robust event retrieval from relay pool
- Bookmark timestamp handling
- - Use per-item `added_at`/`created_at` timestamps when available
- - Improves accuracy of bookmark date tracking
### Changed
- Removed all debug console logs
- - Cleaner console output in development and production
- - Improved performance by eliminating debugging statements
## [0.10.8] - 2025-10-21
### Added
- Individual event rendering via `/e/:eventId` path
- - Display `kind:1` notes and other events with article-like presentation
- - Publication date displayed in top-right corner like articles
- - Author attribution with "Note by @author" titles
- - Direct event loading with intelligent caching from eventStore
- Centralized event fetching via new `eventManager` singleton
- - Request deduplication for concurrent fetches
- - Automatic retry logic when relay pool becomes available
- - Non-blocking background fetching with 12-second timeout
- - Seamless integration with eventStore for instant cached event display
### Fixed
- Bookmark hydration efficiency
- - Only request content for bookmarks missing data (not all bookmarks)
- - Use eventStore fallback for instant display of cached profiles
- - Prevents over-fetching and improves initial load performance
- Search button behavior for notes
- - Opens `kind:1` notes directly via `/e/{eventId}` instead of search portal
- - Articles continue to use search portal with proper naddr encoding
- - Removes unwanted `nostr-event:` prefix from URLs
- Author profile resolution
- - Fetch author profiles from eventStore cache first before relay requests
- - Instant title updates if profile already loaded
- - Graceful fallback to short pubkey display if profile unavailable
## [0.10.7] - 2025-10-21
### Fixed
-- Profile pages now display all writings correctly
- - Events are now stored in eventStore as they stream in from relays
- - `fetchBlogPostsFromAuthors` now accepts `eventStore` parameter like other fetch functions
- - Ensures all writings appear on `/p/` routes, not just the first few
- - Background fetching of highlights and writings uses consistent patterns
+- Profile pages display all writings correctly
### Changed
- Simplified profile background fetching logic for better maintainability
- - Extracted relay URLs to variable for clarity
- - Consistent error handling patterns across fetch functions
- - Clearer comments about no-limit fetching behavior
## [0.10.6] - 2025-10-21
### Added
- Text-to-speech reliability improvements
- - Chunking support for long-form content to prevent WebSpeech API cutoffs
- - Automatic chunk-based resumption for interrupted playback
- - Better handling of content exceeding browser TTS limits
### Fixed
- Tab switching regression on `/my` page
- - Resolved infinite update loop caused by circular dependency in `useCallback` hooks
- - Tab navigation now properly updates UI when URL changes
- - Removed `loadedTabs` from dependency arrays to prevent re-render cycles
- Explore page data loading patterns
- - Implemented subscribe-first, non-blocking loading model
- - Removed all timeouts in favor of immediate subscription and progressive hydration
- - Contacts, writings, and highlights now stream results as they arrive
- - Nostrverse content loads in background without blocking UI
- Text-to-speech handler cleanup
- - Removed no-op self-assignment in rate change handler
## [0.10.4] - 2025-10-21
### Added
-- Web Share Target support for PWA (system-level share integration)
- - Boris can now receive shared URLs from other apps on mobile and desktop
- - Implements POST-based Web Share Target API per Chrome standards
- - Service worker intercepts share requests and redirects to handler route
- - ShareTargetHandler component auto-saves shared URLs as web bookmarks
- - Android compatibility with URL extraction from text field when url param is missing
- - Automatic navigation to bookmarks list after successful save
- - Login prompt when sharing while logged out
+- Web Share Target support for PWA
### Changed
-- Manifest now includes `share_target` configuration for system share menu integration
+- Manifest includes `share_target` configuration for system share menu integration
- Service worker handles POST requests to `/share-target` endpoint
- Added `/share-target` route for processing incoming shared content
@@ -815,163 +461,68 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Content filtering setting to hide articles posted by bots
- - New "Hide content posted by bots" checkbox in Explore settings (enabled by default)
- - Filters articles where author's profile name or display_name contains "bot" (case-insensitive)
- - Applies to both Explore page and Me section writings
### Fixed
- Resolved all linting and type checking issues
- - Added missing React Hook dependencies to `useMemo` and `useEffect`
- - Wrapped loader functions in `useCallback` to prevent unnecessary re-renders
- - Removed unused variables (`queryTime`, `startTime`, `allEvents`)
- - All ESLint warnings and TypeScript errors now resolved
## [0.10.2] - 2025-10-20
### Added
- Text-to-speech (TTS) speaker language selection mode
- - New "Speaker language" dropdown in TTS settings (system or content)
- - Detects content language using tinyld for accurate voice matching
- - Falls back to system language when content detection unavailable
- - Top 10 languages featured in dropdown for quick access
- TTS example text section in settings
- - Test TTS voices directly in the settings panel
- - Uses Boris mission statement as example text
- - Real-time speaker selection testing
### Changed
-- TTS language selection now uses "Speaker language" terminology
- - Distinguishes between American English (en-US) and British English (en-GB)
- - Improved language detection with content-aware voice selection
- - Streamlined dropdown for better UX
+- TTS language selection uses "Speaker language" terminology
### Fixed
- TTS voice detection and selection logic
- - Proper empty catch block handling instead of silently failing
- - Consistent use of `setting-select` class for dropdown styling
- - Improved dropdown spacing with adequate padding-right
## [0.10.0] - 2025-01-27
### Added
- Centralized bookmark loading with streaming and auto-decrypt
- - Bookmarks now load progressively with streaming updates
- - Auto-decrypt bookmarks as they arrive from relays
- - Individual decrypt buttons for encrypted bookmark events
- - Centralized bookmark controller for consistent loading across the app
- Enhanced debug page with comprehensive diagnostics
- - Interactive NIP-04 and NIP-44 encryption/decryption testing
- - Live performance timing with stopwatch display
- - Bookmark loading and decryption diagnostics
- - Real-time bunker logs with filtering and clearing
- - Version and git commit footer
- Bunker (NIP-46) authentication support
- - Support for remote signing via Nostr Connect protocol
- - Bunker URI input with validation and error handling
- - Automatic reconnection on app restore with proper permissions
- - Signer suggestions in error messages (Amber, nsec.app, Nostrum)
### Changed
- Improved bookmark loading performance
- - Non-blocking, progressive bookmark updates via callback pattern
- - Batched background hydration using EventLoader and AddressLoader
- - Shorter timeouts for debug page bookmark loading
- - Sequential decryption instead of concurrent to avoid queue issues
- Enhanced bunker error messages
- - Formatted error messages with signer suggestions
- - Links to nos2x, Amber, nsec.app, and Nostrum signers
- - Better error handling for missing signer extensions
- Centralized bookmark loading architecture
- - Single shared bookmark controller for consistent loading
- - Unified bookmark loading with streaming and auto-decrypt
- - Consolidated bookmark loading into single centralized function
### Fixed
- NIP-46 bunker signing and decryption
- - NostrConnectSigner properly reconnects with permissions on app restore
- - Bunker relays added to relay pool for signing requests
- - Proper setup of pool and relays before bunker reconnection
- - Expose nip04/nip44 on NostrConnectAccount for bookmark decryption
- - Cache wrapped nip04/nip44 objects instead of using getters
- - Wait for bunker relay connections before marking signer ready
- - Validate bunker URI (remote must differ from user pubkey)
- - Accept remote===pubkey for Amber compatibility
- Bookmark loading and decryption
- - Bookmarks load and complete properly with streaming
- - Auto-decrypt private bookmarks with NIP-04 detection
- - Include decrypted private bookmarks in sidebar
- - Skip background event fetching when there are too many IDs
- - Only build bookmarks from ready events (unencrypted or decrypted)
- - Restore Debug page decrypt display via onDecryptComplete callback
- - Make controller onEvent non-blocking for queryEvents completion
- - Proper timeout handling for bookmark decryption (no hanging)
- - Smart encryption detection with consistent padlock display
- - Sequential decryption instead of concurrent to avoid queue issues
- - Add extraRelays to EventLoader and AddressLoader
- TypeScript and linting errors throughout
- - Replace empty catch blocks with warnings
- - Fix explicit any types
- - Add missing useEffect dependencies
- - Resolve all linting issues in App.tsx, Debug.tsx, and async utilities
### Performance
- Non-blocking NIP-46 operations
- - Fire-and-forget NIP-46 publish for better UI responsiveness
- - Non-blocking bookmark decryption with sequential processing
- - Make controller onEvent non-blocking for queryEvents completion
- Optimized bookmark loading
- - Batched background hydration using EventLoader and AddressLoader
- - Progressive, non-blocking bookmark loading with streaming
- - Shorter timeouts for debug page bookmark loading
- - Remove artificial delays from bookmark decryption
### Refactored
- Centralized bookmark controller architecture
- - Extract bookmark streaming helpers and centralize loading
- - Consolidated bookmark loading into single function
- - Remove deprecated bookmark service files
- - Share bookmark controller between components
- Debug page organization
- - Extract VersionFooter component to eliminate duplication
- - Structured sections with proper layout and styling
- - Apply settings page styling structure
- Simplified bunker implementation following applesauce patterns
- - Clean up bunker implementation for better maintainability
- - Import RELAYS from central config (DRY principle)
- - Update RELAYS list with relay.nsec.app
### Documentation
- Comprehensive Amber.md documentation
- - Amethyst-style bookmarks section
- - Bunker decrypt investigation summary
- - Critical queue disabling requirement
- - NIP-46 setup and troubleshooting
## [0.9.1] - 2025-10-20
### Added
- Video embedding for nostr-native content
- - Detect and embed `` blocks (including nested ``)
- - Detect and embed `` tags
- - Detect and embed bare video file URLs and platform-classified video links
- Media display settings
- - New "Render video links as embeds" setting (defaults to enabled)
- - New "Full-width images" display option
- - Dedicated "Media Display" settings section
- Article view improvements
- - Center images by default in reader
- - Writings list sorted by publication date (newest first)
### Changed
@@ -982,8 +533,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Prevent double video player rendering when both processor and panel attempted to embed
- Remove text artifacts and broken tags when converting markdown image/video URLs
- - Improved URL regex and robust tag replacement
- - Avoid injecting unknown img props from markdown renderer
- Resolved remaining ESLint and TypeScript issues
### Performance
@@ -994,31 +543,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- User relay list integration (NIP-65) and blocked relays (NIP-51)
- - Automatically loads user's relay list from kind 10002 events
- - Supports blocked relay filtering from kind 10006 mute lists
- - Integrates with existing relay pool for seamless user experience
+- User relay list integration
- Relay list debug section in Debug component
- - Enhanced debugging capabilities for relay list loading
- - Detailed logging for relay query diagnostics
### Changed
- Improved relay list loading performance
- - Added streaming callback to relay list service for faster results
- - User relay list now streams into pool immediately and finalizes after blocked relays
- - Made relay list loading non-blocking in App.tsx
- Enhanced relay URL handling
- - Normalized relay URLs to match applesauce-relay internal format
- - Removed relay.dergigi.com from default relays
- - Use user's relay list exclusively when logged in
### Fixed
- Resolved all linting issues across the codebase
- Fixed TypeScript type issues in relayListService
- - Replaced any types with proper NostrEvent types
- - Improved type safety and code quality
- Cleaned up temporary test relays from hardcoded list
- Removed non-relay console.log statements and debug output
@@ -1033,91 +569,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- React Hooks violations in NostrMentionLink component
- - Fixed useEffect dependency warnings by removing isMounted from dependencies
- - Reverted to inline mount tracking with useRef for safer lifecycle handling
## [0.8.4] - 2024-10-20
### Added
- Progressive article hydration for reads tab
- - Articles now load titles, summaries, images, and author information progressively
- - Implemented readsController following the same pattern as bookmarkController
- - Uses AddressLoader for efficient batched article event retrieval
- - Articles rehydrate as data arrives from relays without blocking initial display
- - Event store integration for caching article events
- - Centralized reads data fetching following DRY principles
### Fixed
- Fixed React type imports in useArticleLoader
- - Import `Dispatch` and `SetStateAction` directly from 'react' instead of using `React.` prefix
- - Resolves ESLint no-undef errors
## [0.8.3] - 2025-01-19
### Fixed
-- Highlight creation now shows immediate UI feedback without page refresh
- - Fixed streaming highlight merge logic to preserve newly created highlights
- - Decoupled cached highlight sync from content loading to prevent unintended reloads
- - Newly created highlights appear instantly in both reader and highlights panel
- - Highlights remain visible while remote results stream in and merge properly
+- Highlight creation shows immediate UI feedback without page refresh
### Changed
- Improved highlight creation user experience
- - Selection clearing and synchronous rendering for immediate highlight display
- - Better error handling for bunker permission issues with user-friendly messages
## [0.8.2] - 2025-10-19
### Added
- Reading progress indicator in compact bookmark cards
- - Shows progress bar for articles and web bookmarks with reading data
- - Progress bar aligned with bookmark text for better visual association
- - Color-coded progress (blue for reading, green for completed, gray for started)
### Changed
- Compact cards layout optimizations for more space-efficient display
- - Reduced vertical padding from 0.5rem to 0.25rem
- - Reduced compact row height from 28px to 24px
- - Reduced gap between compact cards from 0.5rem to 0.25rem
- Reading progress bar styling for compact view
- - Bar height reduced from 2px to 1px for more subtle appearance
- - Left margin of 1.5rem aligns bar with bookmark text instead of appearing as separator
### Fixed
- Removed borders from compact bookmarks in bookmarks sidebar
- - Border styling from `.bookmarks-list` no longer applies to compact cards
- - Compact cards now display as truly borderless and transparent
## [0.8.0] - 2025-10-19
### Added
- Centralized reading progress controller for non-blocking reading position sync
- - Progressive loading with caching from event store
- - Streaming updates from relays with proper merging
- - 2-second completion hold at 100% reading position to prevent UI jitter
- - Configurable auto-mark-as-read at 100% reading progress
- Reading progress indicators on blog post cards
- - Visual progress bars on article cards in Explore and bookmarks sidebar
- - Persistent reading position synced across devices via NIP-85
### Changed
-- Reading position sync now enabled by default in runtime paths
+- Reading position sync enabled by default in runtime paths
- Improved auto-mark-as-read behavior with reliable completion detection
-- Reading progress events use proper NIP-85 specification (kind 39802)
+- Reading progress events use proper NIP-85 specification
### Fixed
- Reading position saves with proper validation and event store integration
-- Profile page writings loading now fetches all writings without limits
+- Profile page writings loading fetches all writings without limits
- Consistent reading progress calculation and event publishing
### Performance
@@ -1131,119 +635,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Profile page data preloading for instant tab switching
- - Automatically preloads all highlights and writings when viewing a profile (`/p/` pages)
- - Non-blocking background fetch stores all events in event store
- - Tab switching becomes instant after initial preload
### Changed
-- `/my/bookmarks` tab now displays in cards view only
- - Removed view mode toggle buttons (compact, large) from bookmarks tab
- - Cards view provides optimal bookmark browsing experience
- - Grouping toggle (grouped/flat) still available
+- `/my/bookmarks` tab displays in cards view only
- Highlights sidebar filters simplified when logged out
- - Only nostrverse filter button shown when not logged in
- - Friends and personal highlight filters hidden when logged out
- - Cleaner UX showing only available options
### Fixed
-- Profile page tabs now display cached content instantly
- - Highlights and writings show immediately from event store cache
- - Network fetches happen in background without blocking UI
- - Matches Explore and Debug page non-blocking loading pattern
- - Eliminated loading delays when switching between tabs
+- Profile page tabs display cached content instantly
### Performance
- Cache-first profile loading strategy
- - Instant display of cached highlights and writings from event store
- - Background refresh updates data without blocking
- - Tab switches show content immediately without loading states
## [0.7.3] - 2025-10-18
### Added
- Centralized nostrverse writings controller for kind 30023 content
- - Automatically starts at app initialization
- - Streams nostrverse blog posts progressively to Explore page
- - Provides non-blocking, cache-first loading strategy
- Centralized nostrverse highlights controller
- - Pre-loads nostrverse highlights at app start for instant toggling
- - Streams highlights progressively to Explore page
- - Integrated with EventStore for caching
- Writings loading debug section on `/debug` page
- - Diagnostics for writings controller and loading states
### Changed
-- Explore page now uses centralized `writingsController` for user's own writings
- - Auto-loads user writings at login for instant availability
- - Non-blocking fetch with progressive streaming
+- Explore page uses centralized `writingsController` for user's own writings
- Explore page loading strategy optimized
- - Shows skeleton placeholders instead of blocking spinners
- - Seeds from cache, then streams and merges results progressively
- - Keeps nostrverse fetches non-blocking
-- User's own writings now included in Explore when enabled
- - Lazy-loads on 'mine' toggle when logged in
- - Streams in parallel with friends/nostrverse content
+- User's own writings included in Explore when enabled
### Fixed
- Explore page works correctly in logged-out mode
- - Relies solely on centralized nostrverse controllers
- - Controllers start even when logged out
- - Fetches nostrverse content properly without authentication
- Explore page no longer allows disabling all scope filters
- - Ensures at least one filter (mine/friends/nostrverse) remains active
- - Prevents blank content state
- Explore page reflects default scope setting immediately
- - No more blank lists on initial load
- - Pre-loads and merges nostrverse from event store
- Explore page highlights properly scoped
- - Nostrverse highlights never block the page
- - Shows empty state instead of spinner
- - Streams results into store immediately
- - Highlights are merged and loaded correctly
- Article-specific highlights properly filtered
- - Highlights scoped to current article on `/a/` and `/r/` routes
- - Derives coordinate from naddr for early filtering
- - Sidebar and content only show relevant highlights
- - ContentPanel shows only article-specific highlights for nostr articles
- Explore writings properly deduplicated
- - Deduplication by replaceable event (author:d-tag) happens before visibility filtering
- - Consistent dedupe/sort behavior across all loading scenarios
- Debug page writings loading section added
- - No infinite loop when loading nostrverse content
### Performance
- Non-blocking explore page loading
- - Fully non-blocking loading strategy
- - Seeds caches then streams and merges results progressively
- Lazy-loading for content filters
- - Nostrverse writings lazy-load when toggled on while logged in
- - Avoids redundant loading with guard flags
- Streaming callbacks for progressive updates
- - Writings stream to UI via onPost callback
- - Posts appear instantly as they arrive from cache or network
## [0.7.2] - 2025-01-27
### Added
- Cached-first loading with EventStore across the app
- - Instant display of cached highlights and writings from local event store
- - Progressive loading with streaming updates from relays
- - Centralized event storage for improved performance and offline support
- Default explore scope setting for controlling content visibility
- - Configurable default scope for explore page content
- - Dedicated Explore section in settings for better organization
### Changed
-- Highlights and writings now load from cache first, then stream from relays
+- Highlights and writings load from cache first, then stream from relays
- Explore page shows cached content instantly before network updates
- Article-specific highlights stored in centralized event store for faster access
- Nostrverse content cached locally for improved performance
@@ -1266,223 +711,102 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Login with Bunker (NIP-46) authentication support
- - Support for remote signing via Nostr Connect protocol
- - Bunker URI input with validation and error handling
- - Automatic reconnection on app restore with proper permissions
- - Signer suggestions in error messages (Amber, nsec.app, Nostrum)
- Debug page (`/debug`) for diagnostics and testing
- - Interactive NIP-04 and NIP-44 encryption/decryption testing
- - Live performance timing with stopwatch display
- - Bookmark loading and decryption diagnostics
- - Real-time bunker logs with filtering and clearing
- - Version and git commit footer
- Progressive bookmark loading with streaming updates
- - Non-blocking, progressive bookmark updates via callback pattern
- - Batched background hydration using EventLoader and AddressLoader
- - Auto-decrypt bookmarks as they arrive from relays
- - Individual decrypt buttons for encrypted bookmark events
-- Bookmark grouping toggle (grouped by source vs flat chronological)
- - Toggle between grouped view and flat chronological list
- - Amethyst-style bookmark detection and grouping
- - Display bookmarks even when they only have IDs (content loads in background)
+- Bookmark grouping toggle
### Changed
- Improved login UI with better copy and modern design
- - Personable title and nostr-native language
- - Highlighted 'your own highlights' in login copy
- - Simplified button text to single words (Extension, Signer)
- - Hide login button and user icon when logged out
- - Hide Extension button when Bunker input is shown
- - Auto-load bookmarks on login and page mount
- Enhanced bunker error messages
- - Formatted error messages with signer suggestions
- - Links to nos2x, Amber, nsec.app, and Nostrum signers
- - Better error handling for missing signer extensions
- - Centered and constrained bunker input field
- Centralized bookmark loading architecture
- - Single shared bookmark controller for consistent loading
- - Unified bookmark loading with streaming and auto-decrypt
- - Consolidated bookmark loading into single centralized function
- - Bookmarks passed as props throughout component tree
- Renamed UI elements for clarity
- - "Bunker" button renamed to "Signer"
- - Hide bookmark controls when logged out
- Settings version footer improvements
- - Separate links for version (to GitHub release) and commit (to commit page)
- - Proper spacing around middot separator
### Fixed
- NIP-46 bunker signing and decryption
- - NostrConnectSigner properly reconnects with permissions on app restore
- - Bunker relays added to relay pool for signing requests
- - Proper setup of pool and relays before bunker reconnection
- - Expose nip04/nip44 on NostrConnectAccount for bookmark decryption
- - Cache wrapped nip04/nip44 objects instead of using getters
- - Wait for bunker relay connections before marking signer ready
- - Validate bunker URI (remote must differ from user pubkey)
- - Accept remote===pubkey for Amber compatibility
- Bookmark loading and decryption
- - Bookmarks load and complete properly with streaming
- - Auto-decrypt private bookmarks with NIP-04 detection
- - Include decrypted private bookmarks in sidebar
- - Skip background event fetching when there are too many IDs
- - Only build bookmarks from ready events (unencrypted or decrypted)
- - Restore Debug page decrypt display via onDecryptComplete callback
- - Make controller onEvent non-blocking for queryEvents completion
- - Proper timeout handling for bookmark decryption (no hanging)
- - Smart encryption detection with consistent padlock display
- - Sequential decryption instead of concurrent to avoid queue issues
- - Add extraRelays to EventLoader and AddressLoader
- PWA cache limit increased to 3 MiB for larger bundles
- Extension login error messages with nos2x link
- TypeScript and linting errors throughout
- - Replace empty catch blocks with warnings
- - Fix explicit any types
- - Add missing useEffect dependencies
- - Resolve all linting issues in App.tsx, Debug.tsx, and async utilities
### Performance
- Non-blocking NIP-46 operations
- - Fire-and-forget NIP-46 publish for better UI responsiveness
- - Non-blocking bookmark decryption with sequential processing
- - Make controller onEvent non-blocking for queryEvents completion
- Optimized bookmark loading
- - Batched background hydration using EventLoader and AddressLoader
- - Progressive, non-blocking bookmark loading with streaming
- - Shorter timeouts for debug page bookmark loading
- - Remove artificial delays from bookmark decryption
### Refactored
- Centralized bookmark controller architecture
- - Extract bookmark streaming helpers and centralize loading
- - Consolidated bookmark loading into single function
- - Remove deprecated bookmark service files
- - Share bookmark controller between components
- Debug page organization
- - Extract VersionFooter component to eliminate duplication
- - Structured sections with proper layout and styling
- - Apply settings page styling structure
- Simplified bunker implementation following applesauce patterns
- - Clean up bunker implementation for better maintainability
- - Import RELAYS from central config (DRY principle)
- - Update RELAYS list with relay.nsec.app
### Documentation
- Comprehensive Amber.md documentation
- - Amethyst-style bookmarks section
- - Bunker decrypt investigation summary
- - Critical queue disabling requirement
- - NIP-46 setup and troubleshooting
## [0.6.24] - 2025-01-16
### Fixed
- TypeScript global declarations for build-time defines
- - Added proper type declarations for `__APP_VERSION__`, `__GIT_COMMIT__`, `__GIT_BRANCH__`, `__BUILD_TIME__`, and `__GIT_COMMIT_URL__`
- - Resolved ESLint no-undef errors for build-time injected variables
- - Added Node.js environment hint to Vite configuration
## [0.6.23] - 2025-01-16
### Fixed
- Deep-link refresh redirect issue for nostr-native articles
- - Limited `/a/:naddr` rewrite to bot user-agents only in Vercel configuration
- - Real browsers now hit the SPA directly, preventing redirect to root path
- - Bot crawlers still receive proper OpenGraph metadata for social sharing
### Added
- Version and git commit information in Settings footer
- - Displays app version and short commit hash with link to GitHub
- - Build-time metadata injection via Vite configuration
- - Subtle footer styling with selectable text
### Changed
-- Article OG handler now uses proper RelayPool.request() API
- - Aligned with applesauce RelayPool interface
- - Removed deprecated open/close methods
- - Fixed TypeScript linting errors
+- Article OG handler uses proper RelayPool.request() API
### Technical
- Added debug logging for route state and article OG handler
- - Gated by `?debug=1` query parameter for production testing
- - Structured logging for troubleshooting deep-link issues
- - Temporary debug components for validation
## [0.6.22] - 2025-10-16
### Added
- Dynamic OpenGraph and Twitter Card meta tags for article deep-links
- - Social media platforms display article title, author, cover image, and summary when sharing `/a/{naddr}` links
- - Serverless endpoint fetches article metadata from Nostr relays (kind:30023) and author profiles (kind:0)
- - User-agent detection serves appropriate content to crawlers vs browsers
- - Falls back to default social preview image when articles have no cover image
- Social preview image for homepage and article links
- - Added `boris-social-1200.png` as default OpenGraph image (1200x630)
- - Homepage now includes social preview image in meta tags
### Changed
-- Article deep-links now properly preserve URL when loading in browser
- - Uses `history.replaceState()` to maintain correct article path
- - Browser navigation works correctly on refresh and new tab opens
+- Article deep-links properly preserve URL when loading in browser
### Fixed
- Vercel rewrite configuration for article routes
- - Routes `/a/:naddr` to serverless OG endpoint for dynamic meta tags
- - Regular SPA routing preserved for browser navigation
## [0.6.21] - 2025-10-16
### Added
-- Reading position sync across devices using Nostr Kind 30078 (NIP-78)
- - Automatically saves and syncs reading position as you scroll
- - Visual reading progress indicator on article cards
- - Reading progress shown in Explore and Bookmarks sidebar
- - Auto-scroll to last reading position setting (configurable in Settings)
- - Reading position displayed as colored progress bar on cards
+- Reading position sync across devices using Nostr Kind 30078
- Reading progress filters for organizing articles
- - Filter by reading state: Unopened, Started (0-10%), Reading (11-94%), Completed (95-100% or marked as read)
- - Filter icons colored when active (blue for most, green for completed)
- - URL routing support for reading progress filters
- - Reading progress filters available in Archive tab and bookmarks sidebar
- Reads and Links tabs on `/my` page
- - Reads tab shows nostr-native articles with reading progress
- - Links tab shows external URLs with reading progress
- - Both tabs populate instantly from bookmarks for fast loading
- - Lazy loading for improved performance
- Auto-mark as read at 100% reading progress
- - Articles automatically marked as read when scrolled to end
- - Marked-as-read articles treated as 100% progress
- - Fancy checkmark animation on Mark as Read button
- Click-to-open article navigation on highlights
- - Clicking highlights in Explore and Me pages opens the source article
- - Automatically scrolls to highlighted text position
### Changed
- Renamed Archive to Reads with expanded functionality
- Merged 'Completed' and 'Marked as Read' filters into one unified filter
-- Simplified filter icon colors to blue (except green for completed)
+- Simplified filter icon colors to blue
- Started reading progress state (0-10%) uses neutral text color
- Replace spinners with skeleton placeholders during refresh in Archive/Reads/Links tabs
- Removed unused IEventStore import in ContentPanel
### Fixed
-- Reading position calculation now accurately reaches 100%
+- Reading position calculation accurately reaches 100%
- Reading position filters work correctly in bookmarks sidebar
- Filter out reads without timestamps or 'Untitled' items
- Show skeleton placeholders correctly during initial tab load
@@ -1502,156 +826,74 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Bookmark filter buttons by content type (articles, videos, images, web links)
- - Filter bookmarks by their content type on bookmarks sidebar
- - Filters also available on `/my` page bookmarks tab
- - Separate filter for external articles with link icon
- - Multiple filters can be active simultaneously
+- Bookmark filter buttons by content type
- Private Bookmarks section for encrypted legacy bookmarks
- - Encrypted legacy bookmarks now grouped in separate section
- - Better organization and clarity for different bookmark types
### Changed
- Bookmark section labels improved for clarity
- - More descriptive section headings throughout
- - Better categorization of bookmark types
- Bookmark filter button styling refined
- - Reduced whitespace around bookmark filters for cleaner layout
- - Dramatically reduced whitespace on both sidebar and `/my` page
- Lock icon removed from individual bookmarks
- - Encryption status now indicated by section grouping
- - Cleaner bookmark item appearance
-- External article icon changed to link icon (`faLink`)
- - More intuitive icon for external content
+- External article icon changed to link icon
### Fixed
- Highlight button positioning and visibility
- - Fixed to viewport for consistent placement
- - Sticky and always visible when needed
- - Properly positioned inside reader pane
## [0.6.19] - 2025-10-15
### Fixed
- Highlights disappearing on external URLs after a few seconds
- - Fixed `useBookmarksData` from fetching general highlights when viewing external URLs
- - External URL highlights now managed exclusively by `useExternalUrlLoader`
- - Removed redundant `setHighlights` call that was overwriting streamed highlights
- - Improved error handling in `fetchHighlightsForUrl` to prevent silent failures
- - Isolated rebroadcast errors so they don't break highlight display
- - Added logging to help diagnose highlight fetching issues
## [0.6.18] - 2025-10-15
### Changed
- Zap split labels simplified and terminology updated
- - Removed redundant "Weight: xy" label to save space
- - Changed "Author(s) Share" to "Author's Share" (possessive singular)
- - Changed "Support Boris" to "Boris' Share" for consistency
- - Weight value now shown directly in label (e.g., "Your Share: 50")
- - Share and percentage now displayed on same line for cleaner layout
-- Zap preset buttons on desktop now expand to match slider width
- - Added `flex: 1` to buttons for equal width distribution
- - Buttons still wrap properly on smaller screens
-- PWA install section now always visible in settings
- - Section shows regardless of installation or device capability status
- - Button adapts with proper disabled states and visual feedback
- - "Installed" state shows checkmark icon and disabled button
- - Non-installable state shows disabled button
+- Zap preset buttons on desktop expand to match slider width
+- PWA install section always visible in settings
### Fixed
-- PWA install button now properly disabled when installation is not possible on device
- - Button only enabled when browser fires `beforeinstallprompt` event
- - Removed hardcoded testing state that always showed button as installable
-- App & Airplane Mode section now always visible regardless of PWA status
- - Image cache and local relay settings always accessible
- - Previously entire section was hidden if PWA not installable/installed
- - Only PWA-specific install button is conditionally affected
+- PWA install button properly disabled when installation is not possible on device
+- App & Airplane Mode section always visible regardless of PWA status
## [0.6.17] - 2025-10-15
### Added
- PWA settings illustration (`pwa.svg`) displayed on right side of section
- - Responsive design: hidden on mobile, 30% width on desktop
- - Visual enhancement for App & Airplane Mode section
- Zaps illustration (`zaps.svg`) displayed on right side of Zap Splits section
- - Matching responsive layout and styling as PWA illustration
- Visual 50% indicators on zap split sliders
- - Linear gradient background using highlight colors (yellow/orange) at 50% opacity
- - Datalist tick marks at 50% for "Your Share" and "Author(s) Share" sliders
- - Tick mark at 5 for "Support Boris" slider
- Lightning bolt icons as slider thumbs for zap splits
- - Replaces default circular slider handles
- - White lightning bolt SVG embedded in slider thumb background
- - 24px square thumb with 4px border radius
- Offline-first description paragraph at beginning of App & Airplane Mode section
- - Explains Boris's offline capabilities upfront
-- Settings page width constraint (900px max-width)
- - Matches article view max-width for consistent reading experience
- - Centered layout with proper margins
+- Settings page width constraint
### Changed
- Settings section reorganization
- - "PWA & Flight Mode" merged into single "App & Airplane Mode" section
- - "Layout & Navigation" and "Startup & Behavior" merged into "Layout & Behavior"
- - Section order: Theme → Reading & Display → Zap Splits → Layout & Behavior → App & Airplane Mode → Relays
- - "Startup & Behavior" moved after "Zap Splits"
- - "Layout & Navigation" moved below "Zap Splits"
- PWA settings section restructure
- - Checkboxes moved to top (image cache, local relays)
- - Descriptive paragraphs in middle
- - Install button at bottom
- - Note about local relays moved before install paragraph
- Zap split sliders styling
- - Left side (0-50%): highlight color (yellow) at 50% opacity
- - Right side (50-100%): friend-highlight color (orange) at 50% opacity
- - Creates visual distinction tied to app's highlight color scheme
- Zap split description text styling
- - Now matches offline-first paragraph style with secondary color and smaller font size
- Clear cache button styling
- - Replaced `IconButton` with plain `FontAwesomeIcon` for subtler appearance
- - No border or background, just icon with opacity
- Font Size buttons alignment
- - Now properly align to the right using `setting-control` wrapper
- - Matches alignment of highlight color picker buttons
- Default Highlight Visibility position
- - Moved back to original position after "Paragraph Alignment"
- - Grouped with other reading display controls
- Spacing adjustments in App & Airplane Mode section
- - Reduced gap between elements from 1rem → 0.5rem → 0.25rem for tighter layout
### Fixed
- PWA settings paragraph wrapping
- - Moved offline-first paragraph inside flex container to prevent extending above image
- Font Size buttons alignment issues
- - Properly implemented `setting-control` wrapper for right alignment
- - Previously attempted alignment didn't work correctly
- Slider thumb icon centering
- - Lightning bolt icons properly centered vertically on slider
- - Added `position: relative`, `top: 0`, `margin-top: 0` for accurate positioning
## [0.6.16] - 2025-10-15
### Changed
- Replaced delete dialog popup with inline confirmation UI
- - Shows red "Confirm?" text with trash icon when delete is clicked
- - Clicking the red trash icon confirms deletion
- - No more modal overlay or backdrop
- - Click outside or reopen menu to cancel
- Reordered Reading & Display settings for better organization
- - Highlight Style, Paragraph Alignment, and Default Highlight Visibility moved to top
- - Followed by Reading Font, Font Size, and color pickers
-- Setting buttons now align vertically with fixed label width (220px)
- - Creates consistent "tab stops" for cleaner visual alignment
+- Setting buttons align vertically with fixed label width
### Fixed
@@ -1662,45 +904,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Paragraph alignment setting with left-aligned and justified text options
- - Icon buttons in Reading & Display settings for switching alignment
- - CSS variable system for applying alignment to reader content
- - Real-time preview of alignment changes in settings
- - Headings remain left-aligned for optimal readability
### Changed
- Default paragraph alignment changed to justified for improved reading experience
- - Applies to paragraphs, list items, divs, and blockquotes
- - Settings stored and synced via Nostr (NIP-78)
## [0.6.14] - 2025-10-15
### Added
-- Support for bookmark sets (NIP-51 kind:30003)
- - Bookmark sets now display alongside regular bookmark lists
- - Properly handles AddressPointer bookmarks for long-form articles
+- Support for bookmark sets
- Content type icons for bookmarks
- - Article, video, web, and image icons to indicate bookmark content type
- - Camera icon for image bookmarks
- - Sticky note icon for text-only bookmarks without URLs
- Bookmark grouping and sections
- - Grouped sections in sidebar and `/my` reading-list
- - Web bookmarks, default bookmarks, and legacy bookmarks in separate sections
- - Grouping and sorting helpers for organizing bookmark sections
- Adaptive text color for publication date over hero images
- - Automatically detects image brightness and adjusts text color
- - Improved contrast for better readability
### Changed
- Renamed "Amethyst-style bookmarks" to "Old Bookmarks (Legacy)"
- Hide cover images in compact view for cleaner layout
- Support button improvements
- - Moved to bottom-left of bookmarks bar
- - Changed icon from lightning bolt to heart (orange color)
- - Left-aligned support button, right-aligned view mode buttons
-- Section headings improved with better typography (removed counts)
+- Section headings improved with better typography
- Icon changed from book to file-lines for default bookmarks
- Use regular (outlined) icon variants for lighter, more refined appearance
- Add bookmark button moved to web bookmarks section
@@ -1721,114 +944,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved shadow contrast without background overlay
- Corrected async handling in adaptive color detection
- Corrected FastAverageColor import to use named export
-- Section heading styles now properly override with `!important`
+- Section heading styles properly override with `!important`
- Removed unused articleImage prop from CompactView
## [0.6.13] - 2025-10-15
### Added
-- Support for `nprofile` identifiers on `/p/` profile pages (NIP-19)
- - Profile pages now accept both `npub` and `nprofile` identifiers
- - Extracts pubkey from nprofile data structure
- - Users can share profiles with relay metadata included
+- Support for `nprofile` identifiers on `/p/` profile pages
- Gradient placeholder images for articles without cover images
- - Blog post cards show subtle diagonal gradient using theme colors
- - Reader view displays gradient background with newspaper icon
- - Placeholders adapt automatically to light/dark themes
- - Large view bookmarks use matching gradient backgrounds
### Changed
- PWA install section styling in settings
- - Heading now matches other section headings with proper styling
- - Install button uses standard app button styling instead of custom gradient
- - Consistent with app's design system and theme colors
### Fixed
- Mobile bookmark button visibility across all pages
- - Now visible on `/p/` (profile), `/explore`, `/my`, and `/support` pages
- - Only hidden on settings page or when scrolling down while reading
- - Prevents users from getting stuck without navigation options
- Mobile highlights button behavior at page top
- - Hidden when scrolled to the very top of the page
- - Appears when scrolling up from below
- - Bookmark button remains visible at top (only hides on scroll down)
- - Separate visibility logic for each button improves UX
## [0.6.12] - 2025-10-15
### Changed
-- Horizontal dividers (``) in blog posts now display with more subtle styling
- - Reduced visual weight with 69% opacity for better readability
- - Added increased vertical padding (2.5rem) above and below dividers
- - Improved visual separation without disrupting reading flow
+- Horizontal dividers (``) in blog posts display with more subtle styling
## [0.6.11] - 2025-10-15
### Added
- Colored borders to blog post and highlight cards based on relationship
- - Mine: yellow border
- - Friends: orange border
- - Nostrverse: purple border
- - Visual distinction helps identify content source at a glance
- Mobile sidebar toggle buttons on explore page
- - Bookmark and highlights buttons now visible on explore page
- - Improves mobile navigation UX
### Fixed
- Mobile bookmarks sidebar opening and closing immediately
- - Memoized `toggleSidebar` function to prevent unnecessary re-renders
- - Updated route-change effect to only close sidebar on actual pathname changes
- - Sidebar now stays open when opened on mobile PWA
## [0.6.10] - 2025-10-15
### Added
- Support page (`/support`) displaying zappers with avatar grid
- - Shows "Absolute Legends" (69420+ sats) and regular supporters (2100+ sats)
- - Clickable supporter avatars link to profiles
- - Bolt icon button in sidebar navigation
- - Thank-you illustration and call-to-action
- - Links to pricing page and Boris profile
- Refresh button to explore page
- - Positioned next to filter buttons
- - Spinning animation during loading and pull-to-refresh
- Unified event publishing and querying services
- - `publishEvent` service for highlights and settings
- - `queryEvents` helper with local-first fetching
- - Centralized relay timeouts configuration
- FEATURES.md documentation file
- MIT License
### Changed
- Explore page improvements
- - Filter defaults to friends only (instead of all)
- - Tabs moved below filter buttons
- - Filter buttons positioned on the right
- - Writings tab now uses newspaper icon
- - Subtitle removed for cleaner layout
- Pull-to-refresh library
- - Replaced custom implementation with `use-pull-to-refresh`
- - Updated HighlightsPanel to use new library
-- Loading states now show progressive loading with skeletons instead of blocking error screens
+- Loading states show progressive loading with skeletons instead of blocking error screens
- All event fetching services migrated to unified `queryEvents` helper
- - `nostrverseService`, `bookmarkService`, `libraryService`
- - `exploreService`, `fetchHighlightsFromAuthors`
- Contact streaming with extended timeout and partial results
### Fixed
- All ESLint and TypeScript linting errors
- - Removed all `eslint-disable` statements
- - Fixed `react-hooks/exhaustive-deps` warnings
- - Resolved all type errors
- Explore page refresh loop and false empty-follows error
- Zap receipt scanning with applesauce helpers and more relays
- Support page theme colors for proper readability
@@ -1837,7 +1009,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Event publishing to use unified `publishEvent` service
- Event fetching to use unified `queryEvents` helper
-- Image cache and bookmark components (removed unused settings parameter)
+- Image cache and bookmark components
- Support page spacing and visual hierarchy
## [0.6.9] - 2025-10-14
@@ -1851,36 +1023,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Updated favicon and app icons to purple theme
- - Replaced all 8 icon files (apple-touch-icon, favicon variants, and Android Chrome icons)
- - New purple color scheme for better brand recognition
## [0.6.7] - 2025-10-14
### Added
- Skeleton loading placeholders using `react-loading-skeleton` package
- - Replaced loading spinners with skeleton loaders across all major components
- - BookmarkList, Explore, Me, ContentPanel, and HighlightsPanel now use skeleton placeholders
- - Theme-aware skeleton animations matching app color scheme
- Nostr identifier parsing and rendering in highlight comments
- - Support for `nostr:npub`, `nostr:nprofile`, `nostr:naddr`, `nostr:note`, `nostr:nevent`
- - Clickable links to profiles and articles from highlight comments
- - Shortened display format for better readability
- Visibility filters for explore page content
- - Toggle filters for nostrverse, friends, and own content
- - Icon buttons with color coding matching highlight levels
- - Filter state persists across tab switches
### Changed
-- Loading states now use skeleton placeholders instead of spinners for more polished UX
+- Loading states use skeleton placeholders instead of spinners for more polished UX
- Removed incremental loading spinner from explore page refresh
- - Pull-to-refresh indicator provides refresh state feedback
### Fixed
- Type error in `HighlightItem.tsx` using `React.ReactElement` instead of `JSX.Element`
-- Me page skeleton loading now handles undefined `viewingPubkey` gracefully
+- Me page skeleton loading handles undefined `viewingPubkey` gracefully
### Documentation
@@ -1891,93 +1051,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Profile fetching and caching for explore page
- - Automatically fetches kind:0 metadata for all blog post authors
- - Stores profiles in event store for instant access across app
- - Rebroadcasts profiles to local/all relays per user settings
- - Fixes "Unknown" author names by proactively caching profiles
- Rich content rendering in highlight comments
- - URLs automatically detected and rendered as clickable links
- - Image URLs (jpg, png, gif, webp, etc.) render as inline images
- - Images lazy-load with responsive sizing and rounded borders
- - Links open in new tab with security attributes
### Changed
- Hide citation in highlights sidebar when viewing article
- - Citation removed from sidebar since all highlights are from same source
- - Citation still shown in Explore and Me pages where context is needed
- - Reduces visual clutter and redundant information
### Fixed
- Blog posts with far-future publication dates no longer appear in explore
- - Filter excludes posts with dates more than 1 day in future
- - Allows 1 day tolerance for clock skew between systems
- - Prevents spam posts with unrealistic dates (e.g., "53585 years from now")
- Layout breaks from long URLs in highlight comments
- - Added word-wrap, overflow-wrap, and word-break CSS properties
- - Set min-width: 0 to allow flex child to shrink properly
- - Long URLs now wrap correctly instead of causing horizontal overflow
- Profile fetching implementation
- - Use eventStore.add() directly for immediate profile storage
- - Use tap() operator to process events as they arrive
- - Correct TypeScript types and dependency array
## [0.6.5] - 2025-10-14
### Added
- Highlights tab on `/explore` page
- - View highlights from friends and followed users
- - Tab structure matching `/my` and profile pages
- - Grid layout for highlights with cards
- - Highlights shown first, writings second
- - Clicking highlight opens source article and scrolls to position
- - Opens highlights sidebar automatically when clicking from explore
- Citation attribution on highlight items
- - Shows "— Author, Article Title" for Nostr-native content
- - Shows "— domain.com" for web URLs
- - Resolves author profiles and article titles automatically
- Comment icon (fa-comments) for highlights with comments
- - Flipped horizontally for better visual alignment
- - Colored based on highlight level (mine/friends/nostrverse)
- - No background or extra indent for cleaner look
- Click timestamp to open highlight in native Nostr app
- - Uses nostr:nevent links for native app integration
### Changed
-- Highlight counter text color now matches article text (var(--color-text))
- - Better readability in both light and dark modes
- - Only forces white in overlay context (hero images)
+- Highlight counter text color matches article text
- Highlight level colors applied to explore page highlights
- - Yellow for own highlights
- - Orange for friends' highlights
- - Purple for nostrverse highlights
- Explore page tab order: Highlights first, Writings second
-- Explore page tabs now extend full width to match content grid
+- Explore page tabs extend full width to match content grid
### Fixed
- Highlight counter readability in light mode
- - Theme-aware text color instead of hardcoded blue
- - Consistent with reading time indicator styling
- Scroll-to-highlight reliability in article view
- - Added retry mechanism for asynchronous content loading
- - Attempts to find highlight element up to 20 times over 2 seconds
- Author attribution in highlight citations
- - Correctly extracts author pubkey from highlight's p tag
- - No more "Unknown" author names
- Explore page grid layout
- - Removed max-width constraint blocking full-width display
- - Tabs and content now properly aligned
### Style
- Replaced server icon with highlighter icon in highlight items
-- Switch from solid comment icon to outlined comments icon (fa-regular)
+- Switch from solid comment icon to outlined comments icon
- Removed background from highlight comments for cleaner appearance
-- Removed extra left margin from comments (icon provides sufficient indent)
+- Removed extra left margin from comments
- Comment icon colored by highlight level with no opacity
### Dependencies
@@ -1989,17 +1103,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Color theme variants for light and dark modes
- - Sepia, Classic (white/black), Rose, Sky, Mint, and Lavender themes
- - Color swatches shown in theme selector instead of text labels
- - CSS variable tokens and theme classes for consistent theming
- Playful empty state message for other users' profiles
-- Profile links now open within app instead of external portals
+- Profile links open within app instead of external portals
### Changed
- Default light theme changed to sepia for better readability
- Theme setting labels renamed from 'Colors' to 'Theme'
-- Highlight text now aligns properly with footer icons
+- Highlight text aligns properly with footer icons
- Increased spacing between highlight cards for better visual separation
- Increased bottom padding in highlight cards
- Simplified Me page tab labels for cleaner UI
@@ -2013,7 +1124,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Highlight contrast improved in light themes
- Text contrast improved in dark color themes
- Darker background for app body in dark themes
-- Reading progress indicator now uses theme colors
+- Reading progress indicator uses theme colors
- Highlights tab readability improved in light mode with proper background
- Empty state text color changed from red to gray for better aesthetics
- Replaced 'any' types with proper type definitions for better type safety
@@ -2021,10 +1132,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Refactored
- Migrated entire codebase to semantic token system
- - Pull-to-refresh components updated to use semantic tokens
- - Cards, forms, and layout components migrated to semantic tokens
- - All remaining components converted to semantic token usage
-- Removed localStorage for theme persistence, using only Nostr (NIP-78)
+- Removed localStorage for theme persistence, using only Nostr
- Theme colors applied to body element for consistent theming
## [0.6.3] - 2025-10-14
@@ -2048,39 +1156,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Pull-to-refresh gesture on mobile for all scrollable views
- - HighlightsPanel (right sidebar) - refresh highlights for current article
- - Explore page - refresh blog posts from friends
- - Me pages (all tabs) - refresh user data
- - BookmarkList (left sidebar) - refresh bookmarks
- - Touch-only activation using coarse pointer detection
- - Visual indicator with rotating arrow and contextual messages
-- Three-dot menu for external URLs in reader (`/r/` path)
- - Open in browser, Copy URL, Share URL actions
- - Consistent with article menu functionality
+- Three-dot menu for external URLs in reader
### Changed
- Bookmark refresh button moved to footer alongside view mode controls
- - Last update time now shown in button tooltip
- - Cleaner UI with all controls consolidated in footer
- Unified button styles across left and right sidebars
- - All sidebar buttons now use IconButton component for consistency
- - Removed 73 lines of redundant CSS for old button classes
- - Highlights panel buttons match bookmark sidebar styling
### Fixed
- Reader content alignment on desktop
- - Title, summary, metadata, and body text now properly aligned
- - All reader elements now have consistent 2rem horizontal padding
- - Mobile layout retains compact padding
- Highlight text matching with multiple improvements
- - Precise normalized-to-original character position mapping
- - Remove existing highlight marks before applying new ones
- - Robust validation and error handling for multi-node highlights
- - Prevent character spacing issues in highlighted text
- - Add text validation before applying highlights
- - Eliminate intra-word spaces in highlighted text
## [0.6.1] - 2025-10-13
@@ -2097,23 +1183,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Article titles now larger and more prominent
-- Article summaries now display properly in reader header
+- Article titles larger and more prominent
+- Article summaries display properly in reader header
- Zap splits settings UI with preset buttons and full-width sliders
-- Sidebars now extend to 100vh height
+- Sidebars extend to 100vh height
- Blockquote styling simplified to minimal indent and italic
- Improved zap splits settings visual design
### Fixed
- Horizontal overflow from code blocks and wide content on mobile
-- Settings view now mobile-friendly with proper width constraints
+- Settings view mobile-friendly with proper width constraints
- Long relay URLs no longer cause horizontal overflow on mobile
- Sidebar/highlights toggle buttons hidden on settings/explore/my pages
-- Video titles now show filename instead of 'Error Loading Content'
+- Video titles show filename instead of 'Error Loading Content'
- AddBookmarkModal z-index issue fixed using React Portal
- Highlight matching for text spanning multiple DOM nodes/inline elements
-- Highlights now appear as single continuous element across DOM nodes
+- Highlights appear as single continuous element across DOM nodes
- Highlights display immediately after creation with synchronous render
- Scroll-to-highlight functionality restored after DOM updates
- Padding gaps around sidebars removed
@@ -2124,7 +1210,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Migrated entire color system to Tailwind v4 color palette
- Migrated all CSS files (sidebar, highlights, cards, forms, reader, etc.) to Tailwind colors
- Updated default highlight colors to yellow-400 for markers and yellow-300 for other contexts
-- Added comprehensive color system documentation (COLOR_SYSTEM.md)
+- Added comprehensive color system documentation
- Cleaned up legacy.css removing unused debugging styles
## [0.6.0] - 2025-10-13
@@ -2149,8 +1235,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
-- Reading position indicator now always visible at bottom of screen
-- Progress tracking now accurately reflects reading position
+- Reading position indicator always visible at bottom of screen
+- Progress tracking accurately reflects reading position
- Scroll behavior consistent across desktop and mobile
- Removed padding on mobile main pane for edge-to-edge content
- Removed mobile content pane gap for better layout
@@ -2177,7 +1263,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Reading list tab colored blue to match bookmarks icon
- Left-aligned text in reading list elements
- Increased spacing between mobile buttons and profile element
-- Main pane now full width when displaying videos
+- Main pane full width when displaying videos
- Video container breaks out of reader padding for full width
- Simplified video container layout
@@ -2211,7 +1297,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Reading List on `/my` now uses the same components as the bookmarks sidebar
+- Reading List on `/my` uses the same components as the bookmarks sidebar
- Improve bookmarks sidebar visual design
- Make article menu button more subtle by removing border
@@ -2266,9 +1352,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Reduce margins/paddings to make highlight cards more compact
- Tighten vertical spacing on highlight cards
- Left-align text inside author card
-- Constrain `/my` page content width to match author card (600px)
+- Constrain `/my` page content width to match author card
- Improve tab border styling for dark theme
-- Make relay indicator match CompactButton (same look as menu)
+- Make relay indicator match CompactButton
- Align relay indicator within footer with symmetric spacing
- Make header and footer full-width with borders and corners
@@ -2277,55 +1363,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Refactor CSS into modular structure
- - Split 3600+ line monolithic `index.css` into organized modules
- - Created `src/styles/` directory with base, layout, components, and utils subdirectories
- - Each file kept under 210 lines for maintainability
- - Preserved cascade order and selector specificity via ordered `@import` statements
- - No functional changes to styling
### Fixed
-- Mobile button positioning now uses safe area insets for symmetrical layout on notched devices
+- Mobile button positioning uses safe area insets for symmetrical layout on notched devices
## [0.5.3] - 2025-10-13
### Changed
-- Relay status indicator is now more compact
- - Smaller padding and font sizes on desktop
- - Auto-collapsed on mobile (icon-only by default, tap to expand)
- - Matches size of sidebar toggle buttons (44px touch target)
- - Hides when scrolling down, shows when scrolling up (consistent with other mobile controls)
+- Relay status indicator is more compact
### Fixed
- Invalid bookmarks without IDs no longer appear in bookmark list
- - Previously showed as "Now" timestamp with no content
- - Bookmarks without valid IDs are now filtered out entirely
- - Use bookmark's original timestamp instead of always generating new ones
-- Profile icon size when logged out now matches other icon buttons in sidebar header
+- Profile icon size when logged out matches other icon buttons in sidebar header
## [0.5.2] - 2025-10-12
### Added
- Three-dot menu to highlight cards for more compact UI
- - Combines "Open on Nostr" and "Delete" actions into dropdown menu
- - Uses horizontal ellipsis icon (⋯)
- - Click-outside functionality to close menu
### Changed
- Switch Nostr gateway from njump.me/search.dergigi.com to ants.sh
- - Centralized gateway URLs in config file
- - All profile and event links now use ants.sh
- - Automatic detection of identifier type (profile vs event) for proper routing
-- Remove loading text from Explore and Me pages (spinner only)
-- "Open on Nostr" now links to the highlight event itself instead of the article
+- Remove loading text from Explore and Me pages
+- "Open on Nostr" links to the highlight event itself instead of the article
### Fixed
-- Gateway URL routing for ants.sh requirements (/p/ for profiles, /e/ for events)
+- Gateway URL routing for ants.sh requirements
- Linting errors in HighlightItem component
## [0.5.1] - 2025-10-12
@@ -2333,15 +1401,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Highlight color customization to UI elements
- - Apply user's "my highlights" color to highlight creation buttons
- - Apply highlight group colors to highlight count indicators
- - Apply "my highlights" color to collapsed highlights panel button
### Fixed
- Highlight count indicator styling to match reading-time element
- Brightness and border styling for highlight count indicator
-- User highlight color now applies to both marker and arrow icons
+- User highlight color applies to both marker and arrow icons
- Highlight group color properly applied to count indicator background
### Removed
@@ -2375,11 +1440,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Performance
-- Local-first then remote follow-up across services (titles, bookmarks, highlights)
+- Local-first then remote follow-up across services
- Run local and remote fetches concurrently; stream and dedupe results
- Stream contacts and early posts from local; merge remote later
- Relay queries use local-first with short timeouts; fallback to remote when needed
-- Stream results to UI; display cached/local immediately (articles, highlights, explore)
+- Stream results to UI; display cached/local immediately
### Documentation
@@ -2391,87 +1456,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Mark as read functionality for articles (NIP-25)
- - Button at the end of each article to mark as read with 📚 emoji
- - Creates kind:7 reactions for nostr-native articles (`/a/` paths)
- - Creates kind:17 reactions for external websites (`/r/` paths)
- - Button shows loading state while publishing reaction
- - Only visible when user is logged in
-- Highlight deletion with confirmation dialog (NIP-09)
- - Small delete button (trash icon) on highlight items
- - Only visible for user's own highlights
- - Confirmation dialog prevents accidental deletions
- - Styled to match relay indicator (subtle, same size)
- - Removes highlights from UI immediately after deletion request
+- Mark as read functionality for articles
+- Highlight deletion with confirmation dialog
- `/my` page showing user's recent highlights
- - Accessible by clicking profile picture in bookmark sidebar
- - Displays all highlights created by the logged-in user
- - Uses same rendering as Settings and Explore pages
- - Includes highlight count in header
- Confirmation dialog component
- - Reusable modal with danger/warning/info variants
- - Backdrop blur effect
- - Mobile-responsive design
- - Prevents accidental destructive actions
### Changed
-- Relay status indicator on mobile now displays in compact mode
- - Shows only airplane icon by default (44x44px touch target)
- - Tap to expand for full connection details
- - Reduces screen clutter on mobile while keeping info accessible
- - Smooth transition between compact and expanded states
- - Desktop view remains unchanged (always shows full details)
+- Relay status indicator on mobile displays in compact mode
## [0.4.2] - 2025-10-11
### Added
-- NIP-19 identifier resolution in article content (NIP-19, NIP-27)
- - Support for `nostr:npub1...`, `nostr:note1...`, `nostr:nprofile1...`, `nostr:nevent1...`, `nostr:naddr1...`
- - Converts nostr: URIs to clickable links with human-readable labels
- - Automatically fetches and displays article titles for `naddr` references
- - Falls back to identifier when title fetch fails
+- NIP-19 identifier resolution in article content
- Auto-hide mobile UI buttons on scroll down
- - Floating bookmark/highlights buttons hide when scrolling down
- - Buttons reappear when scrolling up for distraction-free reading
- - Smooth opacity transitions for better UX
-- Scroll direction detection hook (`useScrollDirection`)
- - Supports both window and element-based scroll detection
- - Configurable threshold and enable/disable options
+- Scroll direction detection hook
### Changed
-- Article references (`naddr`) now link internally to `/a/{naddr}` instead of external njump.me
+- Article references (`naddr`) link internally to `/a/{naddr}` instead of external njump.me
- Sidebar auto-closes on mobile when navigating to content via routes
- - Handles clicking on blog posts in Explore view
- - Complements existing sidebar auto-close for bookmarks
-- Markdown processing now async to support article title resolution
+- Markdown processing async to support article title resolution
- Article title resolution fetches titles in parallel for better performance
### Fixed
-- Mobile button scroll detection now correctly monitors main pane element
- - Previously monitored window scroll which didn't work on mobile
- - Content scrolls within `.pane.main` div on mobile devices
+- Mobile button scroll detection correctly monitors main pane element
- All ESLint warnings and TypeScript type errors resolved
- - Added react-hooks plugin to ESLint configuration
- - Fixed exhaustive-deps warnings in components
- - Added block scoping to switch case statements
- - Corrected type references for nostr-tools decode result
## [0.4.1] - 2025-10-10
### Fixed
- Long article summaries overlapping with hero image content on mobile devices
-- Article summary now moves below hero image on mobile when longer than 150 characters
+- Article summary moves below hero image on mobile when longer than 150 characters
- Article summary line clamp reduced from 3 to 2 lines on mobile for better space utilization
### Changed
-- Hero image rendering on mobile now uses zoom-to-fit approach with viewport-based sizing
-- Hero image height on mobile set to 50vh (constrained between 280px-400px)
+- Hero image rendering on mobile uses zoom-to-fit approach with viewport-based sizing
+- Hero image height on mobile set to 50vh
- Improved image cropping with center positioning for better visual presentation
- Optimized reader header overlay padding and title sizing on mobile
@@ -2480,21 +1505,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Mobile-responsive design with overlay sidebar drawer
-- Media query hooks for responsive behavior (`useIsMobile`, `useIsTablet`, `useIsCoarsePointer`)
+- Media query hooks for responsive behavior
- Auto-collapse sidebar setting for mobile devices
- Touch-optimized UI with 44x44px minimum touch targets
- Safe area inset support for notched devices
- Mobile hamburger menu and backdrop
- Focus trap in mobile sidebar with ESC key support
- Body scroll locking when mobile sidebar is open
-- Mobile-optimized modals (full-screen sheet style)
-- Mobile-optimized toast notifications (bottom position)
-- Dynamic viewport height support (100dvh)
+- Mobile-optimized modals
+- Mobile-optimized toast notifications
+- Dynamic viewport height support
- Mobile highlights panel as overlay with toggle button
### Changed
-- Sidebar now displays as overlay drawer on mobile (≤768px)
+- Sidebar displays as overlay drawer on mobile
- Highlights panel hidden on mobile for better content focus
- Sidebar auto-closes when selecting content on mobile
- Hover effects disabled on touch devices
@@ -2514,19 +1539,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
-- Add vercel.json configuration to properly handle SPA routing on Vercel deployments (fixes 404 errors on page refresh)
+- Add vercel.json configuration to properly handle SPA routing on Vercel deployments
## [0.3.7] - 2025-10-10
### Fixed
-- Logout button functionality - now properly clears active account using clearActive() method
+- Logout button functionality
## [0.3.6] - 2025-10-10
### Added
-- Compact date format for highlights (now, 5m, 3h, 2d, 1mo, 1y)
+- Compact date format for highlights
- Ultra-compact date format for bookmarks sidebar
- Encode event links as nevent/naddr per NIP-19 for better client compatibility
- Render /explore within ThreePaneLayout to keep side panels visible
@@ -2547,7 +1572,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Make connecting notification more subtle with muted blue background
- Update Boris pubkey for zap splits to npub19802see0gnk3vjlus0dnmfdagusqrtmsxpl5yfmkwn9uvnfnqylqduhr0x
-- Update domain references to read.withboris.com (URLs, SEO metadata, and documentation)
+- Update domain references to read.withboris.com
## [0.3.5] - 2025-10-09
@@ -2573,14 +1598,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Service Worker for robust offline image caching
- /explore route to discover blog posts from friends on Nostr
- Explore button (newspaper icon) in bookmarks header
-- "Connecting" status indicator on page load (instead of immediately showing "Offline")
+- "Connecting" status indicator on page load
- Last fetch time display with relative timestamps in bookmarks list
### Changed
- Simplify image caching to use Service Worker transparently
- Move refresh button from top bar to end of bookmarks list
-- Make explore page article cards proper links (supports CMD+click to open in new tab)
+- Make explore page article cards proper links
- Reorganize bookmarks UI for better UX
### Fixed
@@ -2597,13 +1622,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Flight Mode with offline highlight creation and local relay support
-- Automatic offline sync - rebroadcast local events when back online
+- Automatic offline sync
- Relay indicator icon on highlight items showing sync status
- Click-to-rebroadcast functionality for highlights
- Flight mode indicator (plane icon) on offline-created highlights
- Relay rebroadcast settings for caching and propagation
- Local relay status indicator for local-only/offline mode
-- Second local relay support (localhost:4869)
+- Second local relay support
- Relay connection status tracking and display
- 6th font size option for better UI scaling
@@ -2693,7 +1718,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Web bookmark creation (NIP-B0, kind:39701)
+- Web bookmark creation
- Tags support for web bookmarks per NIP-B0
- Auto-fetch title and description when URL is pasted
- Prioritize OpenGraph tags for metadata extraction
@@ -2757,7 +1782,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Cleanup after build fixes (remove shims, update locks)
+- Cleanup after build fixes
- Stop tracking node_modules/dist
- Update dependencies and dedupe
- Add .gitignore for node_modules and dist
@@ -2784,7 +1809,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Support for web bookmarks (NIP-B0, kind:39701)
+- Support for web bookmarks
- Default highlight visibility settings
- Proxy.nostr-relay.app relay to configuration
- Comprehensive logging to settings service
@@ -2809,7 +1834,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Optimistic updates for highlight creation
- Enable highlight creation from external URLs
- Add routing support for external URLs
-- Add context to highlights (previous and next sentences)
+- Add context to highlights
- Boris branding to highlight alt tag
### Fixed
@@ -2822,13 +1847,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Remove dedicated login page, handle login through main UI
-- Simplify to single RELAYS constant (DRY)
+- Simplify to single RELAYS constant
## [0.2.0] - 2025-10-05
### Added
-- Simple highlight creation feature (FAB style)
+- Simple highlight creation feature
- Reset to defaults button in settings
- Load and apply settings upon login
@@ -2856,7 +1881,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Display article immediately without waiting for highlights to load
- Show highlights immediately when opening panel if already loaded
- Prevent bookmark text from being cut off in compact view
-- Correct default highlight color for 'mine' to yellow (#ffff00)
+- Correct default highlight color for 'mine' to yellow
### Changed
@@ -2867,7 +1892,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Three-level highlight system (mine/friends/nostrverse)
+- Three-level highlight system
### Fixed
@@ -2912,7 +1937,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Show highlights for nostr articles by skipping URL filter
-- Refresh button now works without login for article highlights
+- Refresh button works without login for article highlights
- Query highlights using both a-tag and e-tag
### Changed
@@ -2923,12 +1948,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
-- Native support for rendering Nostr long-form articles (NIP-23)
+- Native support for rendering Nostr long-form articles
- Display article titles for kind:30023 bookmarks
- Enable clicking on kind:30023 articles to open in reader
- Display article hero images in bookmark views and reader
- Configurable highlight colors
-- Highlight style setting (marker & underline)
+- Highlight style setting
### Fixed
@@ -2939,7 +1964,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Integrate long-form article rendering into existing reader view
- Extract components to keep files under 210 lines
-- Make font size and color buttons match icon button size (33px)
+- Make font size and color buttons match icon button size
## [0.1.5] - 2025-10-03
@@ -3043,7 +2068,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Use IconButton for all icon-only actions to enforce square sizing
-- Sort bookmarks by added_at (recently added first)
+- Sort bookmarks by added_at
- Make kind icon square to match IconButton sizing
- Remove colored borders and gradients; keep neutral cards
@@ -3055,7 +2080,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- ContentPanel component to render readable HTML
- Lightweight readability fetcher via r.jina.ai proxy
- Markdown rendering support with react-markdown and remark-gfm
-- READ NOW button to bookmark cards
+- READ button to bookmark cards
- Spinner to content loading state
- FontAwesome icons for event kinds
@@ -3087,7 +2112,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Sort individual bookmarks by timestamp (newest first)
+- Sort individual bookmarks by timestamp
- Increase bookmark loading timeout by 2x
- Extract helpers and event processing
@@ -3104,7 +2129,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Properly configure browser extension signer
-- Aggregate list(10003) + set(30001)
+- Aggregate list
- Handle applesauce bookmark structure correctly
- Resolve loading state stuck issue
@@ -3130,91 +2155,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Migrate to applesauce-accounts for proper account management
- Use proper applesauce-loaders for NIP-51 bookmark fetching
- Optimize relay usage following applesauce-relay best practices
-- Use applesauce-react event models for better profile handling
-
-[Unreleased]: https://github.com/dergigi/boris/compare/v0.10.12...HEAD
-[0.10.12]: https://github.com/dergigi/boris/compare/v0.10.11...v0.10.12
-[0.10.11]: https://github.com/dergigi/boris/compare/v0.10.10...v0.10.11
-[0.10.10]: https://github.com/dergigi/boris/compare/v0.10.9...v0.10.10
-[0.10.9]: https://github.com/dergigi/boris/compare/v0.10.8...v0.10.9
-[0.10.8]: https://github.com/dergigi/boris/compare/v0.10.7...v0.10.8
-[0.10.7]: https://github.com/dergigi/boris/compare/v0.10.6...v0.10.7
-[0.10.6]: https://github.com/dergigi/boris/compare/v0.10.5...v0.10.6
-[0.10.5]: https://github.com/dergigi/boris/compare/v0.10.4...v0.10.5
-[0.10.4]: https://github.com/dergigi/boris/compare/v0.10.3...v0.10.4
-[0.10.3]: https://github.com/dergigi/boris/compare/v0.10.2...v0.10.3
-[0.10.2]: https://github.com/dergigi/boris/compare/v0.10.1...v0.10.2
-[0.10.1]: https://github.com/dergigi/boris/compare/v0.10.0...v0.10.1
-[0.10.0]: https://github.com/dergigi/boris/compare/v0.9.1...v0.10.0
-[0.9.1]: https://github.com/dergigi/boris/compare/v0.9.0...v0.9.1
-[0.8.3]: https://github.com/dergigi/boris/compare/v0.8.2...v0.8.3
-[0.8.2]: https://github.com/dergigi/boris/compare/v0.8.0...v0.8.2
-[0.8.0]: https://github.com/dergigi/boris/compare/v0.7.4...v0.8.0
-[0.7.4]: https://github.com/dergigi/boris/compare/v0.7.3...v0.7.4
-[0.7.3]: https://github.com/dergigi/boris/compare/v0.7.2...v0.7.3
-[0.7.2]: https://github.com/dergigi/boris/compare/v0.7.0...v0.7.2
-[0.7.0]: https://github.com/dergigi/boris/compare/v0.6.24...v0.7.0
-[0.6.24]: https://github.com/dergigi/boris/compare/v0.6.23...v0.6.24
-[0.6.23]: https://github.com/dergigi/boris/compare/v0.6.22...v0.6.23
-[0.6.21]: https://github.com/dergigi/boris/compare/v0.6.20...v0.6.21
-[0.6.20]: https://github.com/dergigi/boris/compare/v0.6.19...v0.6.20
-[0.6.19]: https://github.com/dergigi/boris/compare/v0.6.18...v0.6.19
-[0.6.18]: https://github.com/dergigi/boris/compare/v0.6.17...v0.6.18
-[0.6.17]: https://github.com/dergigi/boris/compare/v0.6.16...v0.6.17
-[0.6.16]: https://github.com/dergigi/boris/compare/v0.6.15...v0.6.16
-[0.6.15]: https://github.com/dergigi/boris/compare/v0.6.14...v0.6.15
-[0.6.14]: https://github.com/dergigi/boris/compare/v0.6.13...v0.6.14
-[0.6.13]: https://github.com/dergigi/boris/compare/v0.6.12...v0.6.13
-[0.6.12]: https://github.com/dergigi/boris/compare/v0.6.11...v0.6.12
-[0.6.11]: https://github.com/dergigi/boris/compare/v0.6.10...v0.6.11
-[0.6.10]: https://github.com/dergigi/boris/compare/v0.6.9...v0.6.10
-[0.6.9]: https://github.com/dergigi/boris/compare/v0.6.8...v0.6.9
-[0.6.8]: https://github.com/dergigi/boris/compare/v0.6.7...v0.6.8
-[0.6.7]: https://github.com/dergigi/boris/compare/v0.6.6...v0.6.7
-[0.6.6]: https://github.com/dergigi/boris/compare/v0.6.5...v0.6.6
-[0.6.5]: https://github.com/dergigi/boris/compare/v0.6.4...v0.6.5
-[0.6.4]: https://github.com/dergigi/boris/compare/v0.6.3...v0.6.4
-[0.6.3]: https://github.com/dergigi/boris/compare/v0.6.2...v0.6.3
-[0.6.2]: https://github.com/dergigi/boris/compare/v0.6.1...v0.6.2
-[0.6.1]: https://github.com/dergigi/boris/compare/v0.6.0...v0.6.1
-[0.6.0]: https://github.com/dergigi/boris/compare/v0.5.7...v0.6.0
-[0.5.7]: https://github.com/dergigi/boris/compare/v0.5.6...v0.5.7
-[0.5.6]: https://github.com/dergigi/boris/compare/v0.5.5...v0.5.6
-[0.5.5]: https://github.com/dergigi/boris/compare/v0.5.4...v0.5.5
-[0.5.2]: https://github.com/dergigi/boris/compare/v0.5.1...v0.5.2
-[0.5.1]: https://github.com/dergigi/boris/compare/v0.5.0...v0.5.1
-[0.5.0]: https://github.com/dergigi/boris/compare/v0.4.3...v0.5.0
-[0.4.0]: https://github.com/dergigi/boris/compare/v0.3.8...v0.4.0
-[0.3.8]: https://github.com/dergigi/boris/compare/v0.3.7...v0.3.8
-[0.3.7]: https://github.com/dergigi/boris/compare/v0.3.6...v0.3.7
-[0.3.6]: https://github.com/dergigi/boris/compare/v0.3.5...v0.3.6
-[0.3.5]: https://github.com/dergigi/boris/compare/v0.3.4...v0.3.5
-[0.3.4]: https://github.com/dergigi/boris/compare/v0.3.3...v0.3.4
-[0.3.3]: https://github.com/dergigi/boris/compare/v0.3.2...v0.3.3
-[0.3.0]: https://github.com/dergigi/boris/compare/v0.2.10...v0.3.0
-[0.2.10]: https://github.com/dergigi/boris/compare/v0.2.9...v0.2.10
-[0.2.9]: https://github.com/dergigi/boris/compare/v0.2.8...v0.2.9
-[0.2.8]: https://github.com/dergigi/boris/compare/v0.2.7...v0.2.8
-[0.2.7]: https://github.com/dergigi/boris/compare/v0.2.6...v0.2.7
-[0.2.6]: https://github.com/dergigi/boris/compare/v0.2.5...v0.2.6
-[0.2.5]: https://github.com/dergigi/boris/compare/v0.2.4...v0.2.5
-[0.2.4]: https://github.com/dergigi/boris/compare/v0.2.3...v0.2.4
-[0.2.3]: https://github.com/dergigi/boris/compare/v0.2.2...v0.2.3
-[0.2.2]: https://github.com/dergigi/boris/compare/v0.2.1...v0.2.2
-[0.2.1]: https://github.com/dergigi/boris/compare/v0.2.0...v0.2.1
-[0.2.0]: https://github.com/dergigi/boris/compare/v0.1.11...v0.2.0
-[0.1.11]: https://github.com/dergigi/boris/compare/v0.1.10...v0.1.11
-[0.1.10]: https://github.com/dergigi/boris/compare/v0.1.9...v0.1.10
-[0.1.9]: https://github.com/dergigi/boris/compare/v0.1.8...v0.1.9
-[0.1.8]: https://github.com/dergigi/boris/compare/v0.1.7...v0.1.8
-[0.1.7]: https://github.com/dergigi/boris/compare/v0.1.6...v0.1.7
-[0.1.6]: https://github.com/dergigi/boris/compare/v0.1.5...v0.1.6
-[0.1.5]: https://github.com/dergigi/boris/compare/v0.1.4...v0.1.5
-[0.1.4]: https://github.com/dergigi/boris/compare/v0.1.3...v0.1.4
-[0.1.3]: https://github.com/dergigi/boris/compare/v0.1.2...v0.1.3
-[0.1.2]: https://github.com/dergigi/boris/compare/v0.1.1...v0.1.2
-[0.1.1]: https://github.com/dergigi/boris/compare/v0.1.0...v0.1.1
-[0.1.0]: https://github.com/dergigi/boris/compare/v0.0.3...v0.1.0
-[0.0.3]: https://github.com/dergigi/boris/compare/v0.0.2...v0.0.3
-[0.0.2]: https://github.com/dergigi/boris/compare/v0.0.1...v0.0.2
-[0.0.1]: https://github.com/dergigi/boris/releases/tag/v0.0.1
+- Use applesauce-react event models for better profile handling
\ No newline at end of file