Lolly
アプリを開く

データ転送 - lolly-backup バンドル

Lollyユーザーが蓄積するすべてのデータはそのデバイス上にあります - アカウントもクラウドもありません。データ転送バンドルはその価値を移動させる手段です:あるインストールでエクスポートし、任意の方法(USB、AirDrop、自分宛メール、ネットワーク共有)でファイルを運び、別のインストールでインポートします。ファイルそのものが転送手段です。転送先はオフラインでもオンラインでも構いません。サーバーと一切通信しないため、違いはありません。

The two buttons that move a whole install: Export my data writes one zip, Import data reads it back signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KB自分で確認する署名済みファイルを取得The two buttons that move a whole install: Export my data writes one zip, Import data reads it back signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KB自分で確認する署名済みファイルを取得

このページはフォーマット仕様です。エンドユーザー向けの手順は作業を見つけて復元する → 作業を別のデバイスに移すを参照してください。実装はshells/web/src/data-transfer.tsで、tests/data-transfer.test.tsがラウンドトリップの契約を固定しています。

範囲。 バンドルが運ぶのはユーザーデータであり、カタログツールではありません。ツールとカタログアセットは別途同期され、転送先にはすでに存在している(最悪の場合はより新しいバージョンで)ことが前提です。ユーザー自身が作成したツールはprofile.jsonの中を運ばれます。インポートがカタログツールをインストールしたりアップグレードしたりすることは決してありません。

目標

エンベロープ

バンドルは通常の .zip です。ダウンロードは所有者にちなんで命名されます - LollyTools-<First>-<Last>-<YYYY-MM-DD>-<n>.zip(例:LollyTools-Ada-Lovelace-2026-06-26-1.zip)- これによりバックアップが溜まったDownloadsフォルダでも判読しやすくなります。名と姓の部分はプロフィールから取得され、未設定の場合は省略されます。プロフィールがない場合は LollyTools-2026-06-26-1.zip に、名だけの場合は LollyTools-Ada-2026-06-26-1.zip になります。各部分はファイル名に安全なトークンにサニタイズされます(Unicodeの文字・数字は保持し、スペース・句読点は除去、最大32文字)。<n> は日単位・デバイス単位の連番なので、同じ日に複数回エクスポートしても衝突せず順序が保たれます。名前の生成はshells/web/src/data-transfer.tsの backupFilename() が行います。zipの中身は名前に関わらず同一です。内訳:

パス必須内容
manifest.jsonはいフォーマットid、バージョン、件数、パートごとの整合性情報。リーダーが最初に確認する項目。
profile.json設定時のみユーザーのmeレコード全体: 氏名、連絡先、顔写真の参照、フラグに加え、フォルダー、ゴミ箱、プロジェクトの雛形、ユーザーテンプレートとユーザー自作のツール、お気に入り、非表示にしたツール、言語と絵文字の選択。host.profile経由で読み取られる。
sessions.jsonはい保存済みのすべてのセッション: スロット、ツールid/バージョン、ラベル、サムネイル(data-URL)、完全な入力データ。host.state経由で読み取られる。
assets.jsonはいアップロードされた各アセット(画像、フォント、ブランドトークン、ロゴ、ダウンロードの保存コピー)のメタデータ。それぞれassets/blobs/以下の実バイトを指している。
assets/blobs/<n>.<ext>アセットごとアセットの生バイト(画像・フォントファイル)。無圧縮で保存(すでに圧縮済みのフォーマットのため)。拡張子は表示上のもの。正式なMIMEはassets.json側が権威を持つ。
assets/blobs/<n>.c2pa存在する場合抽出されたContent Credentialsを、正確なバイナリバイト列として保存したもの。アセットレコードの_credentialFileから参照される。これらはデバイスの署名鍵ではない。
design-systems.json存在する場合このインストールで作成または追加されたデザインシステムを{ active, records }として保存。インポート時はidで統合され、バンドルのアクティブな選択は転送先が自身のデザインシステムを持たない場合にのみ適用される。
file-history.json任意バージョン管理されたアセットのスナップショット、確定したファイル操作のレポート、完全なバッチマニフェスト。この履歴パートは独自のバージョンを持ち、シェル内部のfileHistoryバックアップアダプターによって提供される。
revision-history.json任意、手動バックアップ安定した作成物ID、保持されたチェックポイント、サムネイル、更新され続ける復旧用ドラフト。対応している場合はhost.state.history.backupによって提供される。
file-history/versions/スナップショットごと以前のアセットのバイト列と抽出済みの認証情報。現在のアセットがまだ存在するかどうかとは無関係。
file-history/results/完了した操作ごと正確な出力バイト列。変換対象として選択された元のファイルは保持も同梱もされない。
prefs.jsonはいユーザー所有のローカル環境設定: theme、sidebarWidth、ct-metricsのアクティビティ集計。
lolly.txtはいLollyを使わずzipを開いた人向けに、バンドルの内容(件数、プロフィール、ファイル名)を人間可読な形でまとめたもの。エクスポートのたびに再生成され、インポート時には認識されるため、スキップされたパートとしてカウントされることはない。整合性マップの後に書き込まれるため、その対象外となる。

