diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index afcbc220..2eeb8f7b 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -42,7 +42,6 @@
BIP39 seed with the standard BIP84 derivation path. The profile\'s nostr key comes off the same seed, so these 12 words restore both.
Block user
Cancel
- Change account
Chapter detail
Chapter name
Chapter translation
@@ -478,4 +477,8 @@
Preparing profiles…
Starting wallet…
Unlock to continue
+
+ Loading profiles…
+ Switch profile
+ Wallet
diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/ProfilesOf.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/ProfilesOf.kt
new file mode 100644
index 00000000..990ac668
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/repository/ProfilesOf.kt
@@ -0,0 +1,24 @@
+package press.mantra.compose.repository
+
+import com.vitorpamplona.quartz.nip01Core.core.HexKey
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.emitAll
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.flowOf
+import press.mantra.compose.database.model.Profile
+
+/**
+ * The nostr profile of each of [publicKeys], as one map that moves when any of them
+ * does. For the two lists of the device's profiles -- the switcher and the startup
+ * selector -- which show a name and a picture where the device has a kind 0 and the
+ * npub where it does not.
+ */
+fun NostrRepository.observeProfilesOf(publicKeys: Collection): Flow