Reference document for Nostr protocol implementation across Culture Bridge pages and features.
| Page/Feature | NIP-01 | NIP-05 | NIP-07 | NIP-09 | NIP-17 | NIP-23 | NIP-33 | NIP-44 | NIP-78 | NIP-94 | Blossom | Kind 0 | Kind 1 | Kind 5 | Kind 14 | Kind 1059 | Kind 10063 | Kind 24242 | Kind 30023 | Kind 30078 | Status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sign Up | ✅ Basic events | ❌ | ✅ Signer auth | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Avatar upload | ✅ Profile create | ✅ Welcome note | ❌ | ❌ | ❌ | ❌ | ✅ Upload auth | ❌ | ❌ | Production |
| Sign In | ✅ Basic events | ❌ | ✅ Dual auth | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Profile fetch | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Production |
| Profile | ✅ Event structure | ✅ DNS verification | ✅ Read/write | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Image upload | ✅ Profile metadata | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Upload auth | ❌ | ❌ | Production |
| Messages | ✅ Event queries | ✅ Fallback names | ✅ Signing DMs | ❌ | ✅ Gift wraps | ❌ | ❌ | ✅ Encryption | ❌ | ✅ Attachments | ✅ Media upload | ✅ Name resolution | ❌ | ❌ | ✅ Rumor events | ✅ Encrypted DMs | ❌ | ✅ Upload auth | ❌ | ❌ | Production |
| Shop | ✅ Event publishing | ❌ | ✅ Product signing | ✅ Delete products | ❌ | ✅ Product content | ✅ dTag identity | ❌ | ❌ | ✅ imeta tags | ✅ Image upload | ❌ | ❌ | ✅ Product deletion | ❌ | ❌ | ✅ Server list | ✅ Upload auth | ✅ Product events | ❌ | Production |
| My Shop | ✅ Event queries | ❌ | ✅ Edit/delete | ✅ Delete products | ❌ | ✅ Content updates | ✅ Replace events | ❌ | ❌ | ✅ imeta tags | ✅ Image upload | ❌ | ❌ | ✅ Product deletion | ❌ | ❌ | ✅ Server list | ✅ Upload auth | ✅ Product CRUD | ❌ | Production |
| Cart | ✅ Event queries | ❌ | ✅ Cart signing | ❌ | ❌ | ❌ | ✅ Cart identity | ❌ | ✅ App data | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Cart storage | Production |
| Heritage | ✅ Event publishing | ❌ | ✅ Content signing | ✅ Delete content | ❌ | ✅ Story content | ✅ dTag identity | ❌ | ❌ | ✅ imeta tags | ✅ Media upload | ❌ | ❌ | ✅ Content deletion | ❌ | ❌ | ✅ Server list | ✅ Upload auth | ✅ Heritage events | ❌ | Production |
| My Contributions | ✅ Event queries | ❌ | ✅ Read access | ❌ | ❌ | ✅ Content fetch | ✅ Filter by dTag | ❌ | ❌ | ✅ Media display | ✅ Media display | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ User content | ❌ | Production |
| Explore | ✅ Event queries | ❌ | ❌ | ❌ | ❌ | ✅ Content display | ✅ Query by tags | ❌ | ❌ | ✅ Media display | ✅ Media display | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ Public content | ❌ | Production |
| Analytics | ✅ Event logging | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Production |
| Elder Voices | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Static Data |
| Exhibitions | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | Static Data |
- NIP-01: Basic protocol - event structure, signing, IDs, relay communication ✅
- NIP-05: DNS-based verification -
alice@example.comidentifiers ✅ - NIP-07: Browser extension signer -
window.nostrinterface (Alby, nos2x, Nos2x-Fox) + nsec storage fallback ✅ - NIP-09: Event deletion - Kind 5 deletion events for removing content ✅
- NIP-17: Private DMs - gift-wrapped encrypted messages (double encryption) ✅
- NIP-23: Long-form content - articles, blog posts (markdown) ✅
- NIP-33: Parameterized replaceable events - unique dTag, update-in-place ✅
- NIP-44: Encrypted payloads (v2) - ChaCha20 + HMAC-SHA256 for NIP-17 encryption ✅
- NIP-78: Application-specific data - parameterized replaceable app data (cart storage) ✅
- NIP-94: File metadata - imeta tags with URL, MIME type, SHA-256, dimensions ✅
- Blossom: Decentralized CDN - media hosting with Nostr auth, SHA-256 verification ✅
- Kind 0: User metadata - profile info (name, display_name, about, picture, banner, website, nip05, lud16, lud06, bot, birthday) ✅
- Kind 1: Short text note - public posts, welcome messages, status updates ✅
- Kind 5: Event deletion - NIP-09 deletion events that reference events to delete ✅
- Kind 14: Rumor - unsigned event wrapped in NIP-17 gift-wrapped messages (internal to encryption flow) ✅
- Kind 1059: Gift wrap - encrypted outer layer for NIP-17 DMs (double-wrapped encryption with ephemeral keys) ✅
- Kind 10063: User server list - Blossom CDN server discovery for file hosting ✅
- Kind 24242: Blossom authorization - signed auth events for Blossom file uploads ✅
- Kind 30023: Long-form content - parameterized replaceable articles (products, heritage, stories) ✅
- Kind 30078: Application-specific data - parameterized replaceable app data (cart storage, user preferences) ✅
- Generates Nostr keypair (nsec/npub) via
nostr-tools - Publishes Kind 0 profile metadata to configured relays
- Publishes Kind 1 welcome note for verification (silent)
- Blossom avatar upload with Kind 24242 authorization
- Creates encrypted backup file with profile and keys
- Clears nsec from memory after backup creation
- Uses temporary signer during sign-up flow
- Dual Authentication System:
- NIP-07 Browser Extensions (Alby, nos2x, Nostore) - Primary method
- nsec Storage (Zustand persisted) - Fallback for mobile/extension-less users
- Priority: nsec in store → Browser extension → Prompt for nsec input
- Fetches Kind 0 profile on login
- Stores pubkey, npub, and signer in auth state (Zustand)
- signerFactory.ts creates NIP-07-compatible signer from nsec
- Message cache initialization on successful sign-in
- Cart synchronization from relays on sign-in
- Publishes Kind 0 metadata events to Nostr relays
- Real-time NIP-05 DNS verification with status badges
- NIP-07 browser extension for signing profile updates
- Blossom CDN for profile picture and banner images
- Image cropping with react-easy-crop (1:1 and 3:1 aspect ratios)
- Field-level validation (display_name, about, website, birthday, lud16, lud06, nip05)
- Multi-relay publishing with success/failure tracking
- State propagation via auth store to all components
- NIP-17 gift-wrapped DMs (double-wrapped encryption)
- NIP-44 encryption (ChaCha20 + HMAC-SHA256) for message payloads
- Kind 14 rumor events (unsigned, encrypted in seal)
- Kind 1059 gift wrap events (seal + outer wrap)
- NIP-05 fallback for missing names
- Message Attachments: Images, videos, audio via Blossom uploads with NIP-94 imeta tags
- Conversation context with image thumbnails (product/heritage references)
- Background profile refresh from cache
- IndexedDB cache with AES-GCM encryption for messages and conversations
- ProfileCacheService - 7-day TTL, persistent across sessions, LRU eviction at 1000 entries
- MessageCacheService - 30-day TTL, encrypted conversation/message storage
- AdaptiveSync - Dynamic polling intervals (1-10 minutes) based on message activity
- Duplicate message deduplication via processedMessageIds ref (prevents cache+subscription double processing)
- Self-message filtering (sender === recipient) to prevent invalid conversations
- Cache migration system for data cleanup (removes pre-fix invalid conversations on init)
- Kind 30023 parameterized replaceable events
- NIP-33 dTag for product identity (
product-{timestamp}-{random}) - NIP-23 markdown content structure
- NIP-09 deletion support via Kind 5 events
- NIP-94 imeta tags for media metadata (URL, MIME, SHA-256, dimensions)
- Blossom for product images/media (sequential upload, retry logic, progress tracking)
- Kind 24242 Blossom authorization for uploads
- Kind 10063 server list for CDN discovery
- Multiple attachments support (up to 5 files, 100MB each, 500MB total)
- System tags:
ttag forculture-bridge-shop,pricetag,currencytag - User tags: Custom product categorization
- Kind 30023 for stories/artifacts
- NIP-33 dTag persistence (
contribution-{timestamp}-{random}) - NIP-23 markdown formatting
- NIP-09 deletion support via Kind 5 events
- NIP-94 imeta tags for multi-media metadata
- Blossom multi-media uploads (images, video, audio)
- Kind 24242 Blossom authorization for uploads
- Kind 10063 server list for CDN discovery
- System tags:
ttag forculture-bridge-heritage,categorytag (e.g., Tradition, Art, Story) - Auto-redirect after successful publication (1 second delay)
- Categories via
#ttags
- NIP-01 relay queries with filters
- Filter by
kinds: [30023] - Filter by
#ttags (categories:culture-bridge-shop,culture-bridge-heritage) - Filter by author pubkey for user-specific content
- Public content access (no auth required for Explore)
- Authenticated queries for My Contributions
-
NIP-78 application-specific data storage (Kind 30078)
-
NIP-33 parameterized replaceable events with
d-tag: "culture-bridge-settings" -
Multi-layer synchronization:
- Local state (Zustand with computed values: itemCount, totalSats)
- localStorage persistence
- Nostr relay synchronization (debounced)
-
Cart event structure:
{ "kind": 30078, "tags": [ ["d", "culture-bridge-settings"], ["t", "culture-bridge"], ["p", "<user-pubkey>"] ], "content": { "name": "Culture Bridge Settings", "version": "1.0", "data": { "cart": [...items] } } } -
CartRelayService - Dedicated service for cart-relay operations
-
useCartSync hook - Automatic background synchronization
-
On sign-in: Fetch from relays → Merge with local cart
-
On logout: Clear cart from relays (publish empty event)
-
Currency conversion logic (BTC, SATS, USD, EUR, GBP)
- Redis/Upstash KV integration for event analytics
- API Routes:
POST /api/log-event- Log event publishing attemptsGET /api/get-user-events?npub=...&page=1&limit=20- User event historyGET /api/get-all-events?page=1&limit=20&eventKind=...- Global event dashboardGET /api/redis-info- Redis metrics and statistics
- Tracked Metadata:
- npub (user identifier)
- eventId (Nostr event ID)
- eventKind (0, 1, 5, 14, 1059, 30023, 30078)
- publishedRelays (successful relays)
- failedRelays (failed relays with reasons)
- timestamp, processing duration, response times
- EventLoggingService - Automatic logging on event publish
- RedisAnalyticsService - Analytics aggregation and reporting
- User event log dashboard at
/user-event-log
Elder Voices and Exhibitions use static data from /src/data/:
- No Nostr event queries
- Pre-configured data objects
- No relay communication
- Client-side filtering and sorting only
- Static route generation at build time
Culture Bridge implements a strict 6-layer architecture with clear separation of concerns:
┌─────────────────────────────────────────┐
│ UI Layer (Pages/Components) │ ← Display only
├─────────────────────────────────────────┤
│ Hook Layer (Custom Hooks) │ ← State management, UI logic
├─────────────────────────────────────────┤
│ Business Service Layer │ ← Orchestration, workflows
├─────────────────────────────────────────┤
│ Event Service Layer (Nostr) │ ← Event creation/formatting
├─────────────────────────────────────────┤
│ Generic Service Layer │ ← Reusable infrastructure
├─────────────────────────────────────────┤
│ Core Service Layer │ ← Logging, caching, KV storage
└─────────────────────────────────────────┘
Layer Responsibilities:
-
Core Services (
src/services/core/):LoggingService- Structured logging (singleton)KVService- Redis/Upstash integrationEventLoggingService- Nostr event analyticsProfileCacheService- User profile caching (IndexedDB)CacheEncryptionService- Encrypted cache storage
-
Generic Services (
src/services/generic/):GenericRelayService- WebSocket relay management (singleton, stateful)GenericEventService- NIP-23 event utilitiesGenericBlossomService- File upload infrastructureGenericMediaService- Media validation and metadataGenericAuthService- Signer detection and authEncryptionService- NIP-04/NIP-44 encryptionCartRelayService- Cart relay synchronization
-
Event Services (
src/services/nostr/):NostrEventService- Facade over GenericRelayService- Creates Kind 30023 (products, heritage)
- Creates Kind 1059 (gift-wrapped messages)
- Creates Kind 30078 (cart/app data)
- Delegates relay operations
-
Business Services (
src/services/business/):AuthBusinessService- Authentication workflowsProfileBusinessService- Profile managementShopBusinessService- Product operationsHeritageContentService- Heritage contributionsMessagingBusinessService- NIP-17 messagingCartBusinessService- Shopping cart logicPurchaseBusinessService- Purchase intentsMediaBusinessService- Multi-file uploadsRedisAnalyticsService- Analytics aggregationMessageCacheService- Message caching
Pattern: Each layer communicates only with adjacent layers. No layer bypassing allowed.
Culture Bridge connects to 8 high-reliability Nostr relays:
-
wss://relay.damus.io (Damus, Global)
- NIPs: 01, 02, 04, 09, 11, 22, 28, 40
- Rate limit: 60 req/min, burst 10
-
wss://relay.snort.social (Snort Social, Global)
- NIPs: 01, 02, 04, 09, 11, 22, 28, 40
- Rate limit: 90 req/min, burst 15
-
wss://relay.nostr.band (Nostr.band, Global)
- NIPs: 01, 11, 15, 20, 33, 45, 50 (search)
- Rate limit: 80 req/min, burst 12
-
wss://relay.primal.net (Primal, Global)
- NIPs: 01, 02, 04, 09, 11, 22, 28, 40
- Rate limit: 100 req/min, burst 15
-
wss://offchain.pub (Offchain Pub, Global)
- NIPs: 01, 02, 04, 09, 11, 22, 28, 40
- Rate limit: 80 req/min, burst 12
-
wss://shu01.shugur.net (Shugur Network, Global)
- NIPs: 01, 02, 03, 04, 09, 11, 15, 16, 17, 20, 22, 23, 24, 25, 26, 28, 33, 40, 42, 44, 45, 47, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 65, 72, 78
- Enterprise-grade HA cluster (35+ NIPs)
- Rate limit: 120 req/min, burst 20
-
wss://relay.0xchat.com (0xchat, Global)
- NIPs: 01, 02, 04, 09, 11, 17, 40, 44, 59
- Dedicated NIP-17 messaging relay
- Rate limit: 100 req/min, burst 15
-
wss://relay.nostr.wirednet.jp (WiredNet, Asia-Pacific)
- NIPs: 01, 02, 04, 09, 11, 15, 40
- Japan-based for APAC coverage
- Rate limit: 100 req/min, burst 15
Publishing Strategy:
- Publish to all 8 relays in parallel
- Retry logic with exponential backoff
- Verification and health tracking
- Success rate monitoring
- Response time analytics
- All Kind 30023 events use
GenericEventService.createNIP23Event() - Kind 1 events created directly for welcome notes (sign-up verification)
- Consistent NIP-33 dTag strategy (
${type}-${timestamp}-${randomHex}) - Event IDs change on updates, dTag persists (parameterized replaceable)
- Auto-tag with
culture-bridge-${category}for filtering (e.g.,culture-bridge-shop,culture-bridge-heritage) - Automatic relay publishing via configured relay set
- Event signing through NIP-07 browser extensions (Alby, nos2x, etc.)
- Blossom sequential upload with progress tracking
- Retry logic with exponential backoff (max 3 attempts per file)
- User consent dialog for multiple file uploads
- SHA-256 hashing and verification via NIP-94 imeta tags
- Multi-file support: Up to 5 files per content piece
- File size limits: 100MB per file, 500MB total per upload session
- Supported formats: Images (JPEG, PNG, WebP, GIF), Video (MP4, WebM), Audio (MP3, OGG, WAV)
- Progress callbacks for real-time UI feedback
- Kind 0 profile metadata (display_name field from event content)
- NIP-05 verification identifier (e.g.,
alice@example.com) - Truncated npub display (UI fallback:
npub1abc...xyz)
- ProfileCacheService - IndexedDB persistent cache with 7-day TTL
- LRU eviction at 1000 entries (prevents unbounded growth)
- In-memory secondary cache (Map) for instant lookups
- Hit rate tracking (62% observed in production)
- PBKDF2 key derivation from npub (100k iterations)
- AES-256-GCM encryption-at-rest
- MessageCacheService - IndexedDB encrypted storage with 30-day TTL
- Caches conversations (metadata, last message, unread count)
- Caches messages (full conversation history)
- Two-tier caching: In-memory Map + IndexedDB
- Encryption using PBKDF2 + AES-GCM (100k iterations)
- Migration system for schema updates and data cleanup
- Automatic TTL-based cleanup on initialization
- AdaptiveSync - Background sync with exponential backoff
- Dynamic polling interval: 1-10 minutes based on activity
- Starts at 1 minute, increases 1.5x on empty syncs
- Resets to 1 minute on new message detection
- Stops on component unmount to prevent resource leaks
- 40s cache validity for conversation lists (in-memory staleness check)
- Background profile refresh for up-to-date user metadata
- Automatic cache clearing on sign-out for security
- Encryption-at-rest prevents casual DevTools browsing
- Never exposes private keys (nsec) to the application
- User confirms each signature request through extension UI
- Sandboxed execution context for secure key storage
- Supports all major extensions: Alby, nos2x, Nostore, Flamingo
- Graceful fallback prompts if no extension detected
- Double gift-wrap pattern: Creates two copies (sender + recipient) for message retrieval
- NIP-44 v2 encryption (ChaCha20-Poly1305 + HKDF-SHA256)
- Ephemeral keys generated for each message (forward secrecy)
- One-time encryption keys prevent retroactive decryption
- Kind 14 rumor (unsigned message) → Kind 1059 seal (encrypted) → Kind 1059 gift wrap (double-encrypted)
- Conversation-level encryption using NIP-44 sealed sender
- Self-healing: Both parties can retrieve full conversation history
- Kind 5 deletion events reference event IDs to delete
- Used for shop product deletion and heritage content removal
- Deletion events published to all configured relays
- Relays honor deletion requests per NIP-09 specification
- Soft-delete pattern: Original events may remain in some relays
- Kind 24242 signed upload authorization events
- Kind 10063 user server list for CDN discovery
- User-specific file namespaces (pubkey-based organization)
- SHA-256 content verification post-upload ensures data integrity
- Server-side signature validation before accepting uploads
- Prevents unauthorized file uploads or modifications
- Modern encryption standard for Nostr (v2, audited by Cure53 Dec 2023)
- Uses ChaCha20-Poly1305 for authenticated encryption
- HKDF-SHA256 for key derivation from ECDH shared secret
- secp256k1 curve for elliptic curve Diffie-Hellman (ECDH)
- Conversation keys derived from sender private key + recipient public key
- Used internally by NIP-17 for gift-wrapped message encryption
- Implemented via nostr-tools library and NIP-07 signer extensions
- NIP-04 interface available in NostrSigner type definition
- Not actively used in production features
- Maintained for potential backward compatibility with legacy DMs
- Modern features use NIP-44 exclusively
- Extensions may provide nip04 methods, but app defaults to NIP-44
- Uses pubkey for key derivation (not nsec, due to NIP-07 security model)
- PBKDF2 key derivation with 100k iterations for brute-force resistance
- AES-256-GCM encryption-at-rest protection for cached data
- Prevents casual browsing via browser DevTools
- Automatic cache clearing on sign-out for multi-user device security
- NIP-11: Relay capability discovery (relay metadata discovery)
- NIP-46: Remote signer protocol (mobile apps, Nostr Connect)
- NIP-65: Relay list metadata (user's preferred relay list)
Current relay configurations include support for additional NIPs not yet utilized:
- NIP-02: Contact list and petnames
- NIP-11: Relay information document (metadata)
- NIP-15: End of stored events notice
- NIP-22: Event created_at limits
- NIP-28: Public chat
- NIP-40: Expiration timestamp
- NIP-59: Gift wrap (infrastructure present)
- Blurhash progressive loading for images
- Video/audio streaming optimization
- IPFS fallback URLs for decentralized media hosting
- Thumbnail generation for video content
- ✅ NIP-05 verification - Real-time DNS verification with verified/unverified badges (implemented 2025-10-06)
- ✅ Lightning addresses - lud16 (modern) and lud06 (LNURL) support (implemented 2025-10-06)
- ✅ Image cropping - react-easy-crop for profile picture and banner (implemented 2025-10-06)
- ✅ Profile cache - ProfileCacheService with 7-day TTL, LRU eviction, 62% hit rate (implemented 2025-10-16)
- WebSocket profile updates - planned
- Elder Voices: Potential migration to Kind 30023 for user-submitted stories
- Exhibitions: Potential migration to Kind 30023 for community-curated exhibitions
- Currently using static data from
/src/data/for curated content
Last Updated: November 25, 2025
Codebase Version: Next.js 15.4.6, TypeScript 5.5.4
Active NIPs: 10 implemented (NIP-01, NIP-05, NIP-07, NIP-09, NIP-17, NIP-23, NIP-33, NIP-44, NIP-78, NIP-94 + Blossom)
Active Event Kinds: 9 kinds (Kind 0, Kind 1, Kind 5, Kind 14, Kind 1059, Kind 10063, Kind 24242, Kind 30023, Kind 30078)
Relays: 8 high-reliability relays (Damus, Snort, Nostr.band, Primal, Offchain, Shugur, 0xchat, WiredNet)
Recent Updates:
- 2025-11-25: Documentation - Comprehensive update with NIP-78, Cart system, SOA architecture, relay configuration, API routes, dual authentication
- 2025-11-25: Documentation - Added 8-relay configuration details, service architecture breakdown, analytics system documentation
- 2025-10-18: Shop - Removed product creation from public /shop page (now browse-only marketplace)
- 2025-10-18: My Shop - Created dedicated /my-shop/create page for product creation
- 2025-10-18: My Shop - Removed non-functional "Show Deleted" and "Refresh" buttons (NIP-09 deletion is relay-side)
- 2025-10-18: Architecture - Enforced dedicated pages pattern: /my-shop (list), /my-shop/create (create), /my-shop/edit/[id] (edit)
- 2025-10-16: Messaging - Fixed duplicate conversation bug (useState → useRef for processedMessageIds Set)
- 2025-10-16: Messaging - Added self-message filter (prevents conversations with self where sender === recipient)
- 2025-10-16: Messaging - Implemented cache migration system (removes invalid pre-fix data on init)
- 2025-10-16: Messaging - ProfileCacheService deployed (7-day TTL, LRU eviction, 62% hit rate)
- 2025-10-16: Messaging - MessageCacheService optimization (two-tier caching, 30-day TTL)
- 2025-10-16: Messaging - AdaptiveSync background polling (1-10 min dynamic intervals)
- 2025-10-16: Performance - Reduced conversation load time from 86s → 35s → 22s (74% improvement)
- 2025-10-12: Code Quality - Completed comprehensive refactoring initiative (17/17 tasks, 100% complete)
- 2025-10-12: Architecture - Documented attachment hook patterns (decorator pattern, when-to-use guidance)
- 2025-10-12: Error Handling - Standardized error handling across 9 hooks (AppError with structured metadata)
- 2025-10-12: Documentation - Added 510+ lines of JSDoc (services, hooks, workflows, architecture patterns)
- 2025-10-12: Cleanup - Removed 270 lines of unused POC code (useMultipleAttachments)
- 2025-10-11: Documentation - Added Kind 1 (welcome note), Sign Up workflow details, NIP-04 legacy support notes
- 2025-10-11: Documentation - Updated relay configurations showing additional NIP support infrastructure
- 2025-10-11: Matrix - Added Sign Up row with full implementation details (Kind 0, Kind 1, Blossom)
- 2025-10-07: Messages - Added conversation context with image thumbnails for product/heritage references
- 2025-10-07: Documentation - Added NIP-09 (deletion), NIP-44 (encryption), Kind 5, Kind 14, Kind 10063, Kind 24242 to implementation matrix
- 2025-10-06: SOA Compliance - Refactored profile page to follow strict Service-Oriented Architecture (hook layer abstraction)
- 2025-10-06: Documentation - Updated NIP implementation matrix with verified codebase data (static vs dynamic content)
- 2025-10-06: Profile page - Added NIP-05 DNS verification, Lightning addresses (lud16/lud06), image cropping
- 2025-10-06: Profile page - Blossom integration for profile picture and banner uploads