Veri Aktarımı - lolly-backup demeti

Bir Lolly kullanıcısının biriktirdiği her şey cihazında yaşar - hesap yok, bulut yok. Veri aktarımı demeti bu değerin nasıl taşındığıdır: bir kurulumda dışa aktar, dosyayı herhangi bir yolla taşı (USB, AirDrop, kendine e-posta, bir ağ paylaşımı) ve başka bir kurulumda içe aktar. Aktarım araç dosyanın kendisidir. Hedef çevrimdışı veya çevrimiçi olabilir. Hiçbir fark yaratmaz, çünkü hiçbir zaman bir sunucuyla konuşulmaz.

Bütün bir kurulumu taşıyan iki düğme: Export my data tek bir zip yazar, Import data onu geri okursigned by Lollyvector SVGKendin kontrol etGet the signed file12 paths~5.1k nodes12 groups60 KBBütün bir kurulumu taşıyan iki düğme: Export my data tek bir zip yazar, Import data onu geri okursigned by Lollyvector SVGKendin kontrol etGet the signed file12 paths~5.1k nodes12 groups60 KB

Bu sayfa biçim spesifikasyonudur. Son kullanıcı için adım adım anlatım için bkz. Lolly'yi Kullanmak → Başka bir cihaza taşınmak. Uygulama shells/web/src/data-transfer.ts dosyasındadır ve tests/data-transfer.test.ts gidiş-dönüş sözleşmesini sabitler.

Kapsam. Bir demet kullanıcı verisini taşır, araçları değil. Araçlar ve katalog varlıkları ayrı senkronize edilir ve hedefte zaten mevcut olduğu varsayılır (en kötü durumda daha yüksek bir sürümde). İçe aktarma asla bir aracı kurmaz veya yükseltmez.

Hedefler

Zarf

Paket, düz bir .zip dosyasıdır. İndirme, ait olduğu kişinin adına göre adlandırılır - LollyTools-<First>-<Last>-<YYYY-MM-DD>-<n>.zip (örneğin LollyTools-Ada-Lovelace-2026-06-26-1.zip) - böylece bir İndirilenler klasöründeki yedekler okunaklı kalır. Ad ve soyad kısımları profilden gelir ve ayarlanmamışsa atlanır. Profil yoksa LollyTools-2026-06-26-1.zip elde edilir, yalnızca ad varsa LollyTools-Ada-2026-06-26-1.zip elde edilir. Her kısım dosya adına uygun bir jetona göre temizlenir (Unicode harfler/rakamlar korunur, boşluklar/noktalama işaretleri kaldırılır, 32 karakterle sınırlandırılır). <n>, güne ve cihaza özgü bir sıra numarasıdır, böylece aynı gün yapılan tekrar dışa aktarımlar çakışmaz ve sırasını korur. shells/web/src/data-transfer.ts içindeki backupFilename() fonksiyonu adı oluşturur. Zip'in içeriği, ada bakılmaksızın aynıdır. İçinde:

YolGerekliİçerik
manifest.jsonevetBiçim kimliği, sürümler, sayılar ve parça başına bütünlük. Bir okuyucunun ilk baktığı şey.
profile.jsonayarlıysaKullanıcının me kaydı (ad, iletişim, profil fotoğrafı referansı, bayraklar). host.profile üzerinden okunur.
sessions.jsonevetKaydedilmiş her oturum: yuva, araç kimliği/sürümü, etiket, küçük resim (veri-URL) ve tam girdi verisi. host.state üzerinden okunur.
assets.jsonevetYüklenen her varlığın (görseller, yazı tipleri, marka jetonları) meta verisi, her biri assets/blobs/ altındaki baytlarına işaret eder.
assets/blobs/<n>.<ext>varlık başınaHam varlık baytları (görsel ve yazı tipi dosyaları). Sıkıştırılmadan saklanır (biçimler zaten sıkıştırılmıştır). Uzantı kozmetiktir. assets.json içindeki MIME yetkilidir.
prefs.jsonevetKullanıcıya ait yerel tercihler: theme, sidebarWidth ve ct-metrics etkinlik sayacı.
lolly.txtevetDemeti Lolly olmadan açan herkes için demetin okunabilir bir özeti (sayılar, profil, dosya adı). Her dışa aktarımda yeniden üretilir ve içe aktarımda tanınır, bu yüzden asla atlanan bir parça olarak sayılmaz. Bütünlük haritasından sonra yazılır, bu yüzden onun dışında kalır.

