Lolly
Buka Aplikasi

Transfer Data - bundel lolly-backup

Semua yang terkumpul dari pengguna Lolly berada di perangkatnya - tanpa akun, tanpa cloud. Bundel transfer data adalah cara nilai itu berpindah: ekspor di satu instalasi, bawa file dengan cara apa pun (USB, AirDrop, email ke diri sendiri, berbagi jaringan) dan impor di instalasi lain. File itu adalah transportnya. Target bisa offline atau online. Tidak ada bedanya, karena tidak ada yang pernah berbicara dengan server.

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 KBPeriksa sendiriAmbil file bertanda tanganThe 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 KBPeriksa sendiriAmbil file bertanda tangan

Halaman ini adalah spesifikasi formatnya. Untuk panduan langkah demi langkah bagi pengguna akhir lihat Temukan dan pulihkan karya Anda → Pindahkan karya Anda ke perangkat lain. Implementasinya ada di shells/web/src/data-transfer.ts, dan tests/data-transfer.test.ts mengunci kontrak bolak-balik (round-trip).

Cakupan. Sebuah bundel membawa data pengguna, bukan tool katalog. Tool katalog dan aset katalog disinkronkan secara terpisah dan diasumsikan sudah ada di target (dalam kasus terburuk pada versi yang lebih tinggi); tool yang dibuat sendiri oleh pengguna berpindah di dalam profile.json. Mengimpor tidak pernah menginstal atau meningkatkan tool katalog.

Tujuan

Amplop

Sebuah bundel adalah .zip biasa. Unduhan diberi nama sesuai orang yang memilikinya - LollyTools-<First>-<Last>-<YYYY-MM-DD>-<n>.zip (misalnya LollyTools-Ada-Lovelace-2026-06-26-1.zip) - sehingga folder Downloads berisi cadangan tetap mudah dibaca. Bagian nama depan dan belakang berasal dari profil dan dihilangkan jika tidak diatur. Tanpa profil menghasilkan LollyTools-2026-06-26-1.zip, dan hanya nama depan menghasilkan LollyTools-Ada-2026-06-26-1.zip. Setiap bagian dibersihkan menjadi token yang aman untuk nama berkas (huruf/angka Unicode dipertahankan, spasi/tanda baca dihapus, dibatasi hingga 32 karakter). <n> adalah urutan per hari, per perangkat, sehingga ekspor berulang di hari yang sama tidak bertabrakan dan tetap berurutan. backupFilename() di shells/web/src/data-transfer.ts membuat nama tersebut. Isi zip identik terlepas dari namanya. Di dalamnya:

PathWajibIsi
manifest.jsonyaId format, versi, jumlah dan integritas per bagian. Hal pertama yang dilihat pembaca.
profile.jsonjika diaturRekaman me lengkap milik pengguna: nama, kontak, ref headshot dan flag, plus folder, Trash, blueprint proyek, template pengguna dan tool buatan pengguna, favorit, tool tersembunyi, pilihan bahasa dan emoji. Dibaca lewat host.profile.
sessions.jsonyaSetiap sesi tersimpan: slot, id/versi tool, label, thumbnail (data-URL) dan data input lengkap. Dibaca lewat host.state.
assets.jsonyaMetadata untuk setiap aset yang diunggah (gambar, font, token brand, logo, salinan tersimpan dari unduhan), masing-masing menunjuk ke byte-nya di bawah assets/blobs/.
assets/blobs/<n>.<ext>per asetByte aset mentah (file gambar dan font). Disimpan tanpa kompresi (format yang sudah terkompresi). Ekstensinya bersifat kosmetik. MIME di assets.json adalah yang otoritatif.
assets/blobs/<n>.c2pajika adaContent Credentials yang diekstrak sebagai byte biner persis, dirujuk oleh _credentialFile dalam rekaman aset. Ini bukan kunci penandatanganan perangkat.
design-systems.jsonjika adaDesign system yang dibuat atau ditambahkan pada instalasi ini, sebagai { active, records }. Digabung berdasarkan id saat impor; pilihan aktif bundel berlaku hanya ketika target belum memiliki design system sendiri.
file-history.jsonopsionalSnapshot aset berversi, laporan operasi file terminal dan manifest batch lengkap. Bagian history memiliki versinya sendiri; disediakan oleh adapter backup fileHistory internal milik shell.
revision-history.jsonopsional, backup manualID creation yang stabil, checkpoint yang dipertahankan, thumbnail dan draf recovery yang berputar. Disediakan oleh host.state.history.backup jika didukung.
file-history/versions/per snapshotByte aset sebelumnya dan credential yang diekstrak, tidak bergantung pada apakah aset saat ini masih ada.
file-history/results/per operasi selesaiByte output persis. Tidak ada file asli yang dipilih-untuk-konversi yang dipertahankan atau disertakan.
prefs.jsonyaPreferensi lokal milik pengguna: theme, sidebarWidth dan tally aktivitas ct-metrics.
lolly.txtyaRingkasan bundel yang dapat dibaca manusia (jumlah, profil, nama file) bagi siapa pun yang membuka zip tanpa Lolly. Dibuat ulang setiap ekspor dan dikenali saat impor, jadi tidak pernah dihitung sebagai bagian yang dilewati. Ditulis setelah peta integritas, jadi tetap berada di luar peta itu.

