Lolly
Åpne appen

Dataoverføring - lolly-backup-pakken

Alt en Lolly-bruker samler seg opp, lever på enheten deres - ingen konto, ingen sky. Dataoverføringspakken er hvordan den verdien flytter seg: eksporter den på én installasjon, bær filen på hvilken som helst måte (USB, AirDrop, e-post til deg selv, en nettverksdeling) og importer den på en annen. Filen er transporten. Målet kan være offline eller online. Det spiller ingen rolle, fordi ingenting noensinne snakker med en server.

De to knappene som flytter en hel installasjon: Eksporter dataene mine skriver én zip, Importer data leser den tilbake signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KBSjekk det selvHent den signerte filenDe to knappene som flytter en hel installasjon: Eksporter dataene mine skriver én zip, Importer data leser den tilbake signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KBSjekk det selvHent den signerte filen

Denne siden er formatspesifikasjonen. For gjennomgangen for sluttbrukeren, se Finn og gjenopprett arbeidet ditt → Flytt arbeidet ditt til en annen enhet. Implementasjonen er shells/web/src/data-transfer.ts, og tests/data-transfer.test.ts fastsetter kontrakten for tur-retur.

Omfang. En pakke bærer brukerdata, ikke katalogverktøy. Katalogverktøy og katalogressurser synkroniseres separat og antas allerede å være til stede på målet (i verste fall i en høyere versjon); verktøy en bruker har laget selv, reiser inni profile.json. Import installerer eller oppgraderer aldri et katalogverktøy.

Mål

Konvolutten

En pakke er en vanlig .zip. Nedlastingen navngis etter personen den tilhører - LollyTools-<First>-<Last>-<YYYY-MM-DD>-<n>.zip (for eksempel LollyTools-Ada-Lovelace-2026-06-26-1.zip) - slik at en Nedlastinger-mappe full av sikkerhetskopier holder seg lesbar. Fornavn- og etternavndelene kommer fra profilen og utelates når de ikke er angitt. Uten profil blir det LollyTools-2026-06-26-1.zip, og et fornavn alene gir LollyTools-Ada-2026-06-26-1.zip. Hver del saneres til et filnavn-sikkert token (Unicode-bokstaver/-tall beholdes, mellomrom/tegnsetting fjernes, maks 32 tegn). <n> er et sekvensnummer per dag per enhet, slik at gjentatte eksporter samme dag ikke kolliderer og forblir i rekkefølge. backupFilename() i shells/web/src/data-transfer.ts bygger navnet. Zip-filens innhold er identisk uansett navn. Inni:

StiPåkrevdInnhold
manifest.jsonjaFormat-id, versjoner, antall og integritet per del. Det første en leser ser på.
profile.jsonnår sattBrukerens hele me-post: navn, kontakt, portrettbilde-referanse og flagg, pluss mapper, Papirkurv, prosjektmaler, brukermaler og brukerlagde verktøy, favoritter, skjulte verktøy, språk- og emoji-valg. Leses via host.profile.
sessions.jsonjaHver lagrede sesjon: plass, verktøy-id/versjon, etikett, miniatyrbilde (data-URL) og fullstendige inputdata. Leses via host.state.
assets.jsonjaMetadata for hver opplastet ressurs (bilder, fonter, merkevaretokener, logoer, lagrede kopier av nedlastinger), hver med peker til bytene sine under assets/blobs/.
assets/blobs/<n>.<ext>per ressursDe rå ressursbytene (bilde- og fontfiler). Lagret ukomprimert (allerede komprimerte formater). Filendelsen er kosmetisk. MIME-typen i assets.json er autoritativ.
assets/blobs/<n>.c2panår til stedeEkstraherte Content Credentials som eksakte binære byte, referert av _credentialFile i ressursposten. Dette er ikke enhetens signeringsnøkler.
design-systems.jsonnår til stedeDesignsystemene som er laget eller lagt til på denne installasjonen, som { active, records }. Slås sammen etter id ved import; pakkens aktive valg gjelder bare når målet ikke har noe eget designsystem.
file-history.jsonvalgfrittVersjonerte ressurs-øyeblikksbilder, terminalens filoperasjonsrapporter og komplette batch-manifester. Historikkdelen har sin egen versjon; leveres av shellets interne sikkerhetskopi-adapter fileHistory.
revision-history.jsonvalgfritt, manuelle sikkerhetskopierStabile kreasjons-ID-er, bevarte sjekkpunkter, miniatyrer og rullerende gjenopprettingsutkast. Leveres av host.state.history.backup der det støttes.
file-history/versions/per øyeblikksbildeTidligere ressursbyte og ekstraherte credentials, uavhengig av om den gjeldende ressursen fortsatt finnes.
file-history/results/per fullført operasjonEksakte utdatabyte. Ingen opprinnelig fil valgt for konvertering beholdes eller inkluderes.
prefs.jsonjaBrukereide lokale innstillinger: theme, sidebarWidth og ct-metrics-aktivitetstellingen.
lolly.txtjaEt menneskelesbart sammendrag av pakken (antall, profil, filnavn) for alle som åpner zip-en uten Lolly. Regenereres ved hver eksport og gjenkjennes ved import, så den regnes aldri som en hoppet-over del. Den skrives etter integritetskartet, så den holdes utenfor det.

