世界を動かす技術を、日本語で。

Bitchat – Bluetoothメッシュネットワーク上で動作する分散型メッセージングアプリ

2025年7月7日原文(github.com)

概要

bitchat は、インターネット不要で Bluetoothメッシュ ネットワーク上に構築される 分散型メッセージングアプリエンドツーエンド暗号化プライバシー保護 機能を搭載し、サーバーや電話番号が不要。 iOSmacOS で動作し、 パブリックドメイン で公開。 パフォーマンス最適化 や緊急データ消去機能も充実。 Android対応 も可能な設計。

bitchat:BluetoothメッシュP2Pメッセージングアプリの特徴

  • 分散型メッシュネットワーク :Bluetooth LEによる自動ピア発見とマルチホップ中継
  • エンドツーエンド暗号化 :X25519鍵交換+AES-256-GCMでプライベートメッセージを暗号化
  • ルームベースチャット :トピック別グループチャット、パスワード保護も選択可能
  • ストア&フォワード :オフラインピア向けにメッセージを一時保存、再接続時に配信
  • プライバシー重視 :アカウント・電話番号・永続識別子不要
  • IRC風コマンド :/join, /msg, /who など馴染みやすい操作体系
  • メッセージ保持 :ルームオーナーが制御するオプションの保存機能
  • ユニバーサルアプリ :iOS、macOSにネイティブ対応
  • カバートラフィック :タイミング難読化とダミーメッセージで通信分析対策
  • 緊急ワイプ :トリプルタップで全データ即時消去
  • パフォーマンス最適化 :LZ4圧縮、バッテリーモード適応、ネットワーク最適化

セットアップ手順

  • XcodeGen利用(推奨)
    • XcodeGenインストール:brew install xcodegen
    • プロジェクト生成:cd bitchat && xcodegen generate
    • プロジェクトを開く:open bitchat.xcodeproj
  • Swift Package Manager利用
    • プロジェクトを開く:cd bitchat && open Package.swift
    • ターゲットデバイス選択後、実行
  • 手動セットアップ
    • 新規iOS/macOSアプリ作成
    • bitchatディレクトリ内のSwiftファイルをすべて追加
    • Info.plistにBluetooth権限を追加
    • デプロイメントターゲットをiOS 16.0 / macOS 13.0に設定

基本コマンド一覧

  • /j #room:ルームに参加または新規作成
  • /m @user message:プライベートメッセージ送信
  • /w:オンラインユーザー一覧表示
  • /rooms:検出済みルーム一覧
  • /clear:チャットメッセージ消去
  • /pass [password]:ルームパスワード設定/変更(オーナーのみ)
  • /transfer @user:ルーム所有権移譲
  • /save:ルームのメッセージ保持切替(オーナーのみ)

利用開始方法

  • bitchatを起動し、ニックネームを設定(自動生成も可)
  • 近隣ピアと自動接続
  • /j #generalでルーム参加、またはパブリックチャット開始
  • メッセージはメッシュネットワーク経由で遠隔ピアにも中継

ルーム機能

  • パスワード保護 :オーナーが/passで設定
  • メッセージ保持/saveで強制保存を有効化可能
  • @メンション@nicknameでユーザー指定、オートコンプリート対応
  • 所有権移譲 :信頼できるユーザーに/transferで権限移譲

セキュリティ&プライバシー

  • 暗号化
    • プライベートメッセージ:X25519鍵交換+AES-256-GCM
    • ルームメッセージ:Argon2idパスワード導出+AES-256-GCM
    • デジタル署名:Ed25519によるメッセージ真正性保証
    • フォワードセキュリティ:セッション毎に新規鍵ペア生成
  • プライバシー機能
    • 登録不要:アカウント・メール・電話番号一切不要
    • デフォルトで揮発性:メッセージは端末メモリ上のみ
    • カバートラフィック:ランダム遅延・ダミーメッセージで通信分析防御
    • 緊急ワイプ:ロゴを3回タップで即時全データ消去
    • ローカルファースト:完全オフライン動作、サーバー非依存

パフォーマンス&省電力

  • メッセージ圧縮

    • LZ4圧縮:100バイト超のメッセージを自動圧縮、帯域30-70%節約
    • スマート圧縮:既に圧縮済みデータはスキップ
  • バッテリー最適化

    • 適応型パワーモード:バッテリー残量に応じて自動調整
      • パフォーマンスモード:充電中または60%以上
      • バランスモード:30-60%
      • 省電力:30%未満
      • 超省電力:10%未満で緊急モード
    • バックグラウンド効率化:アプリがバックグラウンド時は自動省電力
    • スキャン間隔もバッテリー状態で最適化
  • ネットワーク効率

    • 最適化Bloomフィルタ:重複検出高速化、省メモリ
    • メッセージ集約:小メッセージをまとめて送信
    • 接続数自動制限:パワーモードに応じてピア数調整