Bundel sengaja berupa zip biasa: ia bertahan utuh di transport mana pun, dan alat unzip apa pun bisa memeriksanya.

profile.json adalah bagian terkecil dan yang pertama kali dilihat pembaca di aplikasi: detail yang diisi sekali oleh pembuat, plus opsi ikut serta yang memungkinkan tool memakainya.

Formulir detail Profil yang menjadi profile.json: nama, detail kontak dan headshot signed by Lollyvector SVG15 paths~1.2k nodes30 groups1 image40 KBPeriksa sendiriAmbil file bertanda tangan

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-…"
  }
}
BidangMakna
formatSelalu lolly-backup. File tanpa ini ditolak sebagai "bukan backup Lolly".
formatVersionTata letak tempat bundel ini ditulis. Dinaikkan pada perubahan apa pun terhadap kumpulan atau bentuk bagian. Pembaca tidak menjadikan ini gerbang.
minReaderVersi pembaca minimum yang diperlukan untuk mengimpor bundel ini dengan aman. Ini adalah bidang yang dijadikan gerbang oleh pembaca.
appId aplikasi pembuat, untuk diagnostik.
exportedAtTimestamp ISO saat bundel dibuat.
countsApa yang dimasukkan penulis, untuk tampilan dan pemeriksaan kewarasan.
integrityOpsional. Memetakan setiap bagian kecuali manifest.json ke digest bergaya SRI sha256-<base64> dari byte tanpa kompresinya.

Kebijakan versi (kompatibilitas maju)

Pemisahan antara formatVersion dan minReader adalah yang memungkinkan format ini berkembang tanpa meninggalkan instalasi yang lebih lama:

Aturan praktis untuk penulis: jika setiap pembaca yang ada akan tetap berperilaku benar dengan mengabaikan penambahan Anda, itu aditif - naikkan formatVersion, biarkan minReader. Jika tidak, naikkan minReader.

Integritas

Ketika manifest.integrity ada, pembaca memverifikasi SHA-256 setiap bagian yang tercantum sebelum menulis apa pun. Ketidakcocokan ("gagal pemeriksaan integritasnya") atau bagian yang hilang ("tidak lengkap") membatalkan seluruh impor - tidak ada pemulihan sebagian. Ini menangkap korupsi yang bisa ditimbulkan oleh transport file (AirDrop yang terpotong, gateway email yang meng-encode ulang lampiran, sektor USB yang buruk).

Integritas sengaja dirancang sebagai upaya terbaik: hanya ditulis ketika Web Crypto tersedia (setiap konteks peramban aman dan Node modern), dan hanya diverifikasi ketika baik peta maupun Web Crypto tersedia. Bundel tanpa peta - misalnya dari sebelum integritas ada - diimpor tanpa perubahan. "Tidak bisa diverifikasi" tidak pernah diperlakukan sebagai "rusak".

Manifes tidak mencantumkan dirinya sendiri maupun README lolly.txt yang dibuat ulang. Digest mencakup bagian-bagian yang dijamin oleh manifes.