Pakken er en vanlig zip med hensikt: den overlever enhver transport intakt, og ethvert utpakkingsverktøy kan inspisere den.

profile.json er den minste delen og den en leser ser først i appen: detaljene en produsent fyller inn én gang, pluss opt-inen som lar verktøy bruke dem.

Skjemaet med profildetaljer som blir profile.json: navn, kontaktopplysninger og profilbilde signed by Lollyvector SVG15 paths~1.2k nodes30 groups1 image40 KBSjekk det selvHent den signerte filen

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-…"
  }
}
FeltBetydning
formatAlltid lolly-backup. En fil uten det avvises som «not a Lolly backup».
formatVersionLayouten denne pakken ble skrevet med. Heves ved enhver endring av delsettet eller formene. Lesere sjekker ikke mot denne.
minReaderMinste leserversjon som kreves for å importere denne pakken trygt. Dette er feltet lesere sjekker mot.
appProduserende app-id, for diagnostikk.
exportedAtISO-tidsstempel for når pakken ble laget.
countsHva skriveren la inn, for visning og fornuftssjekk.
integrityValgfritt. Kobler hver del unntatt manifest.json til en SRI-lignende sha256-<base64>-digest av dens ukomprimerte bytes.

Versjonspolicy (fremoverkompatibilitet)

Delingen mellom formatVersion og minReader er det som lar formatet vokse uten å etterlate eldre installasjoner:

Tommelfingerregel for forfattere: hvis enhver eksisterende leser fortsatt ville gjort det riktige ved å ignorere tilføyelsen din, er den additiv - hev formatVersion, la minReader være. Ellers hev minReader.

Integritet

Når manifest.integrity er til stede, verifiserer en leser hver oppførte dels SHA-256 før noe skrives. Et avvik («failed its integrity check») eller en manglende del («incomplete») avbryter hele importen - det finnes ingen delvis gjenoppretting. Dette fanger opp korrupsjonen en filtransport kan innføre (en avkuttet AirDrop, en e-postgateway som har omkodet vedlegget, en dårlig USB-sektor).

Integritet er beste innsats med hensikt: den skrives kun der Web Crypto er tilgjengelig (enhver sikker nettleserkontekst og moderne Node), og verifiseres kun når både kartet og Web Crypto er til stede. En pakke uten kartet - for eksempel en fra før integritet fantes - importeres uendret. «Cannot verify» behandles aldri som «corrupt».

Manifestet lister verken seg selv eller den regenererte lolly.txt-README-en. Digestene dekker delene manifestet går god for.

Importsemantikk

Import er en sammenslåing, aldri erstatt-alt:

