296e2cc40ef47e3cbecde0051accc9f69a398703
* feat: wire delivery status from Rust bridge to Flutter UI * chore: regenerate flutter_rust_bridge codegen * Fix cargo fmt lint and handle messageRetried edge case Fix import ordering in frb_generated.rs and line break in messages.rs to pass cargo fmt check. Handle messageRetried when message ID is not yet in the display list by appending it instead of silently ignoring. * Run dart format on generated bridge files * Update whitenoise-rs rev to aa56ba6 to fix mdk version conflict * Add tests for deliveryStatusChanged and messageRetried handlers * Add tests for DeliveryStatus mapping in ChatMessageBubble * Sync with Rust retry redesign: add Retried status, remove messageRetried Update whitenoise-rs rev to 74a3071 and re-run codegen to sync with the retry-as-new-message design. DeliveryStatus now includes Retried, UpdateTrigger no longer has MessageRetried. - Update whitenoise-rs rev to 74a3071 - Add DeliveryStatus.retried variant and From impl in bridge - Remove MessageRetried from UpdateTrigger enum and From impl - Remove messageRetried handler from useChatMessages hook - Add Retried case to DeliveryStatus mapping in ChatMessageBubble - Remove messageRetried tests, add retried conversion test * cargo fmt on generated code, add Retried delivery status test * Run dart format on generated bridge files
White Noise
A secure, private, and decentralized chat app using the marmot protocol 🦫 to build secure messaging with MLS and Nostr
📱 Supported Platforms
- ✅ Android - Fully supported
- ✅ iOS - Fully supported
- ⏳ macOS - Not supported yet
- ⏳ Windows - Not supported yet
- ⏳ Linux - Not supported yet
- ⏳ Web - Not supported yet
Structure
lib/
├── constants/ # Shared constants: fixed, related sets or reused elsewhere only
├── providers/ # Shared state
├── hooks/ # Ephemeral widget state
├── services/ # Stateless operations (API calls)
├── screens/ # Full-page components
├── widgets/ # Reusable components
🏗️ Stack
- Flutter
- Rust
- flutter_rust_bridge - Dart ↔ Rust integration
- whitenoise rust crate 🦀
Prerequisites
- Flutter SDK (3.24.x or later)
- Rust (latest stable)
- Just -
cargo install just - flutter_rust_bridge_codegen -
cargo install flutter_rust_bridge_codegen
🛠️ Commands
# Install dependencies
just deps # Install both Flutter and Rust deps
just deps-flutter # Flutter dependencies only
just deps-rust # Rust dependencies only
# Format code
just format # Format both Rust and Dart
just format-rust # Format Rust only
just format-dart # Format Dart only
# Coverage
just coverage # Checks tests coverage
Coverage Report
You need to install lcov to generate report
# Mac OS
brew install lcov
# Linux
apt-get install lcov
# First run tests with coverage option
flutter test --coverage
# Generate coverage html report
genhtml coverage/lcov.info -o coverage/html
# Open coverage/html/index.html in your browser
Development philosophy
- We keep complexity low.
- We keep the app thin.
- We test our code.
- We delete dead code. Commented code is dead code.
- We use the Whitenoise Rust crate as the source of truth.
- We avoid caching in Flutter; the Whitenoise crate already persists data in a local DB.
- We put shared app state in providers.
- We put ephemeral widget state in hooks.
- We pass data to hooks, not widget refs.
- We let screens watch providers and pass data to hooks.
- We avoid comments unless strictly necessary and write self-explanatory code.






