{"id":29438601,"url":"https://github.com/permissionlesstech/bitchat","last_synced_at":"2026-02-15T08:37:07.328Z","repository":{"id":303271224,"uuid":"1013830656","full_name":"permissionlesstech/bitchat","owner":"permissionlesstech","description":"bluetooth mesh chat, IRC vibes","archived":false,"fork":false,"pushed_at":"2026-02-08T06:17:27.000Z","size":97327,"stargazers_count":25015,"open_issues_count":253,"forks_count":2335,"subscribers_count":261,"default_branch":"main","last_synced_at":"2026-02-08T13:46:37.432Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/permissionlesstech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-04T14:34:38.000Z","updated_at":"2026-02-08T11:57:59.000Z","dependencies_parsed_at":"2025-07-10T21:51:18.717Z","dependency_job_id":"49d5a8be-c856-46e0-a70b-4678ee523aa8","html_url":"https://github.com/permissionlesstech/bitchat","commit_stats":null,"previous_names":["jackjackbits/bitchat","permissionlesstech/bitchat"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/permissionlesstech/bitchat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/permissionlesstech%2Fbitchat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/permissionlesstech%2Fbitchat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/permissionlesstech%2Fbitchat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/permissionlesstech%2Fbitchat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/permissionlesstech","download_url":"https://codeload.github.com/permissionlesstech/bitchat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/permissionlesstech%2Fbitchat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29473718,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T06:58:05.414Z","status":"ssl_error","status_checked_at":"2026-02-15T06:58:05.085Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-13T08:02:23.887Z","updated_at":"2026-02-15T08:37:07.324Z","avatar_url":"https://github.com/permissionlesstech.png","language":"Swift","funding_links":[],"categories":["others","Swift","Apps","📱 Mobile Development","Table of Contents"],"sub_categories":["Cross-Platform","Chat"],"readme":"\u003cimg width=\"256\" height=\"256\" alt=\"icon_128x128@2x\" src=\"https://github.com/user-attachments/assets/90133f83-b4f6-41c6-aab9-25d0859d2a47\" /\u003e\n\n## bitchat\n\nA decentralized peer-to-peer messaging app with dual transport architecture: local Bluetooth mesh networks for offline communication and internet-based Nostr protocol for global reach. No accounts, no phone numbers, no central servers. It's the side-groupchat.\n\n[bitchat.free](http://bitchat.free)\n\n📲 [App Store](https://apps.apple.com/us/app/bitchat-mesh/id6748219622)\n\n## License\n\nThis project is released into the public domain. See the [LICENSE](LICENSE) file for details.\n\n## Features\n\n- **Dual Transport Architecture**: Bluetooth mesh for offline + Nostr protocol for internet-based messaging\n- **Location-Based Channels**: Geographic chat rooms using geohash coordinates over global Nostr relays\n- **Intelligent Message Routing**: Automatically chooses best transport (Bluetooth → Nostr fallback)\n- **Decentralized Mesh Network**: Automatic peer discovery and multi-hop message relay over Bluetooth LE\n- **Privacy First**: No accounts, no phone numbers, no persistent identifiers\n- **Private Message End-to-End Encryption**: [Noise Protocol](https://noiseprotocol.org) for mesh, NIP-17 for Nostr\n- **IRC-Style Commands**: Familiar `/slap`, `/msg`, `/who` style interface\n- **Universal App**: Native support for iOS and macOS\n- **Emergency Wipe**: Triple-tap to instantly clear all data\n- **Performance Optimizations**: LZ4 message compression, adaptive battery modes, and optimized networking\n\n## [Technical Architecture](https://deepwiki.com/permissionlesstech/bitchat)\n\nBitChat uses a **hybrid messaging architecture** with two complementary transport layers:\n\n### Bluetooth Mesh Network (Offline)\n\n- **Local Communication**: Direct peer-to-peer within Bluetooth range\n- **Multi-hop Relay**: Messages route through nearby devices (max 7 hops)\n- **No Internet Required**: Works completely offline in disaster scenarios\n- **Noise Protocol Encryption**: End-to-end encryption with forward secrecy\n- **Binary Protocol**: Compact packet format optimized for Bluetooth LE constraints\n- **Automatic Discovery**: Peer discovery and connection management\n- **Adaptive Power**: Battery-optimized duty cycling\n\n### Nostr Protocol (Internet)\n\n- **Global Reach**: Connect with users worldwide via internet relays\n- **Location Channels**: Geographic chat rooms using geohash coordinates\n- **290+ Relay Network**: Distributed across the globe for reliability\n- **NIP-17 Encryption**: Gift-wrapped private messages for internet privacy\n- **Ephemeral Keys**: Fresh cryptographic identity per geohash area\n\n### Channel Types\n\n#### `mesh #bluetooth`\n\n- **Transport**: Bluetooth Low Energy mesh network\n- **Scope**: Local devices within multi-hop range\n- **Internet**: Not required\n- **Use Case**: Offline communication, protests, disasters, remote areas\n\n#### Location Channels (`block #dr5rsj7`, `neighborhood #dr5rs`, `country #dr`)\n\n- **Transport**: Nostr protocol over internet\n- **Scope**: Geographic areas defined by geohash precision\n  - `block` (7 chars): City block level\n  - `neighborhood` (6 chars): District/neighborhood\n  - `city` (5 chars): City level\n  - `province` (4 chars): State/province\n  - `region` (2 chars): Country/large region\n- **Internet**: Required (connects to Nostr relays)\n- **Use Case**: Location-based community chat, local events, regional discussions\n\n### Direct Message Routing\n\nPrivate messages use **intelligent transport selection**:\n\n1. **Bluetooth First** (preferred when available)\n\n   - Direct connection with established Noise session\n   - Fastest and most private option\n\n2. **Nostr Fallback** (when Bluetooth unavailable)\n\n   - Uses recipient's Nostr public key\n   - NIP-17 gift-wrapping for privacy\n   - Routes through global relay network\n\n3. **Smart Queuing** (when neither available)\n   - Messages queued until transport becomes available\n   - Automatic delivery when connection established\n\nFor detailed protocol documentation, see the [Technical Whitepaper](WHITEPAPER.md).\n\n## Setup\n\n### Option 1: Using Xcode\n\n   ```bash\n   cd bitchat\n   open bitchat.xcodeproj\n   ```\n\n   To run on a device there're a few steps to prepare the code:\n   - Clone the local configs: `cp Configs/Local.xcconfig.example Configs/Local.xcconfig`\n   - Add your Developer Team ID into the newly created `Configs/Local.xcconfig`\n      - Bundle ID would be set to `chat.bitchat.\u003cteam_id\u003e` (unless you set to something else)\n   - Entitlements need to be updated manually (TODO: Automate):\n      - Search and replace `group.chat.bitchat` with `group.\u003cyour_bundle_id\u003e` (e.g. `group.chat.bitchat.ABC123`)\n\n### Option 2: Using `just`\n\n   ```bash\n   brew install just\n   ```\n\nWant to try this on macos: `just run` will set it up and run from source.\nRun `just clean` afterwards to restore things to original state for mobile app building and development.\n\n## Localization\n\n- Base app resources live under `bitchat/Localization/Base.lproj/`. Add new copy to `Localizable.strings` and plural rules to `Localizable.stringsdict`.\n- Share extension strings are separate in `bitchatShareExtension/Localization/Base.lproj/Localizable.strings`.\n- Prefer keys that describe intent (`app_info.features.offline.title`) and reuse existing ones where possible.\n- Run `xcodebuild -project bitchat.xcodeproj -scheme \"bitchat (macOS)\" -configuration Debug CODE_SIGNING_ALLOWED=NO build` to compile-check any localization updates.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpermissionlesstech%2Fbitchat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpermissionlesstech%2Fbitchat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpermissionlesstech%2Fbitchat/lists"}