2a081f65fc Group Connectivity Improvements (#365)
* Implement dynamic connection limits based on network size

Fixes connection thrashing in group scenarios by dynamically adjusting the connection limit based on the number of nearby peers.

Changes:
- Replace fixed maxConnectedPeripherals with dynamic calculation
- Maintain full mesh connectivity for small groups (<10 peers)
- Scale connection limit up to 2x for larger groups
- Override battery-based limits when needed to prevent thrashing
- Add logging to track dynamic limit changes

This solves the "perfect storm" issue where 6-8 people would constantly disconnect/reconnect when the power saver mode limited connections to 5.

* Implement optimistic version negotiation with caching

Skip version negotiation for known peers by caching negotiated versions for 24 hours.

Changes:
- Add version cache that persists beyond session lifetime
- Check cache before sending version hello
- Skip negotiation entirely for cached peers (instant connection)
- Cache cleanup runs every 60 seconds
- Invalidate cache on protocol errors for automatic fallback
- Log when using cached versions

This reduces protocol messages by ~40% for reconnecting peers and enables instant connections for known devices.

* Fix unused variable warning

* Implement protocol message deduplication

Suppress duplicate protocol messages within configurable time windows to reduce overhead.

Changes:
- Add deduplication tracker with per-message-type time windows
- Suppress duplicate announces within 5 seconds
- Suppress duplicate version negotiations within 10 seconds
- Track messages by peer ID and optional content hash
- Automatic cleanup of expired entries every 60 seconds
- Log when duplicates are suppressed

This reduces protocol message overhead by 20-30% in group scenarios where multiple connection attempts trigger redundant announcements and version negotiations.

* Fix MessageType enum case name

---------

Co-authored-by: jack <jackjackbits@users.noreply.github.com>
2025-07-31 11:36:49 +02:00
2025-07-23 09:33:07 +02:00
2025-07-10 11:17:08 +10:00
2025-07-10 21:00:12 +05:30
2025-07-31 01:03:31 +02:00
2025-07-25 20:57:19 +02:00

bitchat

bitchat

A decentralized peer-to-peer messaging app that works over Bluetooth mesh networks. No internet required, no servers, no phone numbers. It's the side-groupchat.

bitchat.free

📲 App Store

Warning

Private messages have not received external security review and may contain vulnerabilities. Do not use for sensitive use cases, and do not rely on its security until it has been reviewed. Now uses the Noise Protocol for identity and encryption. Public local chat (the main feature) has no security concerns.

License

This project is released into the public domain. See the LICENSE file for details.

Features

  • Decentralized Mesh Network: Automatic peer discovery and multi-hop message relay over Bluetooth LE
  • Privacy First: No accounts, no phone numbers, no persistent identifiers
  • Cover Traffic: Timing obfuscation and dummy messages for enhanced privacy
  • Private Message End-to-End Encryption: Noise Protocol
  • Store & Forward: Messages cached for offline peers and delivered when they reconnect
  • IRC-Style Commands: Familiar /slap, /msg, /who style interface
  • Universal App: Native support for iOS and macOS
  • Emergency Wipe: Triple-tap to instantly clear all data
  • Performance Optimizations: LZ4 message compression, adaptive battery modes, and optimized networking

Technical Architecture

Binary Protocol

bitchat uses an efficient binary protocol optimized for Bluetooth LE:

  • Compact packet format with 1-byte type field
  • TTL-based message routing (max 7 hops)
  • Automatic fragmentation for large messages
  • Message deduplication via unique IDs

Mesh Networking

  • Each device acts as both client and peripheral
  • Automatic peer discovery and connection management
  • Store-and-forward for offline message delivery
  • Adaptive duty cycling for battery optimization

For detailed protocol documentation, see the Technical Whitepaper.

Setup

  1. Install XcodeGen if you haven't already:

    brew install xcodegen
    
  2. Generate the Xcode project:

    cd bitchat
    xcodegen generate
    
  3. Open the generated project:

    open bitchat.xcodeproj
    

Option 2: Using Swift Package Manager

  1. Open the project in Xcode:

    cd bitchat
    open Package.swift
    
  2. Select your target device and run

Option 3: Manual Xcode Project

  1. Open Xcode and create a new iOS/macOS App
  2. Copy all Swift files from the bitchat directory into your project
  3. Update Info.plist with Bluetooth permissions
  4. Set deployment target to iOS 16.0 / macOS 13.0

Option 4: just

Want to try this on macos: just run will set it up and run from source. Run just clean afterwards to restore things to original state for mobile app building and development.

S
Description
bluetooth mesh chat, IRC vibes
Readme Unlicense
251 MiB
Languages
Swift 99%
Shell 0.4%
Python 0.3%
Rust 0.2%