Semantik impor

Impor adalah sebuah penggabungan, tidak pernah ganti-semua:

Sesi tersimpan menautkan ulang ke gambarnya secara otomatis: referensi aset dipertahankan berdasarkan id, dan bridge menyelesaikannya ulang setelah gambar yang diunggah dipulihkan (memang harus begitu, karena URL blob: tidak bertahan setelah reload).

Ringkasan impor melaporkan { profile, sessions, userAssets, prefs, skipped, failedAssets }. failedAssets menghitung aset yang diunggah yang gagal dipulihkan (misalnya penyimpanan perangkat penuh). Ini berbeda dari skipped, yang menghitung bagian dari penulis yang lebih baru dan kompatibel-maju yang tidak dikenali oleh build ini. UI menampilkan skipped ("… · N item lebih baru dilewati"), sehingga pemulihan jujur soal apa yang ditinggalkannya.

Ketika file history ada, ringkasan juga membawa assetVersions, fileOperations dan failedHistory. Penyimpanan yang habis atau konflik ID yang tidak dapat diubah dapat menyebabkan pemulihan sebagian; UI memberi tahu pengguna untuk mempertahankan backup sumbernya. Cloud sync tidak memajukan revision yang diterapkannya setelah pemulihan sebagian atau yang tidak didukung, sehingga snapshot tetap tersedia untuk dicoba lagi. Restore bukan satu transaksi tunggal di seluruh penyimpanan profil/sesi/aset/history.

Riwayat creation (v3)

Backup manual dari sebuah web host yang mendukung history menyertakan revision-history.json dengan skema { version: 1, documents, revisions, recoveries } miliknya sendiri. Ia membawa ID yang dipertahankan, snapshot input kanonis, stempel versi, pratinjau raster dan draf writer terpisah. Adapter history menangkap sesi saat ini dan head-nya dalam satu transaksi baca; sessions.json menggunakan snapshot saat ini yang sama untuk pembaca yang lebih lama.

Restore memeriksa SHA-256 payload dan jumlah byte, identitas unik, relasi document/head, ancestry, timestamp, tipe pratinjau dan batas sebelum melakukan commit arsip dalam satu transaksi. Referensi parent yang telah dipadatkan mungkin tidak ada. Karya saat ini yang ada tidak pernah diganti secara diam-diam: ketika sebuah kreasi ada di kedua sisi, sisi yang tidak dipertahankan sebagai versi saat ini menjadi draf terlindungi. Batas transfer 384 MiB milik arsip diperiksa secara eksplisit, dan batas penyimpanan ditegakkan tanpa memotong checkpoint yang dipertahankan. Backup keseluruhan masih menggunakan implementasi ZIP in-memory dan bukan arsip streaming.

Ringkasan menambahkan revisions dan recoveryDrafts, hanya menghitung apa yang ditambahkan impor ini, serta added, kept, replaced, copies dan hidden untuk cara setiap kreasi digabungkan. Sebuah shell tanpa kemampuan ini memulihkan sesi biasa dan melaporkan bagian history sebagai dilewati. History filesystem native tetap tidak didukung sampai adapter-nya menyediakan transaksi history yang durable. State guest P2P tidak memiliki history atau arsip recovery yang durable.

Sync snapshot personal secara eksplisit mengecualikan riwayat creation. Menerapkan sebuah snapshot pada dokumen lokal yang memiliki history mempertahankan state kerja sebelumnya sebagai sebuah draf recovery terpisah dan membatalkan write token editor mana pun yang sedang terbuka. Checkpoint yang tidak dapat diubah tetap ada di perangkat. Ini melindungi history lokal selama penggantian snapshot; ini tidak menggabungkan history perangkat yang konkuren.

Referensi aset historis dipertahankan, sementara rendering tetap menyelesaikan aset lewat pustaka yang sudah ada di destinasi. Arsip ini belum menjamin byte aset lama atau render tool lama yang persis. Byte asset-version dan file-result tetap berpindah lewat bagian backup terpisah yang sudah ada.

Versi tersimpan dan hasil file (v2)