Lagrede sesjoner kobles automatisk sammen med bildene sine igjen: ressursreferanser holdes med id, og broen løser dem opp på nytt etter at de opplastede bildene er gjenopprettet (den må uansett det, fordi blob:-URL-er ikke overlever en omlasting).

Importsammendraget rapporterer { profile, sessions, userAssets, prefs, skipped, failedAssets }. failedAssets teller opplastede ressurser som ikke kunne gjenopprettes (enhetslagring full, for eksempel). Det er atskilt fra skipped, som teller deler fra en fremoverkompatibel nyere skriver som denne buildjen ikke gjenkjente. UI-en viser skipped («… · N newer items skipped»), så gjenopprettingen er ærlig om hva den lot ligge.

Når filhistorikk er til stede, bærer sammendraget også assetVersions, fileOperations og failedHistory. Uttømt lagring eller uforanderlige ID-konflikter kan forårsake en delvis gjenoppretting; brukergrensesnittet ber brukeren beholde kildesikkerhetskopien. Skysynk flytter ikke fram sin anvendte revisjon etter en delvis eller ustøttet gjenoppretting, slik at øyeblikksbildet forblir tilgjengelig for et nytt forsøk. Gjenoppretting er ikke én enkelt transaksjon på tvers av alle profil-/økt-/ressurs-/historikklagre.

Kreasjonshistorikk (v3)

Manuelle sikkerhetskopier fra en historikkapabel nettvert inkluderer revision-history.json med sitt eget skjema { version: 1, documents, revisions, recoveries }. Den bærer de bevarte ID-ene, kanoniske inndata-øyeblikksbilder, versjonsstempler, rasterforhåndsvisninger og separate skriverutkast. Historikkadapteren fanger gjeldende økter og hodene deres i én lese-transaksjon; sessions.json bruker de samme gjeldende øyeblikksbildene for eldre lesere.

Gjenoppretting sjekker nyttelastens SHA-256 og bytetall, unike identiteter, dokument-/hode-relasjoner, avstamning, tidsstempler, forhåndsvisningstyper og grenser før arkivet forpliktes i én transaksjon. Komprimerte foreldrereferanser kan mangle. Eksisterende gjeldende arbeid erstattes aldri stille: når en kreasjon finnes på begge sider, blir siden som ikke holdes gjeldende, et beskyttet utkast. Arkivets overføringsgrense på 384 MiB sjekkes eksplisitt, og lagringsgrenser håndheves uten å kutte bevarte sjekkpunkter. Hele sikkerhetskopien bruker fortsatt en in-memory ZIP-implementasjon og er ikke et strømmende arkiv.

Sammendraget legger til revisions og recoveryDrafts, som bare teller det denne importen la til, samt added, kept, replaced, copies og hidden for hvordan hver kreasjon ble slått sammen. Et shell uten denne kapabiliteten gjenoppretter vanlige økter og rapporterer historikkdelen som hoppet over. Historikk for det native filsystemet forblir ustøttet inntil adapteren dets leverer varige historikktransaksjoner. P2P-gjestetilstand har ingen varig historikk eller noe gjenopprettingsarkiv.

Personlig øyeblikksbildesynk ekskluderer eksplisitt kreasjonshistorikk. Å bruke et øyeblikksbilde på et lokalt dokument med historikk bevarer dets tidligere arbeidstilstand som et separat gjenopprettingsutkast og ugyldiggjør en åpen redigerers skrivetoken. De uforanderlige sjekkpunktene dens blir værende på enheten. Dette beskytter lokal historikk under utskifting av øyeblikksbilde; det slår ikke sammen samtidige enheters historikk.

Historiske ressursreferanser beholdes, mens rendring fortsatt løser ressurser via målets eksisterende bibliotek. Dette arkivet garanterer ennå ikke eksakte gamle ressursbyte eller gamle verktøyrendringer. Byte for ressursversjoner og filresultater fortsetter å reise via sin eksisterende separate sikkerhetskopi-del.

Lagrede versjoner og filresultater (v2)