Demet bilerek düz bir zip'tir: herhangi bir taşımayı bozulmadan atlatır ve herhangi bir unzip aracı onu inceleyebilir.

profile.json en küçük parçadır ve bir okuyucunun uygulamada ilk gördüğü parçadır: bir üreticinin bir kez doldurduğu bilgiler, artı araçların bunları kullanmasına izin veren tercih.

profile.json'a dönüşen Profil bilgileri formu - ad, iletişim, profil fotoğrafı ve yanlarındaki tercihsigned by Lollyvector SVGKendin kontrol etGet the signed file18 paths~2.0k nodes41 groups30 KBprofile.json'a dönüşen Profil bilgileri formu - ad, iletişim, profil fotoğrafı ve yanlarındaki tercihsigned by Lollyvector SVGKendin kontrol etGet the signed file18 paths~2.0k nodes41 groups30 KB

manifest.json

{
  "format": "lolly-backup",
  "formatVersion": 1,
  "minReader": 1,
  "app": "lolly",
  "exportedAt": "2026-06-22T09:30:00.000Z",
  "counts": { "profile": true, "sessions": 2, "userAssets": 4, "prefs": 3 },
  "integrity": {
    "profile.json": "sha256-…",
    "sessions.json": "sha256-…",
    "assets.json": "sha256-…",
    "assets/blobs/0.webp": "sha256-…",
    "prefs.json": "sha256-…"
  }
}
AlanAnlam
formatHer zaman lolly-backup. Bu olmayan bir dosya "bir Lolly yedeği değil" diye reddedilir.
formatVersionBu demetin yazıldığı düzen. Parça kümesindeki veya biçimlerindeki herhangi bir değişiklikte artırılır. Okuyucular bunu kapı olarak kullanmaz.
minReaderBu demeti güvenle içe aktarmak için gereken en düşük okuyucu sürümü. Okuyucuların kapı olarak kullandığı alan budur.
appÜreten uygulama kimliği, tanılama için.
exportedAtDemetin oluşturulduğu ISO zaman damgası.
countsYazarın neyi koyduğu, görüntüleme ve mantık denetimi için.
integrityİsteğe bağlı. manifest.json dışındaki her parçayı, sıkıştırılmamış baytlarının SRI tarzı bir sha256-<base64> özetine eşler.

Sürüm politikası (ileriye dönük uyumluluk)

formatVersion ile minReader arasındaki ayrım, biçimin daha eski kurulumları sahipsiz bırakmadan büyümesini sağlayan şeydir:

Yazarlar için pratik kural: var olan her okuyucu, eklediğini görmezden gelerek yine de doğru şeyi yapacaksa, bu katkısaldır - formatVersion'ı artır, minReader'ı bırak. Aksi halde minReader'ı yükselt.

Bütünlük

manifest.integrity mevcut olduğunda, bir okuyucu listelenen her parçanın SHA-256'sını hiçbir şey yazmadan önce doğrular. Bir uyumsuzluk ("bütünlük kontrolünde başarısız oldu") veya eksik bir parça ("eksik") tüm içe aktarımı durdurur - kısmi bir geri yükleme yoktur. Bu, bir dosya taşımanın yol açabileceği bozulmayı yakalar (kesilmiş bir AirDrop, eki yeniden kodlayan bir e-posta ağ geçidi, kötü bir USB sektörü).

Bütünlük, tasarım gereği en iyi çaba temellidir: yalnızca Web Crypto mevcut olduğunda yazılır (her güvenli tarayıcı bağlamı ve modern Node), ve yalnızca hem harita hem de Web Crypto mevcut olduğunda doğrulanır. Haritası olmayan bir demet - örneğin bütünlük özelliğinden önceki bir demet - değişmeden içe aktarılır. "Doğrulanamıyor" asla "bozuk" olarak ele alınmaz.

