Files
amethyst/.claude/skills/account-state/references/account-state-flow.md
T
Claude 60edd473c7 Refreshes .claude/ skill library: fixes stale refs, adds 4 new skills
- Updates CLAUDE.md tech stack to current versions (Compose 1.10.3, Kotlin 2.3.20).
- Reframes kotlin-multiplatform iOS as mature; adds secp256k1-kmp 0.23.0 references.
- Updates desktop-expert Main.kt references (code grew from ~270 to 1341 lines and
  NavigationRail moved to ui/deck/SinglePaneLayout.kt); replaces obsolete
  "hardcoded ctrl = true" anti-pattern note with accurate isMacOS branching.
- Removes compose-desktop.md (superseded by desktop-expert/).
- Adds nostr-expert references: nip19-bech32, event-factory, crypto-and-encryption,
  large-cache. Adds kotlin-expert/common-utilities, compose-expert/rich-text-parsing,
  android-expert/image-loading.
- New skills: account-state (Account + LocalCache), relay-client (subscriptions,
  filter assemblers, preloaders), feed-patterns (FeedFilter + FeedViewModel family),
  auth-signers (NostrSigner across internal / NIP-46 / NIP-55).
2026-04-21 21:00:45 +00:00

4.1 KiB

Account StateFlow Catalog

Account.kt exposes dozens of StateFlow properties that mirror different facets of the current user. This is a map from flow → Nostr kind → model package.

(Flow names are exact as of the current Account.kt; if a flow has been renamed, grep Account.kt for the old name.)

Identity & Contacts

Flow Kind(s) Source Model package
userProfile().liveMetadata 0 MetadataEvent relay model/nip01UserMetadata/
followListFlow 3 ContactListEvent relay model/nip02FollowLists/
followersFlow derived LocalCache scan
muteListFlow 10000 NIP-51 relay model/nip51Lists/
blockListFlow 10000 list variant relay model/nip51Lists/

Relays & Connectivity

Flow Kind Package
relayListFlow 10002 RelayList (NIP-65) model/nip65RelayList/
dmRelayListFlow 10050 model/nip65RelayList/
searchRelayListFlow 10007 model/nip65RelayList/
nip86RelayListFlow NIP-86 relay management model/nip86RelayManagement/
proxyFlow, torStateFlow local preferences model/torState/, AccountSyncedSettings

Content Lists

Flow Kind Package
bookmarkListFlow 10003 model/nip51Lists/
privateBookmarksFlow encrypted list model/nip51Lists/
topNavFeedsFlow custom model/topNavFeeds/
customEmojisFlow 10030 NIP-30 model/nip30CustomEmojis/
marmotGroupsFlow NIP-29 (marmot variant) model/marmot/
nip72CommunitiesFlow 34550 (NIP-72) model/nip72Communities/
nip64ChessFlow NIP-64 chess games model/nip64Chess/

Messaging

Flow Kind Package
dmInboxFlow 14 / 1059 (NIP-17 / gift-wrap) model/nip17Dms/
nwcSettingsFlow NIP-47 wallet connect model/nip47WalletConnect/
paymentTargetsFlow NIP-A3 model/nipA3PaymentTargets/
blossomServersFlow NIP-B7 blossom model/nipB7Blossom/

Settings & UI

Flow Source Package
uiSettingsFlow local model/UiSettings.kt, UiSettingsFlow.kt
antiSpamFilter local model/AntiSpamFilter.kt
privacyOptionsFlow local model/privacyOptions/
trustedAssertionsFlow derived model/trustedAssertions/
defaultZapAmountsFlow, theme, language local preferences AccountSettings.kt, AccountSyncedSettings.kt

Advanced / Derived

Flow Purpose Package
accountsCacheFlow multi-account switcher model/accountsCache/
algoFeedsFlow custom algorithmic feeds model/algoFeeds/
vanishFlow NIP-62 account vanish requests model/nip62Vanish/
nip78AppSpecificFlow NIP-78 app-specific data model/nip78AppSpecific/
serverListFlow media/upload servers model/serverList/

Publishing Mutations

Every flow has a corresponding mutation method on Account that:

  1. Constructs the updated event using a TagArrayBuilder.
  2. Signs through the injected NostrSigner (see auth-signers skill).
  3. Publishes to the appropriate relay set.
  4. Updates the local StateFlow before relay round-trip (optimistic).
  5. Rolls back / reconciles on failure.

Examples of mutation methods (names may vary slightly in current code):

  • follow(pubKey) / unfollow(pubKey)
  • addBookmark(noteId) / removeBookmark(noteId)
  • mute(pubKey) / unmute(pubKey)
  • updateRelayList(...), updateDmRelayList(...)
  • sendPost(...), sendReaction(...), sendZap(...)

When a Flow Doesn't Exist Yet

If you're adding a new NIP that's user-scoped, follow the pattern:

  1. Create model/nipXX…/ with an optional ExtState/builder class.
  2. Add private val _xFlow = MutableStateFlow(initial) + val xFlow: StateFlow<T> = _xFlow.asStateFlow() to Account.
  3. Wire the relay subscription (see relay-client skill).
  4. Add the mutation method that builds, signs, and publishes.
  5. Update persistence if the setting is local-only (AccountSettings.kt).