Commit Graph
142 Commits
Author SHA1 Message Date
jack 58876704c3 Bold user's own nickname in chat messages
- Added font weight logic to formatMessageAsText and formatMessage
- User's own @nickname appears bold (weight: .bold)
- Other nicknames remain medium weight
- Helps visually distinguish own messages from others
2025-07-24 13:18:12 +02:00
jack b51000939b Remove RSSI-based sender name coloring in chat messages
- Simplified getSenderColor to always return primary color
- Removed RSSI color calculation logic from formatMessageAsText
- Removed RSSI color calculation logic from formatMessage
- All sender names now use consistent green color
- RSSI information remains visible only in peer list
2025-07-24 13:16:47 +02:00
jack e13380fe27 Set message limit to 1337 and auto-trim oldest messages
- Added maxMessages constant set to 1337
- Added trimMessagesIfNeeded() to remove oldest messages when limit exceeded
- Added trimPrivateChatMessagesIfNeeded() for private chat limits
- Applied trimming after all message append operations:
  - Regular chat messages (sent and received)
  - Private messages (sent and received)
  - System messages (connect/disconnect/screenshot)
  - Message migrations between peer IDs
- Ensures chat history doesn't grow unbounded
2025-07-24 13:14:37 +02:00
jack f9d5a07542 Optimization 3: Add caching for expensive view computations
- Cache getRSSIColor results with key format: "\(rssi)_\(isDark)"
- Cache getEncryptionStatus results with peerID as key
- Add cache invalidation methods for both caches
- Invalidate encryption cache when:
  - Encryption status is updated
  - Fingerprints are verified
  - Peer authentication callbacks trigger
- Invalidate RSSI cache when peer list updates
- Clear all caches in panicClearAllData

This reduces redundant calculations during view updates and improves performance
2025-07-24 13:09:18 +02:00
jack 5d3512dfbc Add 1pt more padding around link preview box
- Increased padding from 9pt to 10pt for better visual spacing
- Improves readability and touch target size
2025-07-24 13:04:43 +02:00
jack c08fe38c72 Fix URL detection and message spacing
- Add URL detection to message formatting with blue color and underline
- Replace List with ScrollView for precise spacing control
- Use minimal vertical padding (1px) between messages
- Remove LazyLinkPreviewView, use LinkPreviewView directly
- URLs now appear highlighted in message text AND show preview below
2025-07-24 12:53:55 +02:00
jack b480a4836c Fix message spacing and remove markdown link support
- Reduce VStack spacing from 4 to 2 and nested VStack from 2 to 0
- Set list row insets top/bottom to 0 to minimize spacing on iPhone
- Remove all markdown link parsing and formatting
- Share plain URLs instead of markdown when using share extension
- Keep only plain text URL detection and preview functionality
2025-07-24 12:47:49 +02:00
jack f45c52e9d3 Optimize UI performance with message caching and List view
- Convert BitchatMessage from struct to class for efficient caching
- Cache formatted AttributedStrings to avoid expensive regex on every render
- Replace ScrollView+LazyVStack with native List for better cell reuse
- Implement message windowing (show last 100 messages for performance)
- Add LazyLinkPreviewView that defers loading for 0.5s to improve scroll performance

These optimizations significantly improve scroll performance, especially with large message lists.
2025-07-24 12:38:31 +02:00
jack cc3a094205 Add nickname validation to prevent empty names
- Validate nickname only when field loses focus or on submit
- Replace empty nicknames with anon+random 4 digits (e.g. anon3847)
- Remove auto-save timer to prevent validation while typing
- Add FocusState to detect when user exits the field
2025-07-24 12:16:23 +02:00
jack c4ca38654d Improve private message notification behavior
- Don't show PM notifications when the private chat is already open
- Store peer ID in notification userInfo for reliable chat opening
- Tap notification to open the correct private chat using peer ID
- Check both in ChatViewModel (when receiving) and NotificationDelegate (when presenting)
2025-07-24 12:00:01 +02:00
jack 391c80ef14 Fix blank message row and API misuse warnings
- Fix blank row appearing when peer disconnects by ensuring display names are never empty
- Add validation to prevent system messages with empty content from being displayed
- Fix API MISUSE warnings by adding connection state checks before writing to peripherals
- Improve write queue processing with additional safety checks
- Update activity tracking when processing queued writes