バンドルはあえて通常のzipにしてあります。どんな転送手段でも無傷で残り、どの解凍ツールでも中身を確認できます。

profile.json は最小のパートであり、アプリ内でリーダーが最初に目にするものでもあります。作成者が一度だけ入力する詳細情報と、それをツールが利用できるようにするオプトインです。

profile.json になるプロフィール詳細フォーム: 氏名、連絡先、プロフィール写真 signed by Lollyvector SVG15 paths~1.2k nodes30 groups1 image40 KB自分で確認する署名済みファイルを取得

manifest.json

{
  "format": "lolly-backup",
  "formatVersion": 3,
  "minReader": 1,
  "app": "lolly",
  "exportedAt": "2026-06-22T09:30:00.000Z",
  "counts": { "profile": true, "sessions": 2, "userAssets": 4, "prefs": 3, "assetVersions": 1, "fileOperations": 1 },
  "integrity": {
    "profile.json": "sha256-…",
    "sessions.json": "sha256-…",
    "assets.json": "sha256-…",
    "assets/blobs/0.bin": "sha256-…",
    "file-history.json": "sha256-…",
    "file-history/versions/0.bin": "sha256-…",
    "file-history/results/0.bin": "sha256-…",
    "prefs.json": "sha256-…"
  }
}
フィールド意味
format常に lolly-backup。これがないファイルは「not a Lolly backup」として拒否される。
formatVersionこのバンドルが書き込まれた際のレイアウト。パート構成や形状の変更のたびに繰り上がる。リーダーはこれをゲート条件にはしない。
minReaderこのバンドルを安全にインポートするために必要な最小のリーダーバージョン。リーダーがゲート条件とするのはこのフィールド。
app診断用の、生成したアプリのid。
exportedAtバンドルが作成されたISOタイムスタンプ。
counts書き込み側が入れた内容(表示と整合性チェック用)。
integrity任意。manifest.json を除くすべてのパートを、その無圧縮バイトのSRI形式 sha256-<base64> ダイジェストに対応付ける。

バージョンポリシー(前方互換性)

formatVersion と minReader を分けていることが、古いインストールを取り残すことなくフォーマットを進化させられる理由です。

作成者向けの経験則: 既存のすべてのリーダーが、あなたの追加を無視しても正しく動作し続けるなら、それは加算的な変更です - formatVersion を繰り上げ、minReader はそのままにします。そうでなければ minReader を引き上げてください。

整合性

manifest.integrity が存在する場合、リーダーは何かを書き込む前に、記載された各パートのSHA-256を検証します。不一致(「failed its integrity check」)や欠落パート(「incomplete」)が見つかると、インポート全体が中止されます - 部分的な復元は行われません。これにより、ファイル転送によって生じうる破損(途切れたAirDrop、添付ファイルを再エンコードするメールゲートウェイ、不良なUSBセクタなど)を検出できます。

整合性チェックは設計上ベストエフォートです。書き込まれるのはWeb Cryptoが利用可能な環境(すべてのセキュアなブラウザコンテキストと最近のNode)のみで、検証されるのはマップとWeb Cryptoの両方が揃っている場合のみです。マップを持たないバンドル - 例えば整合性機能が存在する前に作られたもの - は、そのままインポートされます。「検証できない」ことが「破損している」と扱われることは決してありません。

