Positive Format History
Format Version History
The version history of the Positive Experience Format, the JSON that P.E.A. exports and imports. The format itself is described at archive.green/format.
exportSchemaVersion is 4 since October 2026 (build 96); it was 3 from June 2026, and every v3 file still imports. The point releases below added optional fields and changed nothing for files that don't have them. The build numbers are TestFlight builds.
v4.1: When an experience reached the archive. (November 2026, in every build since 97.)
Per-entry
archivedAt: when the archive received the experience, next tocreatedAt, when it happened. A file without it imports as before. An experience without it keeps it empty, because no earlier build recorded that moment. Optional.exportSchemaVersionstays 4.appVersiontells a backup from a conversion. P.E.A. writes its own version number (“1.0”). A converter writes its name and version (“swarm-to-pea/1.2.1”), and P.E.A. then dates each entry’s arrival to the import.In the same build, P.E.A. moved your archive into encrypted iCloud storage. Nothing in this format changed for it: the keys are the same, and a backup is the same plain JSON file it always was.
Page revision, October 23, 2026. No format change. The page is half its length: this version history, the spreadsheet template (archive.green/import-template) and the Swarm mapping (archive.green/swarm-to-pea) are pages of their own, and one import prompt replaces two. The
seasonrow now says how a converter writes the southern hemisphere’s season (corrected November 1, 2026: this line said P.E.A. itself reads the hemisphere since build 96; no build does yet, and P.E.A. keeps using the northern table for what it captures).
v4: Topic suggestions, and the place's category. (October 2026, in every build since 96.)
A new top-level
topicAssociationsarray (see Topic Suggestions Schema at archive.green/format): what P.E.A. remembers about suggesting topics at a place, for a kind of place or an activity, and the suggestions you turned off. The rulealways(a topic a place adds by itself) came a few days later without a version change. A build that doesn’t know it lists those objects as skipped in its import report, with the reason, and leaves them alone when they arrive through iCloud. A new top-level collection is whyexportSchemaVersionwent from 3 to 4. A build before 96 refuses a v4 file with a “please update” message, and every v3 file imports into build 96 as before.Per-place
category: the kind of place in Apple's words ("Cafe"), the same word entries already have asplaceCategory. It lets a place suggest topics by its kind, even when P.E.A. picked the place for you. Optional. P.E.A. fills it in after import where it can.
Page revision, October 8, 2026. No format change. Concepts are called Topics in the app since September 27, 2026; the keys (
concepts,conceptUUIDs,conceptCount) stay as they are. Every "not shipped yet" note below is gone, because everything shipped. New on the page: the short prompt for Siri and Apple Intelligence, and the hour bands fortimeOfDayand the months forseasonin the Time table. The spreadsheet template'sconceptscolumn is nowtopics, it gainedlocationAdministrativeArea, and its watch row sayswatch.v3.6: Region, neighbourhood, county and postal code on entries, and the listing on places. (September 2026, in every build since 91.)
Per-entry
locationAdministrativeArea: the state or region, exactly as the map data gives it: "WA" in one country, "Bavaria" in another. P.E.A. shows it next to the town ("Seattle, WA") and falls back to the two-letter country code when there is no region. There is no table that expands or shortens these, so copy your source's spelling. Leave it out when you don't know it, and P.E.A. looks it up from the coordinates after import, like the city and the country.Per-entry
locationSubLocality,locationSubAdministrativeAreaandlocationPostalCode: the neighbourhood ("Ballard"), the county or its local equivalent ("King County") and the postal code ("98117"). Same rules as the region. Nothing in the app shows these three yet. They are kept so an archive written today already has them.Per-place
websiteURL,phoneNumber,street,locality,administrativeArea,postalCodeandcountry: the place's own listing, so the place card can show an address, a website and a phone number without going online.detailis unchanged and still the short "City, Country" line. Write these if your source knows the venue's address. If it only knows a coordinate, leave them out and P.E.A. looks the place up after import. Once recorded, P.E.A. doesn't overwrite them.All eleven are optional.
exportSchemaVersionstays 3, older files import unchanged, older builds ignore the fields.
v3.5: Place association and role. (August 2026, in every build since 70.)
Per-place
associationState: whether the place may associate itself with new experiences automatically ("notLicensed"/"disabled"/"enabled"). Absent means something: the place was saved before the field existed and behaves as enabled. Keep it absent when you convert a file.Per-place
role("home"/"work"/"other") androleUpdatedAt(ISO 8601): the place's role in your life and when you last set it. There is at most one home and one work. The timestamp is there so a sync conflict can be settled by a person. Imports copy it as is.All three are optional.
exportSchemaVersionstays 3.
v3.4: Motto active state. (August 2026, in every build since 70.)
Per-motto
inactive:truekeeps a motto in the archive but stops showing it, on every device. Left out when the motto is active. Not part of the motto's identity, so the merge still matches byuuidor by the three lines. Optional.exportSchemaVersionstays 3.
v3.3: Place identity. (July 2026, in every build since 70. See Place identity at archive.green/format.)
Per-entry
placeIdentityKey: which place an experience belongs to, as a stable key.apple:for a place backed by an Apple Maps Place ID,local:for one P.E.A. created. The key, not the name, says "these two experiences happened at the same place", which is why one archive can hold several places called "Home".Per-place
identityKey,providerName,radiusMeters,symbol: the same key on the saved place, what Apple Maps called the place when you linked it (not refreshed), how far the place reaches in meters, and the SF Symbol you picked. NoradiusMetersmeans the app's default. Nosymbolmeans the app picks one by category.Identity keys are opaque. Don't parse one, don't make one up, don't copy one onto another place. Leave them out and P.E.A. works out identity itself.
All five are optional.
exportSchemaVersionstays 3.
v3.2: Time zone. (July 2026, in every build since 70.)
Per-entry
timeZoneID: the IANA time zone the experience happened in ("Asia/Tokyo"), set at creation. When it's there,timeOfDayanddayOfWeekare read on that clock, so an experience archived in another zone keeps its wall clock instead of drifting with the device. Converters write it only when the source really records a zone (Day One'stimeZone, for example), never from a bare UTC offset. Optional.exportSchemaVersionstays 3.
v3.1: Place category. (July 2026, in every build since 70.)
Per-entry
placeCategory: the Apple Maps point-of-interest category of an assigned place, human-readable ("Cafe", "Amusement Park"). Set when a place is picked from Apple Maps search. Plain addresses and custom places have none. Optional.exportSchemaVersionstays 3.
v3: Concepts, which are Topics now. (June 2026.)
conceptstop-level collection +conceptCount. A word or two that says what an experience was about ("soccer", "made", "noticed"), created and associated in the entry editor. Native rows are stampedsource: "pea"with nosourceID. The app renamed them Topics in September 2026; the keys didn't change.Per-entry
conceptUUIDsarray, linking each entry to its topics. Many-to-many, same shape aspeopleUUIDs.On Add data to P.E.A. (merge), topics match by
uuidor(source, sourceID). Native topics (nosourceID) match byuuidonly.People reached the editor. People came in at v2 as a round trip only. From v3 you create and associate them in the entry editor's People field. The wire format is unchanged.
Both additions are optional, so a v1 or v2 archive imports unchanged on a v3 build. An older build refuses a v3 archive with a "please update" message rather than dropping the topics.
v2: Add data + Unset + People (schema only). (May 2026.)
peopletop-level collection +peopleCount. People round-trip through export and import. The in-app surfaces came with v3.Per-entry
peopleUUIDsarray linking each entry to people in the top-levelpeoplearray.Per-entry
sourceID: a stable identifier from the originating system. Withsource, it's the merge key for "Add data to P.E.A.". The samecreatedAtandtextalso mark a duplicate.Per-entry
importPayload: the original record as a string. P.E.A. doesn't read it. It's there so a future import can reach back into fields P.E.A. didn't model the first time.Per-entry
sourceURL: a link back to the original record (Swarm check-in, Day One entry, tweet). Shows as a tappable "View external experience" row. Native captures have none.Per-entry
isIntensityUnset: true on rows that came in through merge from another source and haven't been rated. Shows as a solid light-gray dot at the smallest size (the dashed gray dot is Neutralized, a different thing). Never on native entries.All five are optional, so a v1 archive imports unchanged on a v2 build.
v1: The first public schema. (May 2026.)
One JSON file, no zip.
Top-level
entries,places,mottos.A stable
uuidon every row, for round trips.A permanent
archiveNumberon every entry (the "P.E. #X").A
readmefield, so a person can read the file.Place fields on the entry next to the top-level
placesarray, so an entry is self-describing without cross-references.Per-entry
source:"pea"for native captures, the service name for converted imports. Optional. A file without it is treated as all native.
The format version is independent of the P.E.A. app version. It's a plain integer that only changes when the archive's shape changes. P.E.A. always reads older versions. Newer files are refused with a clear message until you update the app.