These fixes address UI glitches and improve Bluetooth reliability.
2025-07-23 21:02:51 +02:00
jack a84d6f22ef Fix handshake deadlock after decryption failure
Always accept handshake initiations even with valid sessions, as the peer must have cleared their session for a good reason (e.g., decryption failure). This prevents deadlock where one peer has no session while the other maintains an invalid one.
2025-07-23 18:22:39 +02:00
jack d912da5898 Fix Noise handshake stability and session synchronization issues
- Add peer presence tracking with lastHeardFromPeer to detect reconnections
- Automatically send identity announcement when detecting peer reconnection after 30s
- Clear stale sessions when receiving handshake from recently-seen peer (likely restart)
- Add peers to activePeers when successfully decrypting their messages
- Fix thread safety in handshake coordinator with concurrent collections
- Extend message delivery timeouts (30s→120s private, 60s→180s room, 300s→600s favorite)
- Add per-peer encryption queues to prevent nonce desynchronization
- Make NoiseSession encrypt/decrypt operations thread-safe with barrier flag
- Initialize lastSuccessfulMessageTime when handshake completes
- Send identity announcement when decryption fails to prompt session reset
- Improve handshake state logging and debugging

This fixes:
- Peers stuck in "establishing encryption" after restart
- Nonce desynchronization causing "Decryption failed at nonce N"
- Asymmetric peer visibility (one peer sees the other but not vice versa)
- Thread safety issues causing crashes with pendingPrivateMessages
- Sessions marked as stale immediately after establishment
2025-07-23 14:57:15 +02:00
jack f53e163d25 Remove all channel functionality and clean up test suite
- Remove channel UI elements from ContentView
- Remove channel data structures and methods from ChatViewModel
- Remove channel commands (/j, /leave, /channels)
- Remove channel field from BitchatMessage protocol
- Remove channel message types and handling
- Remove NoiseChannelEncryption.swift entirely
- Clean up all channel references across the codebase
- Fix compilation warnings (var to let conversions)
- Remove all outdated test files that used incorrect APIs
- Simplify app to only support public broadcast and 1:1 private messages
2025-07-23 01:33:54 +02:00
jackandClaude 70d8c78a76 Convert all print statements to SecureLogger
- Replaced all print() calls with appropriate SecureLogger.log() calls
- Used proper categories: noise, encryption, session, security
- Applied appropriate log levels: debug, info, warning, error
- Converted 25 prints in BluetoothMeshService.swift
- Converted 1 print in ChatViewModel.swift
- Converted 8 prints in DeliveryTracker.swift
- Test files kept as-is for debugging purposes
- Verified successful build on iOS

This improves security by using structured logging that can filter sensitive data.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-22 20:59:11 +02:00
jack 8f9df5beb3 UI improvements and performance optimizations
- Changed toolbar text from "bitchat*" to "bitchat/" with tighter spacing
- Removed blue intro message when no peers are connected
- Changed RSSI indicator back to simple dot instead of radiowaves icon
- Added triple-tap gesture on chat area to clear current context
- Improved LinkPreviewView performance with metadata caching
- Moved link previews closer to messages for better visual connection
- Fixed AppInfoView duplication by consolidating strings into single location
- Better error handling for link preview ATS errors
2025-07-22 16:19:40 +02:00
jack 5e726f993e Fix Noise handshake failures and implement binary protocol migration
- Fix asymmetric handshake state causing message delivery failures
- Prevent duplicate handshake init messages from disrupting ongoing handshakes
- Add defensive copying to all binary decoders to prevent thread safety issues
- Implement binary encoding for all 9 message types (60-80% bandwidth reduction)
- Fix delivery ACK decoding for Noise encrypted messages
- Add comprehensive logging for debugging handshake and message flow
- Fix race condition in delivery status updates
- Add relay logic for handshake packets to ensure mesh delivery
- Maintain backward compatibility with JSON fallback
2025-07-22 14:52:33 +02:00
Ryan NairandGitHub eca70e69e7 Fix Crash when receiving notification from the background
In my testing the app crashes in the background when receiving a notification. This is probably due to UIFeedbackGenerator requiring the main thread which isn't available
2025-07-19 22:01:23 -04:00
jack b61904bee9 Remove message retention and /save command
- Delete MessageRetentionService.swift
- Remove retentionEnabledChannels from ChatViewModel
- Remove /save command handling
- Remove retention UI elements from ContentView
- Remove channelRetention message type from protocol
- Update documentation and tests
2025-07-16 15:59:38 +02:00
jack ee2c7550d1 Move encryption status icons after peer names and implement slide-over navigation
- Moved encryption/handshake status icons to appear after peer names in sidebar and private message headers
- Converted private messages and channels to slide-over views with smooth transitions
- Added swipe-right gesture to dismiss private chats and channels
- Added vertical separator bars to slide-over views for visual consistency
2025-07-16 15:38:20 +02:00
jack 3fb39b8a30 Add protocol version negotiation for future compatibility
- Add version negotiation messages (0x20 versionHello, 0x21 versionAck)
- Implement VersionHello and VersionAck message types with platform info
- Add ProtocolVersion struct for version management and negotiation
- Update BinaryProtocol to check supported versions
- Add version negotiation to connection flow before Noise handshake
- Maintain backward compatibility with legacy peers (assume v1)
- Add comprehensive test suite with 40+ test cases
- Update documentation with version negotiation details