マニフェストは、自分自身も再生成された lolly.txt READMEも一覧に含めません。ダイジェストが対象とするのは、マニフェストが保証するパートのみです。

インポートのセマンティクス

インポートはマージであり、全置換になることは決してありません:

保存済みセッションは画像に自動的に再リンクされます:アセット参照はidで保持され、アップロード画像が復元された後にブリッジがそれらを再解決します(blob: URLはリロードを跨いで残らないため、いずれにせよ必要な処理です)。

インポートのサマリーは { profile, sessions, userAssets, prefs, skipped, failedAssets } を報告します。failedAssets は復元できなかったアップロード済みアセットの数です(例えばデバイスのストレージが満杯の場合など)。これは skipped とは別物で、skipped は前方互換な新しいライターに由来し、このビルドが認識しなかったパートの数を表します。UIは skipped を表示するため(「… · N newer items skipped」)、復元がどこを取りこぼしたかについて正直です。

ファイル履歴が存在する場合、サマリーにはassetVersions、fileOperations、failedHistoryも含まれます。ストレージ枯渇や不変ID同士の衝突は部分的な復元を招くことがあり、UIはユーザーに元のバックアップを保持しておくよう伝えます。クラウド同期は、部分的または非対応の復元の後に適用済みリビジョンを進めることはありません。そのためスナップショットは再試行のために利用可能なまま残ります。復元は、プロフィール・セッション・アセット・履歴の全ストアにまたがる単一のトランザクションではありません。

作成履歴(v3)

履歴機能に対応したWebホストからの手動バックアップには、独自の{ version: 1, documents, revisions, recoveries }スキーマを持つrevision-history.jsonが含まれます。これは、保持されたID、正規化された入力のスナップショット、バージョンのスタンプ、ラスタープレビュー、そして書き手ごとに分かれたドラフトを運びます。履歴アダプターは、現行セッションとそのheadを1回の読み取りトランザクションで取得します。sessions.jsonは、それより古いリーダーのために同じ現行スナップショットを使用します。

復元は、アーカイブを1つのトランザクションとしてコミットする前に、ペイロードのSHA-256とバイト数、一意な識別子、ドキュメントとheadの関係、系譜、タイムスタンプ、プレビューの種類、上限をチェックします。圧縮された親への参照が存在しないこともあります。既存の現行の作業がサイレントに置き換えられることは決してありません: 作品が両側にある場合、現行として残らなかった側は保護されたドラフトになります。アーカイブの384MiBという転送上限は明示的にチェックされ、ストレージの上限は、保持されたチェックポイントを切り詰めることなく適用されます。バックアップ全体は依然としてメモリ内のZIP実装を使用しており、ストリーミング方式のアーカイブではありません。

サマリーには、このインポートが追加した分だけを数えるrevisionsとrecoveryDraftsに加えて、各作品がどのようにマージされたかを示すadded、kept、replaced、copies、hiddenが追加されます。この機能を持たないシェルは通常のセッションのみを復元し、履歴パートをスキップ済みとして報告します。ネイティブファイルシステムの履歴は、そのアダプターが永続的な履歴トランザクションを提供するまで未対応のままです。P2Pゲストの状態には永続的な履歴も復旧用アーカイブもありません。

個人のスナップショット同期は、作成履歴を明示的に対象外とします。履歴を持つローカルドキュメントにスナップショットを適用すると、それ以前の作業状態は別の復旧用ドラフトとして保持され、開いているエディタの書き込みトークンはすべて無効化されます。不変のチェックポイントはデバイス上に残ります。これはスナップショットの置き換え中にローカルの履歴を保護するためのものであり、複数デバイスの履歴を統合するものではありません。

過去のアセット参照は保持されますが、レンダリングは引き続き転送先の既存ライブラリを通じてアセットを解決します。このアーカイブは、過去のアセットのバイト列や過去のツールのレンダリング結果を正確に保証するものではまだありません。アセットバージョンとファイル結果のバイト列は、引き続き既存の別のバックアップパートを通じて運ばれます。

