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

Bentoはオープンソースのオフィススイートであり、その中心となる考え方は「文書がソフトウェアである」というものだ。プレゼンテーションは、自身のビューア、プレゼンター、エディタを内包する単一の自己完結型HTMLファイルである。任意のモダンブラウザで開けばそれがエディタとなり、保存すれば自身のデータブロックを書き換える。最初のアプリであるBento SlidesはPowerPointの代替であり、約560KBの1ファイル(Bento_Slides.bento.html)として配布され、アカウントもインストーラも不要である。 READMEに記載されている主な機能: - 1ファイルでのポータビリティ: デッキ、フォント、画像、チャート、アニメーション、そして完全なエディタが一緒に移動する。文書データはファイル冒頭付近のプレーンで可読なJSONブロックに格納されるため、外部ツールから検査および編集が可能である。 - 自己保存: 保存時にはFile System Access APIを通じてファイルが自身のデータブロックを書き換える。ダウンロードへのフォールバックもある。 - モーフプレゼンテーション: 同じidを共有する要素は、スライド間で位置、サイズ、色、グラデーションがアニメーションする。これはDOMではなく文書モデルから計算される。 - ライブコラボレーション: エンドツーエンド暗号化(AES-GCM)を採用し、鍵はサーバーではなくファイル内に保存される。オプションのブラインド同期リレーは暗号文のみを保存する。マージには独自のCRDTを使用し、文字レベルのテキストマージを行い、収束テストスクリプトによるファズテストが実施されている。 - 組み込みチャート: 棒、折れ線、円、散布図を依存関係のないエンジンで描画し、プレゼンテーション中はインタラクティブで、チャート種別間でデータがモーフする。 - AIフレンドリーな形式: 文書がプレーンJSONであるため、ファイルベースのエージェント(Claude Code、Cursor、Aider)が.bento.htmlをその場で編集でき、チャットボットはwindow.bento.loadDocを通じてJSONを往復変換できる。Ollama、llama.cpp、LM Studioを介したローカルのオープンウェイトモデルでオフライン動作することが文書化されている。 - 署名付き自己更新: リリースはECDSAで署名され、アプリ内で提供される。更新は新しいファイルを書き込み、古いファイルはロールバックとして残る。 - その他の記載機能: スピーカービュー、コメント、レイアウト、非表示のインタラクティブ状態、ホバー表示、モーションパス、PDFエクスポート、ページサイズ、8つのUI言語。 アーキテクチャは、TypeScriptの文書モデル(slides/src/model.ts)と、エディタキャンバス、サムネイル、プレゼンモードで使用される単一のレンダラーとして要約されている。ナビゲーションはReveal.jsが駆動し、アニメーション、チャート、コラボレーションは独自コンポーネントである。シェルは文書ブロックをプレーンテキストのままにして約560KBに圧縮される。 READMEはセキュリティモデルについて率直に述べている。コラボレーション鍵はクライアント側で生成されファイル内にのみ存在するため、ファイルを所持することがメンバーシップを意味し、鍵のローテーションが失効となる。リレーは暗号文、接続タイミング、ルーム鍵のハッシュを見ることができる。プレゼンス名は証明ではなく主張である。更新チェックは静的マニフェストを取得し、署名、ハッシュ、バージョンの単調性を検証する。既知のトレードオフには、ライブコラボレーション中のスナップショットベースのundoや、デスクトップ優先の編集体験が含まれ、スマートフォンは閲覧とプレゼンテーションにより適している。 ソースからのビルドにはNode 20以上とnpmが必要で、アプリはバックエンドのないシングルページビルドである。コマンドにはnpm run dev、npm run build:single、CRDT収束テストスクリプトが含まれる。リリースはローカルで作成されるため、署名鍵はメンテナーのマシン上に留まる。ドキュメントはアーキテクチャ、規範的なbento/slides形式仕様、コラボレーション設計と脅威モデル、エージェントガイドをカバーしている。ロードマップでは将来のアプリとしてbento/spaces(ノート)、bento/dash(シートとテーブル)、bento/vaultが挙げられており、それぞれが独自の.bento.html配布物となる。すべてはMITライセンスで、バンドルされたランタイムコンポーネントはMIT、埋め込み書体はOFLの下にある。