Bagian history opsional berisi { version: 2, assetVersions: [...], operations: [...], batches: [...] }; pembaca juga menerima bentuk history-v1 yang lebih lama tanpa batches. Setiap snapshot mengidentifikasi ID aset yang stabil dan versi persisnya, waktu penyimpanannya, panjang byte dan SHA-256 hex, plus sebuah rekaman aset yang _file dan _credentialFile opsionalnya menunjuk ke bagian biner. Operasi membawa fakta file asli, request, laporan, timestamp dan _file hasil opsional; nama storage backend, handle OPFS dan execution lease tidak ikut berpindah. Pembaca history-v1-only yang lebih lama menolak versi history baru sebelum mengimpor, alih-alih diam-diam membuang keanggotaan batch.

Manifest batch mencatat setiap sumber yang dipilih sebelum diproses, termasuk file yang tidak pernah dibaca, anggota yang dibatalkan, kegagalan mereservasi ruang hasil dan pekerjaan yang terputus. Setiap anggota memiliki ID operasi yang stabil, referensi/fakta sumber, nama output yang diminta dan laporan terminal. Sebuah sumber yang tidak dibaca memiliki fakta yang dideklarasikan, bukan digest rekaan. Impor memvalidasi identitas anggota dan konsistensi dengan laporan operasi yang dibawa mana pun. Laporan batch tetap tersedia ketika hasil individual telah dihapus secara eksplisit, tetapi sebuah receipt tidak berarti byte outputnya masih tersimpan.

Pembaca lama tetap menerima amplop v2 (minReader: 1) dan memulihkan bagian yang dikenal, menghitung bagian history yang tidak didukung sebagai dilewati. Pemulihan history penuh memerlukan sebuah shell dengan adapter fileHistory; ini adalah seam internal-shell, bukan kemampuan HostV1 baru yang menghadap tool. Restore dua-perangkat yang sungguhan dicakup oleh gate Chromium lokal; penerimaan pemulihan Tauri/iOS/Android yang terinstal tetap terpisah.

Apa yang tidak ikut berpindah

Meteran penyimpanan merinci pemisahan yang sama. Sesi tersimpan, My images dan File results & versions ikut dalam bundel. Cache aset, pratinjau tool dan pin offline di bawahnya semuanya dapat diturunkan ulang, jadi tetap tinggal.

Meteran penyimpanan memecah data perangkat ini ke dalam kategori bernama, dengan Saved sessions dan My images dilacak terpisah dari Asset cache, di sini pada instalasi baru di mana setiap kategori masih kosong signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBPeriksa sendiriAmbil file bertanda tanganMeteran penyimpanan memecah data perangkat ini ke dalam kategori bernama, dengan Saved sessions dan My images dilacak terpisah dari Asset cache, di sini pada instalasi baru di mana setiap kategori masih kosong signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBPeriksa sendiriAmbil file bertanda tangan

Jaminan lintas shell

data-transfer.ts membaca dan menulis secara eksklusif lewat capability bridge (host.profile, host.state, host.assets) dan preferensi localStorage bersama. Modul yang sama membaca dan menulis amplop umum di web dan Tauri, lewat penyimpanan IndexedDB atau filesystem. Bagian history opsional muncul hanya di tempat adapter terkaitnya tersedia; sebuah bagian yang tidak didukung dilaporkan sebagai dilewati saat impor. Suite headless menjalankan bagian umum terhadap sebuah bridge in-memory, sementara transaksi history juga memiliki test real-browser.

Dua shell berada di luar jaminan itu, karena alasan yang berbeda:

Titik ekstensi yang dicadangkan

Amplop ini sengaja dirancang sebagai manifes plus sekumpulan bagian bernama, sehingga jenis data portabel baru bisa menumpang di kemudian hari tanpa perubahan yang merusak. Bagian-bagian ini masuk sebagai bagian aditif (formatVersion baru, minReader yang sama), dan pembaca saat ini melewati apa pun yang tidak dikenalinya. Ini belum dibangun. Nama-namanya dicadangkan di sini agar format tetap koheren saat bagian tersebut hadir.

Apa pun di luar nama yang dicadangkan dan bagian-bagian di atas, bagi pembaca, adalah bagian yang tidak dikenal: dibiarkan tanpa diubah dan dihitung dalam skipped.

Referensi