保存済みバージョンとファイル結果(v2)

任意の履歴パートには{ version: 2, assetVersions: [...], operations: [...], batches: [...] }が含まれます。リーダーは、batchesを持たない以前のhistory-v1形式も受け付けます。各スナップショットは、安定したアセットIDと正確なバージョン、保存時刻、バイト長、16進SHA-256を識別し、さらに_fileと任意の_credentialFileがバイナリパートを指すアセットレコードを伴います。操作は、元のファイルの事実関係、リクエスト、レポート、タイムスタンプ、任意の結果_fileを運びますが、ストレージバックエンド名、OPFSハンドル、実行リースは運ばれません。history-v1のみに対応する古いリーダーは、バッチのメンバーシップをサイレントに落とすのではなく、インポート前に新しい履歴バージョンを拒否します。

バッチマニフェストは、一度も読み取られなかったファイル、キャンセルされたメンバー、結果の保存領域確保に失敗したもの、中断された作業を含め、処理前に選択されたすべてのソースを記録します。各メンバーは、安定した操作ID、ソースの参照/事実関係、要求された出力名、確定したレポートを持ちます。未読のソースは、でっち上げのダイジェストではなく、宣言された事実関係を持ちます。インポートは、メンバーの識別情報と、運ばれてきた操作レポートとの整合性を検証します。個々の結果が明示的に削除された後もバッチレポートは利用可能なままですが、その受領記録は出力バイト列がまだ保存されていることを意味しません。

古いリーダーも引き続きv2のエンベロープ(minReader: 1)を受け入れ、見慣れたパートを復元し、対応していない履歴パートはスキップ済みとして数えます。完全な履歴復元にはfileHistoryアダプターを持つシェルが必要です。これはシェル内部の接点であり、ツール向けの新しいHostV1ケイパビリティではありません。実際の2台間の復元は、ローカルのChromiumゲートで検証されます。インストールされたTauri/iOS/Androidでの復元の受け入れ検証は、別途行われます。

転送されないもの

ストレージメーターも同じ区分けを項目別に示します。保存済みセッション、自分の画像、そしてファイルの結果とバージョンはバンドルに含まれます。その下にあるアセットキャッシュ、ツールプレビュー、オフラインピンはすべて再導出可能なため、残されます。

このデバイスのデータを名前付きカテゴリーに分解して表示するストレージメーター。Saved sessionsとMy imagesはAsset cacheとは別に集計されている。ここではまだすべてのカテゴリーが空の新規インストール状態 signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KB自分で確認する署名済みファイルを取得このデバイスのデータを名前付きカテゴリーに分解して表示するストレージメーター。Saved sessionsとMy imagesはAsset cacheとは別に集計されている。ここではまだすべてのカテゴリーが空の新規インストール状態 signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KB自分で確認する署名済みファイルを取得

クロスシェルの保証

data-transfer.tsは、ケイパビリティブリッジ(host.profile、host.state、host.assets)と共有のlocalStorageのprefsだけを通じて読み書きします。同じモジュールが、IndexedDBまたはファイルシステムのストレージを介して、Webでもtauriでも共通のエンベロープを読み書きします。任意の履歴パートは、対応するアダプターが利用可能な場合にのみ現れ、対応していないパートはインポート時にスキップ済みとして報告されます。ヘッドレステストスイートはインメモリのブリッジに対して共通パートを検証し、履歴のトランザクションについては実ブラウザでのテストも別途あります。

この保証の外にあるシェルが2つあり、それぞれ理由が異なります。

予約された拡張ポイント

エンベロープはマニフェストと名前付きパーツの集合として設計されているため、新しい種類の移植可能なデータを破壊的変更なしに後から乗せられます。それらは追加的なパーツとして組み込まれ(新しいformatVersion、同じminReader)、現在のリーダーは認識しないものをスキップします。これらはまだ実装されていません。将来これらが導入されたときにフォーマットの一貫性を保つため、名前だけをここで予約しています。

これらの予約名と上記のパーツ以外のものは、リーダーから見ると未知のパーツです。手を加えられずに残り、skipped にカウントされます。

リファレンス