Den valgfrie historikkdelen inneholder { version: 2, assetVersions: [...], operations: [...], batches: [...] }; lesere godtar også den tidligere history-v1-formen uten batcher. Hvert øyeblikksbilde identifiserer den stabile ressurs-ID-en og den eksakte versjonen, lagringstidspunktet, bytelengden og hex-SHA-256, pluss en ressurspost hvis _file og valgfrie _credentialFile peker på binære deler. Operasjoner bærer de opprinnelige filfaktaene, forespørselen, rapporten, tidsstemplene og en valgfri resultat-_file; navn på lagringsbackend, OPFS-håndtak og kjøringsleaser følger ikke med. Eldre lesere som bare kjenner history-v1, avviser den nye historikkversjonen før import, i stedet for stille å droppe batch-medlemskap.

Batch-manifester registrerer hver valgte kilde før behandling, inkludert filer som aldri er lest, avbrutte medlemmer, mislykkede forsøk på å reservere resultatplass og avbrutt arbeid. Hvert medlem har en stabil operasjons-ID, kildereferanse/-fakta, forespurt utdatanavn og terminalrapport. En ulest kilde har deklarerte fakta, ikke en oppdiktet digest. Import validerer medlemsidentitet og konsistens mot en eventuell medfølgende operasjonsrapport. Batch-rapporter forblir tilgjengelige når enkeltresultater eksplisitt er fjernet, men en kvittering innebærer ikke at utdatabytene dens fortsatt er lagret.

Eldre lesere godtar fortsatt v2-konvolutten (minReader: 1) og gjenoppretter kjente deler, og teller historikkdeler som ikke støttes, som hoppet over. Full historikkgjenoppretting krever et shell med fileHistory-adapteren; dette er en shell-intern skjøt, ikke en ny verktøyvendt HostV1-kapabilitet. Reell gjenoppretting mellom to enheter dekkes av den lokale Chromium-porten; godkjenning av gjenoppretting i installerte Tauri-/iOS-/Android-apper forblir separat.

Hva som ikke følger med

Lagringsmåleren viser den samme oppdelingen kategori for kategori. Lagrede sesjoner, Mine bilder og File results & versions følger med i en pakke. Ressursbufferen, verktøyforhåndsvisningene og offline-pinnene under dem er alle avledbare på nytt, så de blir igjen.

Lagringsmåleren som deler denne enhetens data inn i navngitte kategorier, med Saved sessions og My images sporet separat fra Asset cache, her på en fersk installasjon der hver kategori fortsatt er tom signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBSjekk det selvHent den signerte filenLagringsmåleren som deler denne enhetens data inn i navngitte kategorier, med Saved sessions og My images sporet separat fra Asset cache, her på en fersk installasjon der hver kategori fortsatt er tom signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBSjekk det selvHent den signerte filen

Kryssgaranti mellom shells

data-transfer.ts leser og skriver utelukkende via kapabilitetsbroen (host.profile, host.state, host.assets) og de delte localStorage-innstillingene. Den samme modulen leser og skriver den felles konvolutten på nett og Tauri, over IndexedDB eller filsystemlagring. Valgfrie historikkdeler vises bare der den tilsvarende adapteren er tilgjengelig; en del som ikke støttes, rapporteres som hoppet over ved import. Den hodeløse testsuiten kjører de felles delene mot en in-memory-bro, mens historikktransaksjoner også har tester i en ekte nettleser.

To shell befinner seg utenfor den garantien, av ulike grunner:

Reserverte utvidelsespunkter

Konvolutten er et manifest pluss et sett navngitte deler med hensikt, slik at nye typer portabel data kan følge med senere uten en brytende endring. De kobles inn som additive deler (ny formatVersion, samme minReader), og dagens leser hopper over det den ikke kjenner igjen. Disse er ikke bygget ennå. Navnene er reservert her slik at formatet forblir sammenhengende når de kommer.

Alt utenfor disse reserverte navnene og delene ovenfor er, for en leser, en ukjent del: uberørt og talt med i skipped.

Referanse