This document describes the primary peer list UI components that display participants in BitChat: MeshPeerList (Bluetooth mesh), GeohashPeopleList (location channel participants), BridgePeopleList (cross-bridge participants), and GroupChatList (private groups). These views provide real-time visualization of connectivity status, encryption state, favorite relationships, and unread message indicators.
For information about the underlying peer aggregation service, see Peer Discovery and UnifiedPeerService. For details on how peers are resolved across different identity types, see Identity Management and Trust System. For location channel selection UI, see [7.2 Location Channels Sheet].
BitChat displays peers in four distinct contexts, each with its own view component and data source:
| View Component | Context | Data Source | Peer Type |
|---|---|---|---|
MeshPeerList | Mesh channel (#mesh) | PeerListModel | BLE-connected peers and favorites |
GeohashPeopleList | Location channels (#geohash) | PeerListModel | Nostr ephemeral identities in geohash |
BridgePeopleList | Cross-bridge participants | PeerListModel | Peers reached via bridge gateways |
GroupChatList | Private groups | PeerListModel | 16-member private group rosters |
All views implement a stable ordering system to prevent visual flickering when peer lists update.
Sources: bitchat/Views/MeshPeerList.swift4-15 bitchat/Views/GeohashPeopleList.swift3-8 bitchat/Views/GroupChatList.swift6-10
The following diagram illustrates how peer data flows from backend services through PeerListModel and its coordinators to the UI components:
Title: Peer Data Flow and Coordinator Architecture
Key observations:
ChatPeerListCoordinator manages the lifecycle of peer updates, including sending "bitchatters nearby" notifications.GeoPresenceTracker handles the logic for marking peers as "teleported" when they carry a teleport tag in Nostr events.PeerListModel acts as the reactive bridge between the ChatViewModel state and the SwiftUI views bitchat/Views/MeshPeerList.swift5 bitchat/Views/GeohashPeopleList.swift4Sources: bitchat/Views/MeshPeerList.swift4-10 bitchat/Views/GeohashPeopleList.swift3-6 bitchat/Views/GroupChatList.swift6-10
MeshPeerList displays all peers visible through the Bluetooth mesh network. It uses MeshPeerRow objects to represent peers, which include connectivity and encryption metadata.
MeshPeerList displays multiple status indicators per peer:
| Icon | Condition | Meaning |
|---|---|---|
person.fill (orange) | peer.isMe == true | Current user's identity bitchat/Views/MeshPeerList.swift66-69 |
antenna.radiowaves.left.and.right | peer.isConnected == true | Direct radio connection bitchat/Views/MeshPeerList.swift70-75 |
point.3.filled.connected.trianglepath.dotted | peer.isReachable | Reachable via multi-hop mesh bitchat/Views/MeshPeerList.swift76-81 |
globe (purple) | peer.isMutualFavorite | Reachable via Nostr (offline from mesh) bitchat/Views/MeshPeerList.swift82-87 |
antenna.radiowaves...slash | Else | Peer is currently offline bitchat/Views/MeshPeerList.swift88-95 |
checkmark.seal.fill | peer.isVerified | Cryptographic fingerprint verified bitchat/Views/MeshPeerList.swift135-140 |
lock.fill | peer.isEncrypted | Active Noise encryption session bitchat/Views/MeshPeerList.swift141-146 |
Sources: bitchat/Views/MeshPeerList.swift57-160 bitchat/Views/FingerprintView.swift67-71
To prevent visual flickering during rapid mesh updates, the view maintains a stable list of IDs. When the peer list updates, existing IDs keep their relative positions, and new IDs are appended to the bottom bitchat/Views/MeshPeerList.swift40-44
GeohashPeopleList displays ephemeral Nostr identities broadcasting presence in the current geohash channel.
face.dashed bitchat/Views/GeohashPeopleList.swift53-56 The list is partitioned so local users (mappin.and.ellipse) appear above teleported users bitchat/Views/GeohashPeopleList.swift39-45nosign icon bitchat/Views/GeohashPeopleList.swift83-88Sources: bitchat/Views/GeohashPeopleList.swift39-62 bitchat/Views/GeohashPeopleList.swift83-121
GroupChatList provides a compact section for the 16-member private groups the user belongs to.
crown.fill icon bitchat/Views/GroupChatList.swift43-48envelope.fill icon is shown bitchat/Views/GroupChatList.swift52-57Sources: bitchat/Views/GroupChatList.swift22-67
BitChat uses a suffix system to distinguish between peers with identical nicknames. The UI splits the displayName into a base and a suffix derived from the PeerID bitchat/Views/MeshPeerList.swift97-110 bitchat/Views/GeohashPeopleList.swift63-76
Users can view a peer's FingerprintView to verify their identity. This view displays:
Sources: bitchat/Views/FingerprintView.swift49-175 localPackages/BitFoundation/Sources/BitFoundation/PeerID.swift130-134
The update lifecycle involves transport updates propagating to the PeerListModel which triggers SwiftUI re-renders while maintaining ID stability.
Title: Peer Update Lifecycle
Sources: bitchat/Views/MeshPeerList.swift40-44 bitchat/Views/GeohashPeopleList.swift35-45
Refresh this wiki
This wiki was recently refreshed. Please wait 6 days to refresh again.