"Offline Bluetooth Messenger"
A retro 8-bit styled, fully offline peer-to-peer messenger that works entirely over Bluetooth. No internet. No servers. No cloud. Just Bluetooth.
| Splash | Nearby | Chat | Settings |
|---|---|---|---|
| (placeholder) | (placeholder) | (placeholder) | (placeholder) |
- Retro 8-bit UI β "Press Start 2P" font, pixel art avatars, scanline overlay
- BLE + Classic Bluetooth β via
flutter_blue_plus - Mesh discovery β via Google Nearby Connections (
nearby_connections) - One-to-one chat over Bluetooth
- Group chat with admin controls (add/remove members)
- Media sharing β images, videos, documents, voice notes (chunked transfer)
- Voice calls over Bluetooth (8kHz PCM streaming)
- Video calls β low-fps JPEG slideshow mode (~2fps, Bluetooth bandwidth trade-off)
- AES-256 encrypted storage (keys in
flutter_secure_storage) - Delete My Data β full wipe with pixel skull animation
- 100% offline β works with zero internet connectivity
| Layer | Technology |
|---|---|
| Framework | Flutter 3.x (Dart 3) |
| Bluetooth | flutter_blue_plus + nearby_connections |
| Database | hive + hive_flutter |
| Encryption | encrypt (AES-256-CBC) + flutter_secure_storage |
| State | provider |
| Fonts | google_fonts (Press Start 2P) |
| Media | file_picker, image_picker, record, audioplayers, camera |
lib/
βββ main.dart # App entry, init DB + encryption
βββ app.dart # App widget + providers
βββ core/
β βββ constants/colors.dart # Retro color palette
β βββ theme/pixel_theme.dart # 8-bit ThemeData
β βββ utils/pixel_avatar_generator.dart # Procedural pixel avatars
βββ features/
β βββ bluetooth/
β β βββ services/bluetooth_service.dart # BLE connection manager
β β βββ services/peer_discovery.dart # Nearby Connections mesh
β β βββ models/peer.dart
β βββ chat/
β β βββ screens/splash_screen.dart
β β βββ screens/onboarding_screen.dart
β β βββ screens/chat_list_screen.dart
β β βββ screens/chat_screen.dart
β β βββ screens/nearby_users_screen.dart
β β βββ widgets/pixel_message_bubble.dart
β β βββ models/message.dart
β βββ groups/
β β βββ screens/group_screen.dart
β β βββ screens/create_group_screen.dart
β β βββ screens/add_members_screen.dart
β β βββ models/group.dart
β βββ calls/
β β βββ screens/voice_call_screen.dart
β β βββ screens/video_call_screen.dart
β β βββ services/audio_stream.dart
β β βββ services/video_stream.dart
β βββ media/
β β βββ services/media_transfer.dart # Chunked BT file transfer
β β βββ services/file_handler.dart
β βββ home/
β β βββ home_screen.dart
β βββ settings/
β βββ screens/
β βββ settings_screen.dart
β βββ delete_data_screen.dart # Pixel skull wipe
βββ storage/
β βββ local_db.dart # Hive database wrapper
β βββ encryption_service.dart # AES-256 encrypt/decrypt
βββ shared/
βββ widgets/
βββ pixel_button.dart # Press-down pixel button
βββ pixel_dialog.dart # 8-bit dialog
βββ pixel_text_field.dart # Pixel input field
βββ pixel_progress_bar.dart # Stepped progress bar + spinner
βββ scanline_overlay.dart # CRT scanline + signal bars
- Flutter SDK β₯ 3.3.0
- Dart β₯ 3.3.0
- Android Studio / Xcode
flutter pub getdart run build_runner build --delete-conflicting-outputs# Android
flutter run --release
# iOS (requires Mac + Xcode)
flutter run --release -d iosflutter build apk --release --split-per-abiflutter build ios --release- Min SDK: 21 (Android 5.0)
- Target SDK: 34
- Compile SDK: 34
- Bluetooth permissions are declared in
AndroidManifest.xml - For Android 12+,
BLUETOOTH_SCAN/BLUETOOTH_CONNECT/BLUETOOTH_ADVERTISEare required
android {
compileSdkVersion 34
defaultConfig {
applicationId "com.bluetoosh.messenger"
minSdkVersion 21
targetSdkVersion 34
}
}- Deployment target: iOS 13.0+
- Add
NSBluetoothAlwaysUsageDescription(already inInfo.plist) - Background Bluetooth modes enabled in
Info.plist - Enable
Background Modescapability in Xcode: β Uses Bluetooth LE accessories β Acts as a Bluetooth LE accessory β Audio, AirPlay, and Picture in Picture
True real-time video over Bluetooth is impractical due to bandwidth constraints (~720 Kbps for BT Classic, even less for BLE). Bluetoosh implements a low-fps JPEG slideshow mode:
- Resolution: 240p (low camera preset)
- Frame rate: ~2fps (one frame every 500ms)
- Encoding: JPEG (camera's native output)
- Audio: separate 8kHz PCM stream
This allows functional "video" communication while staying within Bluetooth bandwidth limits.
- All messages encrypted with AES-256-CBC before being stored in Hive
- Encryption key stored in
flutter_secure_storage(iOS Keychain / Android EncryptedSharedPreferences) - Media files saved to app-private directory under
/Bluetoosh/Media/ - Delete My Data button permanently erases:
- All Hive database boxes
- All media files
- All encryption keys
- User profile
- No analytics, no crash reporting, no network calls
Key files contain bilingual comments:
lib/main.dartβ Persian + Englishlib/storage/local_db.dartβ Persian + Englishlib/features/bluetooth/services/bluetooth_service.dartβ Persian + English
MIT Β© Bluetoosh Contributors