Murmur
Privacy-first Android group chat with QR-only invites and no accounts
Designed a privacy-first chat system where users join temporary streams via QR code, with no identity, no history, and no persistent data.
Murmur is a native Android app for anonymous, temporary group chat. I designed and built it in Jetpack Compose and Firebase to explore privacy-first communication without accounts, profiles, or persistent chat history.
Project Overview
• Mobile UI design and interaction states
• Jetpack Compose implementation
• Firebase-backed real-time chat
• Privacy-first product thinking
• Edge cases around ownership, cleanup, and invite flow
• Jetpack Compose implementation
• Firebase-backed real-time chat
• Privacy-first product thinking
• Edge cases around ownership, cleanup, and invite flow
Problem → Approach
Most chat apps rely on identity and stored history.
Murmur removes both and focuses on presence in the moment.
Murmur removes both and focuses on presence in the moment.
• No accounts or usernames
• No persistent chat history
• No personal data collection
• Invite-only access via QR code
• No persistent chat history
• No personal data collection
• Invite-only access via QR code
Key Experience
Users create or join a temporary chat via QR code, talk freely, and leave with no trace.
• One-tap entry and exit
• Anonymous, device-based ownership
• Clear feedback for joins and destructive actions
• Lightweight UI with no profiles or labels
• Anonymous, device-based ownership
• Clear feedback for joins and destructive actions
• Lightweight UI with no profiles or labels
Challenges
• NFC was unreliable → switched to QR
• Ownership without identity → device-based rules
• Preventing abandoned streams → auto-delete logic
• Ownership without identity → device-based rules
• Preventing abandoned streams → auto-delete logic
Screens & Flow
Primary User Screens (Dark Mode UI)
Invite
Chat Stream
Protect the stream
User Flow Map
🟦 Joiner Flow 🟩 Creator Actions 🟥 Stream Termination Logic
System Evolution
Murmur started as a simple QR-based chat app and evolved into a broader system with stream limits, ownership rules, cleanup logic, and reusable messaging architecture.
• Stream limits and ownership rules
• Session lifespan and message cleanup logic
• QR-based invites with improved session cleanup
• Stream limits and ownership rules
• Session lifespan and message cleanup logic
• QR-based invites with improved session cleanup
MurmurRelay
As the project evolved, I separated the messaging logic into MurmurRelay, a reusable encrypted messaging SDK. The goal was to move the chat layer away from being tied directly to Firebase and make the communication system more transport-agnostic.
What I Learned
• Designing real-time systems means thinking through edge cases and cleanup
• Simplicity matters more when there’s no identity or history
• Motion works best when it supports clarity, not decoration
• Building solo requires constant tradeoffs across product, UX, and engineering
• QR proved more reliable than NFC for fast, cross-device entry
• Simplicity matters more when there’s no identity or history
• Motion works best when it supports clarity, not decoration
• Building solo requires constant tradeoffs across product, UX, and engineering
• QR proved more reliable than NFC for fast, cross-device entry
How it Started and Early Prototypes - Project Bluegill
Original Figma design - V2 7/23/2025