このプロジェクトについて

Tandemは、プレリリース段階(0.1.0、タグ付きリリースは未実装)のセルフホストプロジェクトであり、「本を読み、同じ本を聴き、決して場所を見失わない」ことを目標としています。サーバーはPostgreSQLおよびウェブアプリと共にDockerで動作し、React PWAとKotlin/Jetpack ComposeによるAndroidアプリがシンクライアントとして機能します。サーバーがすべてのステートフルな処理を担い、電子書籍とオーディオブックのボリュームのスキャン、メタデータとカバーの抽出、電子書籍とオーディオブックのペアリング、文字起こしキューの実行、同期マップの生成を行い、読書位置の唯一の書き込み権限を持ちます。クライアントはJWT認証を用いたRESTエンドポイントを通じて位置情報を読み書きし、デバイスローカルのキャッシュのみを保持します。 最大の特徴は、フォーマット間での文レベルのハンドオフ機能です。読書からリスニング(またはその逆)に切り替えた際、デバイスを跨いで章の先頭ではなく、直前にいた文から再開できます。これには文字起こしが必要であり、オーディオブックを文字起こししてEPUBテキストと整合させます。Whisperは、オプションのローカルスタックで構築されたサーバーイメージ内でローカルに実行することも可能ですし、デフォルトでは個別のJetsonワーカー(faster-whisperを使用。リファレンス展開はOrin Nano 8 GBで、デフォルトはmediumモデル)にジョブが割り当てられます。リトライ機能付きの文字起こしキュー、オフピーク時間帯の設定、および文字起こしエディタが付属しています。文字起こしはオプションであり、これを行わない場合でもライブラリと2つのリーダーは利用可能ですが、フォーマット間の同期は行われません。 その他の機能として、シリーズグループ化と電子書籍/オーディオブックの自動ペアリングを備えたライブラリスキャナー、ロック画面コントロール付きのPWAウェブリーダー/プレイヤー(iOSアプリがないためiPhone向けに提供)、オフラインダウンロード、バックグラウンド再生、Android Autoに対応したAndroidリーダー/リスナー、ロール付きのマルチユーザーアカウント(デフォルトでは招待制登録)、オプトイン統合(Audiobookshelf、Google Books、Open Libraryメタデータ、および専用イメージビルドを必要とするACSM/Audibleインポート)、UIから復元可能な夜間のPostgresダンプおよびカバースナップショットが挙げられます。 デプロイはDocker Compose経由で行われます。READMEには、シークレット(JWTキー、Postgresパスワード、secrets/下のFernet資格情報暗号化キー)は環境変数ではなくファイルに保存すべきであること、キューとスケジューラがプロセスローカルであるためサーバーは単一プロセスで動作させる必要があること、および新規インストール時にはランダムに生成されたパスワードを持つスーパーアドミンが作成されログに書き出されるため、初回ログイン時にリセットが強制されることが明記されています。リバースプロキシの設定にはFORWARDED_ALLOW_IPSの設定が必要であり、堅牢化されたCaddyfileの例が提供されています。詳細な環境変数テーブルで、必須、オプション、認証スロットリング、アップロード制限、同期調整設定がカバーされており、APIドキュメント(/docs, /redoc)は本番環境では意図的に無効化されています。 文書化された制限事項は率直です。同期はEPUBのみ(PDFはペアリング可能だが整合は不可、MOBI/AZW3は変換が必要)、オーディオブックは単一ファイルである必要がある(複数ファイルのリップはスキップされるため、先に.m4bにマージすること)、文字起こしは一度に1つまで、水平スケーリング不可、iOSアプリなし、Android Autoはハードウェア未テスト、クラッシュレポート機能なし、ダウンロード/ストリーミングパスは最近実装されたばかりであり、アプリストアには一切公開されていない点です。このプロジェクトは、実際のテストスイートを備え日常的に使用されている単一メンテナーによる取り組みであり、作者以外のハードウェアやライブラリ構成への露出は限られていると説明されています。