Files
amethyst/docs/brainstorms/2026-03-19-dm-encryption-badge-brainstorm.md
T
Claude f72388a559 refactor: rename packages, helpers and app code after the NIP event renames
Follow-up to the event class renames: the names around those classes now
match too.

Quartz (published API, every old name kept as a @Deprecated alias/forwarder):
- nip51Lists packages moved: followList -> starterPack, hashtagList -> interestList,
  peopleList -> followSet, labeledBookmarkList -> bookmarkSet. The old packages
  keep a Deprecated.kt with typealiases and forwarding extension functions
  (ReplaceWith points at the new package).
- LnZapPrivateEvent -> PrivateZapEvent, LnZapReceiptValidator -> ZapReceiptValidator,
  ChannelListDiff -> PublicChatListDiff, HashtagListDiff -> InterestListDiff.
- Kind 30063 now indexes NIP-82 release notes for search (never NIP-51 content,
  which can hold encrypted private items). searchable-events docs updated.

App code (amethyst, commons, desktopApp, cli; no aliases needed):
- model packages nip51Lists.{hashtagLists,peopleList,labeledBookmarkLists,relayFeeds}
  -> {interestLists,followSets,bookmarkSets,favoriteRelays}.
- State/cache/UI names derived from the old event names: HashtagListState ->
  InterestListState, PeopleListsState -> FollowSetsState, FollowListsState ->
  StarterPacksState, LabeledBookmarkList -> BookmarkSet, RelayFeedListState ->
  FavoriteRelayListState, ContactCardsState -> UserAssertionsState, NIP90* view
  models/renderers -> Dvm*, LnZap* handlers -> Zap*, SealedRumor* -> Seal*, and
  Account.peopleLists/followLists/hashtagList -> followSets/starterPacks/interestList.
- String literals were left untouched, so preference keys and @SerialName values
  stored on disk are unchanged.
- The generic PeopleList UI model (shared by follow sets and starter packs) and the
  EmojiPackSelection route (which shows a kind 30030 pack) keep their names.

Docs: plans, brainstorms, changelogs, skills and READMEs use the new names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015VvJ8XpeYqBe8bYT3bJ7UD
2026-09-26 20:56:07 +00:00

1.7 KiB

Brainstorm: Per-Message Encryption Badge in DMs

Date: 2026-03-19 Status: Ready for implementation

What We're Building

Per-message encryption indicator in DM chat bubbles — lock icon (NIP-17) or lock-open icon (NIP-04) next to the timestamp. Matches Android's approach with incognito badges.

Why This Approach

Users need to know which messages are truly private (NIP-17: relay can't see sender/recipient) vs legacy encrypted (NIP-04: relay sees metadata). Android already does this with incognito badges. Desktop uses lock/lock-open icons (already imported in ChatPane) for consistency with the existing NIP-17 toggle.

Key Decisions

Decision Choice Rationale
Indicator type Lock icon per message Matches existing lock icon pattern in desktop NIP-17 toggle
NIP-17 icon Lock (filled) in primary color Private, secure
NIP-04 icon LockOpen in muted gray Legacy, weaker privacy
Placement Next to timestamp in detailRow Matches Android's IncognitoBadge placement
Tooltip None (match Android) Keep it subtle, not alarming

Implementation

The badge goes in MessageWithReactions in ChatPane.kt, in the detailRow slot of ChatMessageCompose. Check note.event type:

  • is EncryptedDmEvent → NIP-04 → lock-open gray
  • is ChatMessageEvent or is ChatMessageEncryptedFileHeaderEvent → NIP-17 → lock primary
  • else → no badge

Key Finding: NIP-04 + NIP-17 Messages Merge

For 1-on-1 chats, both protocols produce identical ChatroomKey({otherPubkey}). Messages from both protocols appear in the same conversation. The per-message badge is the only way to tell them apart.