技術アーキテクチャ

  • バイナリプロトコル

    • 1バイトタイプフィールドのコンパクトパケット
    • TTLベースのメッセージルーティング(最大7ホップ)
    • 大容量メッセージの自動分割
    • 一意IDによるメッセージ重複排除
  • メッシュネットワーク

    • 各端末がクライアント兼ペリフェラルとして機能

    • 自動ピア発見・接続管理

    • オフライン配信のためのストア&フォワード

    • バッテリー最適化のための適応型デューティサイクル

    • 詳細なプロトコル仕様はTechnical Whitepaper参照

本番構築・配布

  • プロジェクト設定で開発チーム指定
  • コード署名を構成
  • App StoreまたはTestFlightで配布用にアーカイブ

Android互換性

  • プロトコルはプラットフォーム非依存設計
    • Bluetooth LE API利用
    • 同一パケット構造・暗号化方式
    • サービス/キャラクタリスティックUUIDも互換

bitchat は、真の オフグリッド通信プライバシー を両立する次世代メッセージングアプリ。 サーバーやインフラ不要で、緊急時や検閲回避にも活用可能。

Hackerたちの意見

これ、結構面白そうだね。見た感じ、ネイティブのiOS/MacOSアプリ(SwiftUI)みたい。Android版は見当たらないな。ちょっとシンプルすぎる感じもするけど、「もっと使いやすい」アプリに組み込めそうだね。

これ興味深いな。数ヶ月前にAndroid専用のブライアアプリが話題になってたけど、iOSはバックグラウンドでアプリが動かない問題があったんだよね。ここではどう解決されたのか気になるな。それと、"unlicense"って初めて見たわ。今日のラッキーな10,000人の一人かな。

Androidはないけど「作れる」ってこと? > プロトコルはプラットフォームに依存しないように設計されてるよ。Androidクライアントも作れるみたい。

Apple専用のユニバーサルアプリ。これのどこがユニバーサルなの?

うわ、これすごくいいね。Meshtasticに挑戦してるんだけど、特別なハードウェアが必要だから他の人を納得させるのが難しいんだよね。Appleが似たようなことをやってくれたら最高だな。AirTagsも同じアイデアを使ってるから、そんなに難しくないはずだよね?LoRAプロキシを作って範囲を広げる方法があったらもっと面白いな。自分のMeshtasticデバイスで試してみようかな。

自分もBluetoothトラッキングタグと同じようなアイデアのプロジェクトに取り組んでるよ。BLEとUDPで動くメッシュネットワーキング用のArduinoライブラリなんだけど、MQTTにもリンクできるんだ。MQTTノードは見えるパケットを適切なトピックにルーティングして、ローカルノードが欲しいトピックを購読するから、ゲートウェイを通じてどこでも誰とでも話せるはず。パケットの宛先アドレスはロールコードになってるから、チャンネルを見てるだけでは誰がオンラインか分からないよ、せいぜい1時間くらいしか。ウェブアプリもあって、公開MQTTブローカーと直接通信できて、チャットやセンサーデータも扱える。全てのペイロードはMessagepackで、新しいデータタイプを追加しやすくなってるし、全パケットは暗号化されて認証されて、タイムスタンプも付いてるから、リプレイ保護も少しあるよ。すべて純粋な対称暗号で、信頼は上位レイヤーに任せてるから、ハンドシェイクや接続状態管理のオーバーヘッドはないよ。MQTTゲートウェイを動かすために1時間に1回のアナウンスパケットだけが必要。LoRaは使ってないけど、トランスポートはモジュラーでプラグイン可能だから、簡単に追加できるよ。自分はここにLoRaのArduinoノードが1つしかないから、ドライバーを書くのは面倒でやってないけど。Pythonポートも作ってて、pipで簡単にインストールできるボットやホームオートメーションのこともやってるよ。 https://github.com/EternityForest/LazyMesh#

MeshtasticのUDPモードがBLEで動くといいな。少数のLoRaノードでつながったローカルBluetoothクラウド用に。

アンテナの効率にもよるけど、128kbpsのBLEモードがコーデッドPHYで1.5km以上の範囲をカバーできるって知って驚いた。もちろん2.4GHzだと視線の通る範囲だけど、それでも…

LoRaを混ぜると、P2Pのセル接続を求めるのと同じことになるよね。うちのスマホ同士、特別なインフラなしで合理的な距離で普通に話せるはずだよ。

いいね!これ、App Storeに公開できるのかな?それともAppleが禁止してるAPIを使ってる?最近のスマホって、モバイルネットワークやWi-Fiの範囲外だと全くコミュニケーションできないのが本当にイライラする。少なくとも、以前にメッセージをやり取りしたことがある人同士で、iMessageをピアツーピアで使えるようにするのはAppleにとって簡単なはず。AirDropがまさにそういう仕組みだし、「Notes」のテキストを行き来させるのはただの無駄だよね。

自分でこういうオープンソースのものを使える方が、Appleの「信じてくれ」ストアを使うより全然いい。

どんな使い方があるのか、ちょっと興味あるな。Bluetooth範囲内にいるのにWiFiも携帯の電波もない人にメッセージ送る必要って、どんな時?

Hacker Newsで議論の続きを見る