This ensures BitChat clients can negotiate protocol versions for smooth
upgrades while maintaining full backward compatibility with existing clients.
2025-07-15 14:33:37 +02:00
jack 3070a4d307 Implement Noise Protocol Framework and peer ID rotation for enhanced security and privacy
This major update replaces the basic encryption with the Noise Protocol Framework
and adds ephemeral peer ID rotation for enhanced privacy.

Key Changes:

Security Infrastructure:
- Implemented Noise Protocol Framework (XX handshake pattern)
- End-to-end encryption with forward secrecy and identity hiding
- Session management with automatic rekey support
- Channel encryption with password-derived keys

Privacy Enhancements:
- Ephemeral peer ID rotation (5-15 minute random intervals)
- Persistent identity through public key fingerprints
- Favorites and verification persist across ID rotations
- Block list based on fingerprints, not ephemeral IDs

Core Components Added:
- NoiseEncryptionService: Main encryption service
- NoiseSession: Individual peer session management
- NoiseChannelEncryption: Password-protected channel support
- SecureIdentityStateManager: Persistent identity storage
- FingerprintView: Visual fingerprint verification UI

Bug Fixes:
- Fixed handshake storm with tie-breaker mechanism
- Fixed missing connect messages during peer rotation
- Fixed delivery ACK compression issues
- Fixed race conditions in message queue
- Fixed nickname resolution for rotated peer IDs

Testing:
- Comprehensive test suite for Noise implementation
- Security validator tests
- Channel encryption tests
- Identity persistence tests
- Rate limiter tests

Documentation:
- BRING_THE_NOISE.md: Technical implementation details
- Updated WHITEPAPER.md: Simplified and focused on core innovations
- Removed temporary debug documentation

