- Bitchat은 Bluetooth 메시 네트워크와 인터넷 기반 Nostr를 결합해 계정·전화번호·중앙 서버 없이 작동하는 iOS·macOS용 탈중앙 P2P 메시징 앱임
- 오프라인에서는 Bluetooth LE로 최대 7홉 중계를 지원하고, 인터넷 연결 시 290개 이상의 Nostr 릴레이를 통해 전 세계 및 위치 기반 채널에 연결함
- 개인 메시지는 Bluetooth의 Noise Protocol을 우선 사용하고, 연결할 수 없으면 Nostr의 NIP-17로 전환하며, 둘 다 불가능하면 전송할 수 있을 때까지 대기열에 보관함
- geohash 정밀도에 따라 블록·동네·도시·주·국가 단위 채널을 제공하며,
/slap, /msg, /who 같은 IRC식 명령과 세 번 탭해 데이터를 지우는 Emergency Wipe를 지원함
- 프로젝트는 퍼블릭 도메인으로 공개됐으며 Xcode 또는
just로 실행할 수 있지만, 실제 기기 빌드에는 Developer Team ID와 entitlement 설정이 필요함
Bluetooth와 Nostr를 결합한 전송 구조
- Bitchat은 Bluetooth 메시와 Nostr를 결합한 iOS·macOS 네이티브 앱이며 App Store에서도 제공됨
- Bluetooth 메시 네트워크는 인터넷 없이 주변 기기를 자동으로 탐색하고 연결함
- Bluetooth LE로 직접 P2P 통신하며, 인접 기기를 거쳐 최대 7홉까지 메시지를 중계함
- Noise Protocol 기반 종단 간 암호화와 순방향 비밀성을 지원함
- Bluetooth LE 제약에 맞춘 압축 바이너리 패킷 형식과 배터리 최적화 듀티 사이클을 사용함
mesh #bluetooth 채널은 시위·재난·외딴 지역 등의 오프라인 통신을 대상으로 함
- Nostr 전송 계층은 290개 이상의 전 세계 릴레이를 통해 인터넷 메시징을 제공함
- geohash 좌표로 위치 기반 채팅방을 만들고, 지역마다 새로운 임시 암호화 신원을 사용함
- 개인 메시지는 NIP-17 gift wrapping으로 보호함
- 위치 채널은 인터넷 연결이 필요하며 지역 커뮤니티, 현지 행사, 지역 토론에 활용됨
block 7자: 도시 블록
neighborhood 6자: 구역·동네
city 5자: 도시
province 4자: 주·도
region 2자: 국가·대규모 지역
- 개인 메시지 라우팅은 사용 가능한 전송 수단을 자동으로 선택함
- 기존 Noise 세션을 이용할 수 있으면 빠르고 비공개성이 높은 Bluetooth 연결을 우선함
- Bluetooth를 사용할 수 없으면 수신자의 Nostr 공개 키와 NIP-17을 이용해 릴레이망으로 전송함
- 두 방식 모두 사용할 수 없으면 메시지를 대기열에 보관했다가 연결이 성립되면 자동으로 전달함
- LZ4 메시지 압축, 적응형 배터리 모드, 네트워크 최적화, IRC식 명령과 세 번 탭해 모든 데이터를 즉시 삭제하는 Emergency Wipe도 제공함
- 자세한 프로토콜은 Technical Whitepaper에서 확인할 수 있음
빌드와 현지화, 라이선스
- Xcode에서 실행하려면 저장소에서 다음 명령을 사용함
cd bitchat
open bitchat.xcodeproj
- 실제 기기에서 실행하려면 로컬 설정과 코드 서명을 준비해야 함
cp Configs/Local.xcconfig.example Configs/Local.xcconfig로 설정 파일을 복제함
- 새 파일에 Developer Team ID를 추가하면 기본 Bundle ID가
chat.bitchat.<team_id>로 설정됨
- entitlement의
group.chat.bitchat을 group.<your_bundle_id>로 직접 변경해야 함
- macOS에서는
brew install just 후 just run으로 설정과 소스 실행이 가능함
- 이후
just clean을 실행하면 모바일 앱 빌드·개발을 위한 원래 상태로 복원됨
- 현지화 리소스는 앱과 공유 확장에 나뉘어 있음
- 기본 앱 문자열과 복수형 규칙은
bitchat/Localization/Base.lproj/의 Localizable.strings와 Localizable.stringsdict에 추가함
- 공유 확장 문자열은
bitchatShareExtension/Localization/Base.lproj/Localizable.strings에서 관리함
- 키는
app_info.features.offline.title처럼 의도를 드러내도록 작성하고, 가능한 한 기존 키를 재사용함
- 현지화 변경은
xcodebuild -project bitchat.xcodeproj -scheme "bitchat (macOS)" -configuration Debug CODE_SIGNING_ALLOWED=NO build로 컴파일을 확인함
- 프로젝트는 퍼블릭 도메인으로 배포되며 세부 조건은 LICENSE에서 확인할 수 있음