- Add LaunchScreen.storyboard to properly support all iPhone models
- Configure UILaunchStoryboardName in Info.plist for full screen display
- Add UIRequiresFullScreen to prevent black bars on newer devices
- Update project.yml to include launch screen in iOS target resources
- Add proper interface orientation support for iPhone and iPad
- Split multi-platform target into separate iOS and macOS targets to prevent iOS share extension from being embedded in macOS build
- Add launch screen configuration and full screen support for proper iPhone 16 display
- Configure iOS-specific Info.plist entries for background modes and interface orientations
- 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
- Add debugging logs to help diagnose sharing issues
- Improve completion handling in share extension
- Check for shared content when app becomes active
- Fix async handling of shared content processing
- Fixed nested lock acquisition in trackMessage/scheduleTimeout
- Properly handle lock release before calling methods that need locks
- Ensure retryDelivery and handleTimeout don't cause deadlocks
- Release locks before calling external methods
- 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
The crash was caused by concurrent access to CryptoKit signing operations
from multiple threads. Added thread-safe access using a concurrent queue
with barriers for write operations and sync reads.
This fixes the EXC_BAD_ACCESS crash seen in TestFlight build.
- Delete LoggingService.swift
- Remove all bitchatLog() function calls throughout the codebase
- Update Xcode project to remove LoggingService references
- Clean up debug logging statements from all services and views
- Replace /list with /rooms showing all discovered rooms with join status
- Remove /discover command (merged into /rooms)
- Rename /favorite to /save for clarity
- Make room-specific commands (/transfer, /pass, /save) only appear in room context
- Remove voice notes from app info (feature doesn't exist)
- Remove Commands line from app info screen
- Show checkmark (✓) for joined rooms in /rooms output
- Add KeychainManager for secure password storage
- Implement MessageRetentionService for encrypted local storage of favorite room messages
- Add MessageRetryService for automatic retry of failed messages
- Add /favorite command to toggle room retention
- Add /discover command to find active rooms
- Fix all force unwrapped optionals in BluetoothMeshService
- Update app info screen with new features
- Integrate all services with proper cleanup on panic
- Add key commitment scheme for immediate password verification
- Implement ownership transfer with /transfer command
- Add password change functionality with /pass command
- Include room metadata in initialization messages
- Remove /help command and rename /changepass to /pass
- Make room names tappable to show sidebar
- Remove spaces in person/room counter display
- Update UI to show lock icons and orange colors for protected rooms
- Fix password verification to work with empty rooms
- Add comprehensive tests for new functionality
This update significantly improves the security and usability of
password-protected rooms by allowing immediate verification without
waiting for encrypted messages.
- Add conditional compilation to LoggingService
- macOS continues to write logs to Documents/Logs
- iOS uses /dev/null to prevent disk writes
- Remove room auto-join on mention (only join when sending to room)
- Create LoggingService that writes to Documents/Logs directory
- Log to both console and file with timestamps
- Replace debug print statements with bitchatLog()
- Add log file location display in AppInfoView
- Enable opening log file in Finder on macOS
- Track room member operations and view state
- Persist logs for debugging room member display issues
- Fix NotificationService warnings by replacing unused error parameters with _
- Add public domain header to NotificationService.swift
- Fix BluetoothMeshService compilation errors:
- Replace removeAll with filter for processedKeyExchanges cleanup
- Remove duplicate cleanupStalePeers function declaration
- Remove duplicate peerLastSeenTimestamps property declaration
- All code now compiles cleanly for both iOS and macOS targets
- Added duplicate connection detection in key exchange handler
- When same peer connects through multiple peripherals, keep only one
- Track intentional disconnects to suppress disconnect messages
- Don't show disconnect message when dropping duplicate connections
- This prevents the confusing connect/disconnect/connect pattern
The issue was that both devices try to connect to each other simultaneously,
creating duplicate connections. One gets dropped, but now it's handled gracefully.
- Timer.scheduledTimer must be called on main thread with run loop
- Wrapped timer scheduling in DispatchQueue.main.async
- This prevents EXC_BREAKPOINT crash when called from background threads
- Removed test targets from project.yml (causing dependency issues)
- Generated fresh Xcode project with xcodegen
- Project now includes proper Assets.xcassets configuration
- Ready for App Store build and submission
- Check characteristic write properties before all writes
- Add proper error handling for specific BLE error codes
- Rediscover services on invalid handle errors
- Increase delay between key exchange and announce
- Reduce connection flooding by spacing out initial messages
The ATT Error 242 was caused by writing too quickly after
connection establishment. Adding delays gives the connection
time to stabilize.
- Add peripheral state checks before all write operations
- Fix 'can only accept commands while connected' errors
- Check characteristic write properties to avoid ATT errors
- Preserve original timestamps in store-and-forward messages
- Only log crypto errors once per peer to reduce noise
- Store-and-forward now correctly maintains message ordering
The timestamp preservation ensures messages appear in the correct
chronological order even when delivered later via store-and-forward.
- Single tap logo shows comprehensive app info and features
- Triple tap logo triggers panic mode (instant data wipe)
- Implement adaptive Bluetooth scanning based on battery level
- Remove hardcoded development team ID for security
- Fix store-and-forward description (12h for all, indefinite for favorites)
- Add technical debt remediation plan
- Fix macOS compatibility issues with navigation
- Fix mic button gesture handling by removing Button wrapper
- Use direct gesture on ZStack for more reliable touch detection
- Add debug logging for recording start/stop
- Fix notification delivery on iOS
- Change from checking .background to checking != .active
- Notifications now work when app is inactive or background
- Add NSUserNotificationsUsageDescription to Info.plist
- Improve voice note fragment transmission
- Reduce fragment size from 400 to 200 bytes for better reliability
- Simplify fragment timing from batch-based to linear 100ms delays
- Lower packet size threshold from 512 to 400 bytes for fragmentation
- Add peripheral connection state checking before writes
- Better error logging throughout transmission pipeline
- Add comprehensive debug logging for troubleshooting
- Log audio file size and duration
- Log peripheral connection states during broadcast
- Log fragment send progress with timing info
- Add favorites functionality for peers with persistent storage
- Star icon to toggle favorites in sidebar
- Favorites appear at top of peer list
- Storage persists across app launches using peer ID
- Add local notifications for mentions and private messages
- Notifications appear when app is in background
- Separate notification types for mentions vs private messages
- Request notification permissions on app launch
- Fix sidebar header alignment to match main toolbar (44pt)
- Add background color to sidebar header for visual consistency
- Improve voice note fragment transmission
- Send fragments in batches of 5 with delays to prevent congestion
- Better logging to debug fragment transmission issues
- Reduce delay between fragments from 50ms to batch-based timing
- Fix other UI issues
- Ensure mic recording ripples originate from mic button
- Update sidebar to swipe from right edge smoothly
- Implemented compact binary encoding for packets and messages
- Reduced packet size significantly (13-byte fixed header + variable payload)
- Optimized for BLE's limited MTU with smaller message sizes
- Added BinaryProtocol.swift with encode/decode functions
- Updated all message types to use binary serialization
- Maintains all existing functionality with better performance