コンテンツへ移動

アーキテクチャ

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 はアプリごとのリリース数であり、プラットフォーム間では比較できません。