アーキテクチャ
bae は 1 つの Rust コアを、4 つのネイティブアプリから使います。製品を定義するもの、ライブラリモデル、インポート、再生、同期、暗号化は Rust にあり、すべてのプラットフォームで同じように動作します。各アプリは、その上にある薄いネイティブ UI です。
レイヤー
このセクションへのリンクbae-core: 製品本体です。ライブラリとメタデータモデル、インポートと識別のパイプライン、FFmpeg 再生エンジン、ラウドネス解析、エクスポート、下層の coven との統合を持ちます。インポートと識別はデスクトップでだけコンパイルされます。モバイルビルドは同期と再生のクライアントです。- coven: データレイヤーで、独立したライブラリです。coven は SQLite 接続を所有し、bae がコミットするすべての変更を捕捉し、その変更をユーザーのクラウドストレージ経由でエンドツーエンド暗号化して同期します。blob ストレージ(音声バイト列、アートワーク)、ローカルキャッシュ、身元鍵、メンバーシップも所有します。bae は coven の正確なリビジョンを固定し、すべてのバイナリに刻印します。それがビルド間の同期互換世代を定義します。
bae-bridge: UniFFI 境界です。ブリッジ型は Rust で一度定義され、ビルド時に Swift と Kotlin へ生成されます。- アプリ: macOS と iOS は SwiftUI、Android は Jetpack Compose、Windows はネイティブアプリです。それぞれ、コアが要求するプラットフォーム部分も実装します。音声出力、アートワークの文字認識、メディアコントロール、キーリングアクセス、クラッシュレポートです。
アプリの横には、bae-mcp(MCP サーバー)、bae-cli(コマンドライン)、bae-automation(両方が使う共有ツール層)があります。
ディスク上の 1 つのライブラリ
このセクションへのリンクライブラリは ~/.bae/libraries/<library-id>/(モバイルではプラットフォームのデータディレクトリ)にあります。
~/.bae/libraries/<id>/ library.db # SQLite: catalog, credits, playback specs config.yaml # device-local settings, never synced storage/ local/ # blobs this device owns (covers, artist images) cache/ # evictable copies of cloud blobs pinned/ # pinned-for-offline copies, never evictedデータベースは coven 経由でのみ開かれます。coven は bae のスキーマの横に自分の管理テーブル(同期カーソル、送信待ち、blob 状態)を重ね、bae のマイグレーションを実行します。管理外としてインポートされた音声ファイルは、~/.bae の下にはありません。データベースはインポート元のパスでそれらを参照します。
シークレットはこれらのファイルには入りません。身元鍵、ライブラリ暗号化鍵、クラウド認証情報、API トークンは OS のキーリングにあります(Apple プラットフォームでは Keychain、iCloud Keychain 経由で同期されます。他の場所では各プラットフォーム相当のものです)。
エディション
このセクションへのリンクすべてのプラットフォームに 2 つのビルド時エディションがあります。bae は OAuth プロバイダー(Google Drive、Dropbox、OneDrive)、CloudKit、テレメトリをコンパイルに含めます。baeium はそれらをすべて外します。S3 互換ストレージのみ、テレメトリなし、依存関係ツリーにプロプライエタリなものはありません。エディションは同じソースと同じコアを使います。機能フラグがプロバイダー一覧と診断の接続を決めます。
バージョニング
このセクションへのリンクアプリのバージョンは、プラットフォームごとに MAJOR.MINOR です。major は互換性の時代で、すべてのアプリで共有されます。同じ major のデバイスはライブラリを同期できます。これはワイヤー形式またはディスク上の形式が壊れる場合だけ上がり、多くの場合は固定された coven リビジョンが原因です。minor はアプリごとのリリース数であり、プラットフォーム間では比較できません。