Manifesto ne kendisini ne de yeniden üretilen lolly.txt README'sini listeler. Özetler manifestonun teyit ettiği parçaları kapsar.

İçe aktarma anlambilimi

İçe aktarma birleştir-üzerine yaz yöntemidir, asla tümünü değiştir değil:

Kaydedilmiş oturumlar görsellerine otomatik olarak yeniden bağlanır: varlık referansları kimliğe göre tutulur ve köprü, yüklenen görseller geri yüklendikten sonra bunları yeniden çözer (zaten öyle yapmak zorundadır, çünkü blob: URL'ler bir yeniden yüklemeyi atlatmaz).

İçe aktarma özeti { profile, sessions, userAssets, prefs, skipped, failedAssets } bildirir. failedAssets, geri yüklenemeyen yüklenmiş varlıkları sayar (cihaz depolaması dolu, mesela). Bu, ileriye dönük uyumlu daha yeni bir yazarın parçalarını bu derlemenin tanımadığını sayan skipped'den farklıdır. Arayüz skipped'i gösterir ("… · N daha yeni öge atlandı"), böylece geri yükleme neyi geride bıraktığı konusunda dürüst olur.

Neler taşınmaz

Depolama ölçer aynı ayrımı kalemleştirir. Kaydedilmiş oturumlar ve Görsellerim bir demette yolculuk eder. Varlık önbelleği, araç önizlemeleri ve altındaki çevrimdışı sabitlemeler hepsi yeniden türetilebilir, bu yüzden geride kalırlar.

Bu cihazın verisini adlandırılmış kategorilere ayıran depolama ölçer, Kaydedilmiş oturumlar ve Görsellerim'in Varlık önbelleğinden ayrı takip edildiği, her kategorinin hâlâ boş olduğu yeni bir kurulumdasigned by Lollyvector SVGKendin kontrol etGet the signed file25 paths~4.8k nodes46 groups59 KBBu cihazın verisini adlandırılmış kategorilere ayıran depolama ölçer, Kaydedilmiş oturumlar ve Görsellerim'in Varlık önbelleğinden ayrı takip edildiği, her kategorinin hâlâ boş olduğu yeni bir kurulumdasigned by Lollyvector SVGKendin kontrol etGet the signed file25 paths~4.8k nodes46 groups59 KB

Kabuklar arası garanti

data-transfer.ts yalnızca yetenek köprüsü (host.profile, host.state, host.assets) ve paylaşılan localStorage tercihleri üzerinden okur ve yazar. Köprü tek geçiş noktası olduğundan, altındaki depolama farklı olsa bile - web'de IndexedDB, Tauri'de dosya sistemi - aynı modül her kabukta bayt bayt özdeş bir paket üretir. Tauri kabukları bu modülü değiştirmeden yeniden kullanır. Yalnızca host.state uygulamaları farklıdır. Headless test, bellek içi bir köprüye karşı tam gidiş-dönüşü çalıştırır; bu yüzden hepsinin yerine geçer.

İki kabuk, farklı nedenlerle bu garantinin dışında kalır:

Ayrılmış genişletme noktaları

Zarf, tasarım gereği bir manifest artı adlandırılmış parçalar kümesidir; böylece taşınabilir yeni veri türleri kırıcı bir değişiklik olmadan daha sonra bu yapıya binebilir. Ek parçalar olarak eklenirler (yeni formatVersion, aynı minReader) ve bugünkü okuyucu tanımadığı şeyi atlar. Bunlar yol haritasında yer alır, henüz uygulanmadılar. Adlar, bu format geldiğinde tutarlı kalsın diye burada ayrılmıştır.

Bu ayrılmış adların ve yukarıdaki parçaların dışındaki her şey, bir okuyucu için bilinmeyen bir parçadır: dokunulmadan bırakılır ve skipped içinde sayılır.

Referans