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

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

概要

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も携帯の電波もない人にメッセージ送る必要って、どんな時?

ちなみに、XにTestFlightのリンクがあるよ: https://x.com/jack/status/1941989435962212728 Jackが自分でコードをプッシュしてるのを見て驚いた。いいね、これ。

TestFlight自体のリンクはある?

面白いことに、彼のアカウントからのコミットはほんの数件だけだった。ほとんどは https://github.com/nothankyou1 からのものだったよ。

これはすごく面白いアプリだけど、Appleデバイス専用なんだよね。Android用の代替品もあるけど、例えばhttps://github.com/glodanif/BluetoothChatはBluetooth以外のネットワークなしでの近距離チャット専用で、暗号化もなく、IRCテーマでもない。

古いものが新しくなる… リポジトリの説明が2010年代のShortwaveアプリを思い出させる。https://medium.com/@alonsoholmes/wtfbeacon-how-shortwave-wor...

別のところでも言ったけど: https://en.m.wikipedia.org/wiki/FireChat このスレッドの人たちは、全然新しくないこの斬新なコンセプトにインスパイアされてるみたいだね。FireChatは実際、イラクや香港での抗議活動中に独裁政府に対抗するために使われたんだ。だから、ここで提案されているアプリの目指す目標にぴったり合ってるのに、製品としては失敗したんだよね。

これはBriarに似てるのかな?クールな機能として、投票を作成できるといいな。使い方?デモの真っ最中で、次はどこに行くか決める時とか。

ちょっと違うけど、主に音声用のアプリ「Murmur: Bluetooth Group Calls」を作ったんだ。Bluetooth LEの接続を使って、グループ音声通話やメッセージができるアプリだよ。AndroidとiOSで使えるよ。ダウンロードはあんまりされてないから、需要があるのかは微妙だけど、俺は自転車で妻と話すときにShokzの骨伝導ヘッドフォンを使ってるんだ(小さい娘二人の面倒を見るときにも使ってる)。

BLEの範囲はどれくらい?君が言った使い方でこのアプリを考えてたんだけど、自転車での距離によってどうなるのか気になってる。

いい技術だけど、具体的な使い道は何?SIMなしで海外旅行する時に使うのは想像できるけど、携帯ネットワークを使える時よりも良いの?

これは面白いね!真のメッシュネットワークBluetoothアプリだ。他に注目すべきはBriarだけど、デバイスの処理の仕方に問題があって、実際にはちゃんとしたメッシュ機能がないと思う(詳しくは: https://old.reddit.com/r/Briar/comments/gxiffy/what_exactly_... https://news.ycombinator.com/item?id=43363031)。それはさておき、質問なんだけど、Murmurは完全にエンドツーエンドで暗号化されてるの?それと、オープンソースなのかも気になるな。もしオープンソースでE2EEなら、実際のメッシュネットワークBluetoothアプリとしてめっちゃ役立つかも!

残念ながら、名前の衝突が発生してるよ。MumbleのVoIPサーバーコンポーネントも「Murmur」って呼ばれてるから、長い間そうなんだ: https://en.m.wikipedia.org/wiki/Mumble_(software)

技術的なホワイトペーパー: https://github.com/jackjackbits/bitchat/blob/main/WHITEPAPER... これがAppleのゲットーから抜け出す鍵なんだろうね。

ホワイトペーパーから: 「bitchatはBLE上でカスタムメッシュネットワーキングプロトコルを実装しています」なんでBluetooth SIGが2017年に発表したBLEメッシュネットワーキング標準を採用しなかったんだろうね。

AppleのFind Myネットワークにインスパイアされたコンセプトを考えてたんだけど、メッセージがデバイス間で飛び交う分散型の遅延耐性メッセージングシステムを想像してみて。BluetoothやUWB、Wi-Fi Directを使って、「Find My」が近くのiPhoneを通じて位置情報を中継するのと似た感じ。で、ちょっとひねりを加えて: • 送信者はメッセージを送るために少しの手数料を払う。 • 中継するデバイスはメッセージを一つ先に運ぶことでマイクロペイメント(トークンやサットなど)を得る。 • エンドツーエンドで暗号化されていて、完全に分散型、オプションで匿名。基本的には、伝統的なインターネット接続なしで人々のスマホ上に構築された「郵便ネットワーク」。インターネットが不安定な地域や検閲下で最適に機能する。明らかな課題: • レイテンシと信頼性(リアルタイムではない)。 • 悪用/スパム防止。 • 電力消費とユーザーのオプトイン。 • 実行可能なインセンティブ構造。どう思う?これって実現可能かな?実際に役立ちそうなユースケースはあるのか、それともただの面白い学術的なおもちゃなのかな?

面白い学問的なおもちゃだね。でも、大規模で長期的なインターネットの障害が起こる理由を予測できるなら別だけど。それを除けば、君のコンセプトに含まれているほとんどのもの(BTの代わりにインターネットを使ってるけど)は、Nostr+Lightningで既に存在してるよ。

不安定なインターネット環境や検閲下で最も効果を発揮します。 最初に思ったのは、これ逆じゃない?不安定なインターネット環境で最も効果的ってわけじゃなくて、参加デバイスがたくさんある場所でこそ効果的なんだよね。不安定なインターネット環境が必要とされるけど、そういう場所は参加デバイスが多い場所とは真逆の可能性が高いよ。

確かにこれでうまくいくかもね。メッシュネットワークの根本的な問題は、ノードがちゃんと動作しないと、悪意のある人が配信不能なメッセージや偽のノードでネットワークを洪水させることができることだよ。中央ノードのアドレス制御が唯一の解決策だと思う。支払いを通じて自律的に運営するのはいいアイデアだね。

検閲のある地域では、こういったサービスを単に禁止して、参加することを犯罪にするだけだよ。

FireChatからインスパイアされたの?