The 메시지 inbox is a DetailShell + SegmentedTabs (주요 / 요청, requests carry a count badge) over DmThreadRows — 1:1 shows one avatar, group shows an AvatarStack + member count; both carry an unread dot + count. A thread is a bottom-up FeedList of a date/system/message ChatItem union with asymmetric bubbles (mine $primary right-tail, theirs neutral left-tail, avatar only on the run-first message, sender name in groups, timestamp+읽음 on run-last) under a ComposeBar; a pending request thread swaps the composer for a RequestGateBar. Group create/add reuse one FriendPickerRow list. Real-time is a focus-gated 5s refetchInterval on thread latest-messages only — no persistent Realtime channel.
apps/mobile/app/messages/{index,[threadId],new-group,add-members}.tsx → messaging/src/dm-{inbox,thread,create-group,add-members}-screen.tsx
packages/features/messaging/src/dm-inbox-screen.tsxpackages/features/messaging/src/dm-thread-screen.tsxpackages/features/messaging/src/dm-create-group-screen.tsxpackages/features/messaging/src/shared/friend-picker-row.tsxpackages/app/src/presentation/hooks/queries/use-dm.ts