Add protocol support and UI rendering for NIP-87 which defines ecash
mint discovery via three event kinds: MintRecommendationEvent (38000),
CashuMintEvent (38172), and FedimintEvent (38173).
https://claude.ai/code/session_01JR2nFVPjPGG9jTV4Qq2PUW
Changes memberPubKey() to memberPubKeys() returning a list of all p tags
in RelayAddMemberEvent and RelayRemoveMemberEvent. Updates renderers to
display multiple members. Adds NIP-43 event rendering to ThreadFeedView
(NoteMaster) alongside NoteCompose.
https://claude.ai/code/session_01PRqe4bBCb9u62oPh8u9sHx
- Extract private log() helper in JVM and iOS PlatformLog to reduce
copy-paste branching
- Fix JVM formatter to be private and non-nullable
- Convert 60+ interpolated Log.w/e/i calls to lambda overloads,
including hot-path Filter.kt toJson() and LocalCache event processing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Defers string construction until after the level check, avoiding
allocation when debug logging is filtered in release/benchmark builds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add optional throwable parameter to d() and i() across all platforms
- Add inline lambda overloads for all log levels to defer message
construction, avoiding string allocation when level is filtered
- Restore VoiceMessagePreview to pass throwable directly
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Set Log.minLevel based on BuildConfig.DEBUG in Amethyst.kt init
- Set Log.minLevel = DEBUG in Desktop Main.kt
- Migrate VideoCompressionHelper to quartz Log + LogLevel enum
- Migrate VoiceAnonymizer, VoiceMessagePreview, LiveStatusIndicator to quartz Log
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implements the NIP-60 specification for cashu-based wallets with four event types:
- CashuWalletEvent (kind:17375) - replaceable wallet definition with encrypted mints/privkey
- CashuTokenEvent (kind:7375) - unspent cashu proofs with NIP-44 encrypted JSON content
- CashuSpendingHistoryEvent (kind:7376) - transaction history with encrypted tag array
- CashuMintQuoteEvent (kind:7374) - optional mint quote state with NIP-40 expiration
Follows the same structural patterns as the NIP-88 polls implementation.
https://claude.ai/code/session_018UfHPzrQCAFMwB1zB1ftDM
- Replace 6 regex operations in Url.removeDotSegments() with simple
string operations (startsWith/indexOf) using a when-expression
- Remove regex-based dropLastSegment() in favor of StringBuilder with
lastIndexOf
- Extract duplicated hex/octal/decimal parsing in DomainNameReader
into shared parseNumericLiteral() helper
- Deduplicate scheme matching by unifying findValidScheme* methods
into findSchemeSuffix() using regionMatches (avoids lowercase allocation)
- Extract readPath() validity check into isPathValid() to remove
duplicated 5-line condition
- Extract trySchemeNoSlashesOrUserPass() from readScheme() to
eliminate duplicated branch logic
- Restructure readCurrent() with when-expression and extract
resetDomainCounters() helper
https://claude.ai/code/session_017oGieyaUiLCxehNJ5aMFDK
Adds full NIP-43 support with Quartz event classes (kinds 13534, 8000,
8001, 28934, 28935, 28936) following the nip88Polls structure pattern.
Includes relay membership list screen with join/leave actions and
NoteCompose rendering for NIP-43 events in the feed.
https://claude.ai/code/session_01PRqe4bBCb9u62oPh8u9sHx
* 'main' of https://github.com/vitorpamplona/amethyst:
fix: keep screen on during PiP playback and survive screen lock
feat: add RelayDiscoveryEvent renderer for feed display
feat: add OpenGraph preview to WebBookmark cards
revert: keep INostrClient/NostrClient naming and restore onEose/isLive
refactor: simplify NostrClient API for beginner-friendliness