The implementation maintains backward compatibility while significantly
improving security and privacy. All existing features (channels, private
messages, favorites, blocking) work seamlessly with the new system.
2025-07-15 13:15:31 +02:00
jackandGitHub 70c6307a90 Merge pull request #34 from nelsoncampoos/fix/message-duplication-sync-improvements
Fix message duplication and improve sync performance in mesh network
2025-07-08 18:26:10 +02:00
jackandGitHub 806291cecf Merge pull request #44 from PubliusPseudis/fix/update-peerlist-on-main-thread
Fix: Ensure peer list updates on main thread
2025-07-08 18:18:03 +02:00
jack d5ccf6bc0b Add iOS share extension with rich link previews
- Implement share extension to receive URLs from other apps
- Display shared links with emoji indicator and rich preview cards
- Add custom compact link preview with image, title, and domain
- Configure app groups for data sharing between extension and main app
- Handle URL detection and parsing in share extension
- Update message formatting to show only emoji for shared links
- Add proper entitlements and activation rules for share extension
2025-07-08 17:47:53 +02:00
AGInoMETRICS ef6b08d75f Fix: Ensure peer list updates on main thread 2025-07-08 15:54:28 +10:00
Nelson Campos a3fa7a892f fix: prevent phantom empty messages during sync
- Add content validation to skip empty or whitespace-only messages
- Apply validation in both channel and regular message handling
- Add validation at retry service level to prevent queuing empty messages
- This fixes the phantom space issue between synced messages
2025-07-07 23:36:10 -03:00
Nelson Campos 6187b48bf4 Merge upstream/main: Adopt channel terminology while preserving bug fixes 2025-07-07 23:27:12 -03:00
Nelson Campos 602657fec2 Enhance message handling and synchronization in BluetoothMeshService
- Introduce thread safety for recentlySentMessages using NSLock to prevent race conditions.
- Adjust message delay parameters for faster synchronization: reduce min/max message delays and adjust initial announce timing.
- Update sendMessage and sendEncryptedRoomMessage methods to accept optional messageID and timestamp parameters for better tracking.
- Improve message deduplication logic in ChatViewModel to prevent duplicates from being added when echoing back sent messages.
- Modify MessageRetryService to include original message ID and timestamp for better retry handling.
2025-07-07 23:19:24 -03:00
jack cc2f231d16 Fix screenshot notifications and remove 'private:' from UI
- Screenshot notifications now properly appear as system messages
- Send messages directly via mesh service to avoid local echo
- Remove 'private:' prefix from private chat header
- Keep only lock icon and peer name in private chat header
2025-07-08 04:07:06 +02:00
jack a5865af292 Add screenshot detection and notification feature
- Detect when users take screenshots on iOS
- Send system notification to all participants
- Works in public chat, channels, and private messages
- Display screenshot notifications as system messages
2025-07-08 04:00:50 +02:00
jack 9ec8008695 Fix block command documentation and add to autocomplete
- Change @user to @name in all documentation
- Change 'blocked users' to 'blocked peers' for consistency
- Add /block and /unblock commands to autocomplete menu
2025-07-08 03:03:21 +02:00
jack e0ce234d08 Add block/unblock user commands
Implemented user blocking functionality:
- /block <nickname> - blocks a user from private messaging and ignores their messages in channels
- /block - lists all blocked users
- /unblock <nickname> - unblocks a user

Implementation details:
- Blocks are stored by public key fingerprint for persistence across sessions
- Blocked users cannot send private messages or have their public messages displayed
- Blocked users are silently ignored (they don't know they're blocked)
- Blocking a user automatically removes them from favorites
- Added getPeerPublicKey() method to BluetoothMeshService for accessing peer identity keys
2025-07-08 02:36:23 +02:00
jack 9794f3ebdc UI improvements and rename rooms to channels
- Changed system messages from green to grey with consistent 12pt font
- Fixed text wrapping to flow naturally under timestamps
- Changed default nickname to anonXXXX format
- Replaced text with icon representations in status bar
- Added icons to sidebar section headers
- Made autocomplete UI consistent between commands and @mentions
- Added welcome message for new users (3 second delay)
- Changed sidebar header to 'YOUR NETWORK'
- Added command aliases (/join, /msg)
- Implemented /hug and /slap commands with haptic feedback
- Improved command help display with alphabetization
- Renamed 'rooms' to 'channels' throughout entire codebase
2025-07-08 01:42:35 +02:00
jack 0db5312584 Fix Swift warnings: replace unused variables with _ 2025-07-07 00:07:53 +02:00
jack 30f548eb73 Fix Swift compile error: add break statements to empty switch cases 2025-07-07 00:04:11 +02:00
jack 42cb696cc8 Remove debug logging from delivery confirmation feature
- Remove all [Delivery], [UI], and [DeliveryTracker] debug print statements
- Clean up console output for production use
- No functional changes
2025-07-06 23:52:42 +02:00
jack 784a809d07 Add delivery confirmation and read receipts for private messages
- Implement full delivery status flow: sending → sent → delivered → read
- Add visual indicators (gray/green/blue checkmarks)
- Create DeliveryTracker service for managing confirmations
- Add end-to-end encrypted ACK and read receipt messages
- Handle ephemeral peer ID changes with message migration
- Fix message ID preservation in BinaryProtocol
- Ensure proper delivery status for incoming messages
- Add multiple triggers for sending read receipts
- Maintain full backwards compatibility with older clients

Visual indicators:
- ○ Gray circle = Sending
- ✓ Gray check = Sent
- ✓✓ Green double checks = Delivered
- ✓✓ Blue double checks = Read
- ⚠ Red triangle = Failed
2025-07-06 23:44:42 +02:00
jack 13d9be9082 Fix read receipts for existing messages when opening chat
Critical fixes:
1. Match messages by sender nickname in addition to peer ID (since peer IDs change)
2. Send read receipts to CURRENT peer ID, not old senderPeerID from message
3. Remove requirement for senderPeerID to be non-nil (blocks older messages)
4. Add extensive logging to trace the flow

