1P by GN⁺ | ★ favorite | 댓글 1개
  • 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자: 국가·대규모 지역
  • 개인 메시지 라우팅은 사용 가능한 전송 수단을 자동으로 선택함
    1. 기존 Noise 세션을 이용할 수 있으면 빠르고 비공개성이 높은 Bluetooth 연결을 우선함
    2. Bluetooth를 사용할 수 없으면 수신자의 Nostr 공개 키와 NIP-17을 이용해 릴레이망으로 전송함
    3. 두 방식 모두 사용할 수 없으면 메시지를 대기열에 보관했다가 연결이 성립되면 자동으로 전달함
  • 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.bitchatgroup.<your_bundle_id>로 직접 변경해야 함
  • macOS에서는 brew install justjust run으로 설정과 소스 실행이 가능함
    • 이후 just clean을 실행하면 모바일 앱 빌드·개발을 위한 원래 상태로 복원됨
  • 현지화 리소스는 앱과 공유 확장에 나뉘어 있음
    • 기본 앱 문자열과 복수형 규칙은 bitchat/Localization/Base.lproj/Localizable.stringsLocalizable.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에서 확인할 수 있음

댓글과 토론

Hacker News 의견들
  • 어제 Radicle 데스크톱 클라이언트를 설치하고 새 사용자명과 비밀번호를 입력했지만 아무 일도 일어나지 않았음. 앱을 재시작해도 계정 생성·로그인 화면을 통과하지 못해 Radicle 사용은 거기서 끝남

  • 가용성을 중시한다면 libs.gms.location 의존성을 재검토하고 F-Droid에서도 배포해야 함(https://gitlab.com/fdroid/fdroiddata/-/merge_requests/24907#...)

    • 저장소 관리자가 PR 검토와 메시지 답변을 모두 중단한 듯함. 계속 진행하려면 누군가 포크해야 할 가능성이 큼
  • Fusion Festival에서 Bitchat을 켜고 돌아다니며 기기 약 20대와 메시지 몇 개를 발견했지만, 내가 보낸 메시지에는 아무도 답하지 않았음. 8만 명 중 20대라 사용자가 전혀 없는 것은 아니지만 많지도 않으며, 최대 2홉에 그쳐 행사장을 가로지를 만큼 충분한 밀도가 나오지 않았음

    • 여러 시위에서 사용됐고 현재 인도의 CJP 시위에서도 쓰이는 것으로 알고 있음. 인도 정부는 GitHub에 저장소 삭제도 요청함
    • 최소한 메시 Wi-Fi는 추가됐지만, 생사가 걸린 시위 상황을 제외하면 도입 속도가 상당히 느림
      좌석을 붙여 앉는 데 50달러를 더 내기 싫어 비행기에서 일행과 떨어졌을 때는 유용함
    • 이런 틈새 프로젝트에서 기기 20대면 이미 상당한 수치임
    • 실제로 작동한다는 점이 꽤 멋짐. 3만 명이 모인 축제에서 일행을 찾으려고 AirTag를 가져갔지만 완전히 먹통이었음
    • 마지막으로 사용했을 때는 ASCII 아트로 그린 히틀러 이미지만 올라와 있었음. 그래도 시작은 시작임
  • BitChat에 관심 있다면 인기를 얻거나 함께 쓸 사람을 만날 때를 대비해 일단 설치해둘 만함. 직접 시험해보니 Wi-Fi나 이동통신 없이 문자를 주고받는 느낌이 비현실적이었음

    • 붐비는 곳에 갈 때마다 실행해 확인해봄. 다만 메시가 아닌 인터넷 채팅에서는 지오해시보다 주변 기반 채팅이 있었으면 좋겠음. 지오시는 원하는 범위의 세밀도를 고르기 늘 어려움
      중첩 지오시도 괜찮겠지만, 무전기처럼 한쪽만 범위 안에 있으면 대화 절반만 보이는 혼란이 우려됨. 현재 지오시는 약 1에이커까지 좁혀져 지나치게 정밀하지만, 12층짜리 대학 기숙사 전체가 한 채팅방을 쓸 때는 유용할 수 있음
    • Bluetooth 채팅 앱은 이미 존재함. 작년에 유럽 Ryanair 항공편에서 떨어져 앉은 친구들과 대화하려고 App Store에서 찾아낸 Berkanan을 사용했는데, 외관은 형편없어도 기능은 제대로 작동했음
  • Radicle 사이트는 Git 저장소 플랫폼으로서 흥미로운 디자인을 보여줌. 전체 너비 여백, 잘 구성된 탐색 구조, 보기 좋은 코드 렌더링이 마음에 듦

    • 임의의 Git 저장소 URL을 연결해 같은 형태로 보여주는 서비스를 만들 수 있을지 궁금함
  • Bitchat은 AOS의 프로젝트임. 같은 AOS 프로젝트인 ngit에 다시 호스팅하지 않은 점이 의외임

    • ngit에 미러가 없는 것은 조금 의외지만, 주 호스팅 장소로 삼지 않은 것은 이해됨. 사람들이 실제로 발견할 수 있는 곳에 있어야 하기 때문임
      Nostr 순수주의에 빠지면 게시물을 보는 사람이 고작 5명뿐인 결과가 자주 나옴. 프로토콜은 좋아하지만 사용자를 늘리려면 사람들이 이미 있는 곳에 앱을 배치해야 함
  • 다른 탈중앙 메시징 제품인 Nostr나 XMTP와 비교해 특별한 기능이 있는지 궁금함