The core issue was that peer IDs are ephemeral and change between sessions:
- Rick sends message with peer ID A
- Later, Jack connects to Rick who now has peer ID B
- Read receipt needs to be sent to B, not A
- Messages need to be matched by nickname, not just peer ID
2025-07-06 22:55:51 +02:00
jack d892c790a7 Fix read receipts being overwritten by delivery ACKs
- Added logic to prevent downgrading from 'read' status to 'delivered'
- When an ACK arrives after a read receipt, the read status is preserved
- This fixes the issue where blue checkmarks briefly appear then revert to green
- Applied fix to all message types (main, private, room)
2025-07-06 22:52:10 +02:00
jack 8b79721725 Fix read receipts not being sent for existing messages
- Added app activation observer to send read receipts when app becomes active
- Send read receipts for all unread messages when receiving a new message while chat is open
- Added import for NSApplication/UIApplication notifications
- This ensures messages are marked as read even when opening chat from notifications or returning to app
2025-07-06 22:47:02 +02:00
jack e93d02afd0 Fix read receipts for existing messages when opening chat
- Added delay to ensure messages are loaded before checking
- Fixed logic to check if message is FROM the other person (not TO them)
- Added onAppear handler to send read receipts when view loads
- Added detailed logging to debug the flow
- Now correctly identifies received messages that need read receipts
2025-07-06 22:42:08 +02:00
jack fbe779e684 Fix read receipts and improve UI
- Changed back to bold blue double checkmarks for read status
- Send read receipts for both 'sent' and 'delivered' status messages
- Added onChange handler to send read receipts whenever switching to a private chat
- Made markPrivateMessagesAsRead public so it can be called from views
- This ensures read receipts are sent when opening a chat from notifications or any other way
2025-07-06 22:37:59 +02:00
jack 1fec1ee315 Fix read receipts using wrong peer ID
- Read receipts were being sent to the current ephemeral peer ID instead of the message's senderPeerID
- This caused read receipts to be lost when peer IDs changed between sessions
- Now using message.senderPeerID consistently for all read receipt sending
- Added detailed logging to track which peer ID receives the read receipt
2025-07-06 22:30:33 +02:00
jack ab5af1546d Add comprehensive logging and force UI updates for delivery status
- Add logging to track what delivery status is shown in UI
- Add logging when green/blue checkmarks appear
- Force complete dictionary reassignment to trigger SwiftUI updates
- Add diagnostics to understand why blue checkmarks aren't showing
2025-07-06 22:26:56 +02:00
jack c9a594d0b5 Fix UI not updating for delivery status changes
- Use message ID instead of index for ForEach to trigger proper updates
- Add explicit objectWillChange.send() when updating delivery status
- Fix scroll-to-bottom logic to use message IDs
- This should make blue checkmarks appear when read receipts are received
2025-07-06 22:22:13 +02:00
jack d162a89ac2 Add debugging and fix read receipts for messages without delivery status
- Add detailed logging to track read receipt generation
- Handle messages that don't have delivery status (older messages)
- Send read receipts for all unread messages when opening chat
2025-07-06 22:14:41 +02:00
jack 942913fb6d Add debugging logs for delivery confirmation
- Track message IDs through the delivery process
- Log ACK generation and processing
- Log status updates in ChatViewModel
- Log read receipt generation and sending
2025-07-06 21:58:07 +02:00
jack e2b0632879 Add read receipts for private messages
- Added ReadReceipt structure and .readReceipt message type
- Added .read delivery status with blue checkmarks in UI
- Send read receipts when viewing a private chat
- Send read receipts immediately for new messages if chat is open
- Update message status from delivered to read when receipt received
2025-07-06 21:49:56 +02:00
jack 78cb8b1039 Fix delivery confirmation for private messages
- Pass message ID from ChatViewModel to BluetoothMeshService
- Preserve original message ID when creating ACK messages
- Move delivery tracking to ChatViewModel for consistent IDs
- Update project.yml to match current project structure
2025-07-06 21:25:41 +02:00