Table 2 P.E.A.
Spreadsheet Template
If your data is in a spreadsheet, or you would rather fill in rows in Numbers, Excel or Google Sheets than write JSON, start from this template. Copy the rows into a file named PEA-Import-Template.csv and open it in your spreadsheet:
The columns are in the order you are likely to have the data. The date and what you wrote come first; they are all most entries need. Then where you were and the people and topics to associate, and last what a device captures (weather, activity, music), which you usually have only when converting another app’s export. Leave any column blank. The bare minimum is two columns:
The three example rows are based on the app’s sample archive:
Row 1, Frankies 457 olive oil on Pasta e Piselli. The full case: GPS, weather, activity, music, a nearby point of interest, ambient noise, a person (Felix) and two topics, captured on an Apple Watch.
Row 2, Bunched and finished so many annoying tasks today. The most. No coordinates: a street, a city, a state and the weather, with one topic. You don’t need GPS to log an experience.
Row 3, Falco on Walmart radio. The person wrote about Falco while the device captured September by Earth, Wind & Fire. Both are kept.
To use it:
Replace the example rows with your own. Leave a column blank when you have nothing for it; only the date and the text matter.
For people or topics, type their names in the
peopleandtopicscells, several separated by semicolons (“Felix; Mara”). The conversion makes the UUIDs.Save as CSV.
Convert the CSV to a P.E.A. file: paste it with this prompt into a local model. The import prompt at archive.green/format works with the rows too.
Convert this CSV into a P.E.A. archive JSON file matching the v3 schema at https://archive.green/format. Answer with the JSON only. - One CSV row = one entry in the "entries" array. - "uuid": a new random UUID (8-4-4-4-12 hex) for every entry. - Leave an empty cell out of the JSON. Never write null or "". The one exception is "text", which is required and may be "". - Every row arrives unrated: "archiveNumber": 0, "intensity": 1, "intensityLabel": "Minimum" and "isIntensityUnset": true on EVERY entry. Never guess a strength; I rate each moment in the app. - Use the "createdAt" cell for both "createdAt" and "updatedAt", and derive "timeOfDay", "dayOfWeek" and "season" from it, on the local clock: "Morning" before 12:00, "Afternoon" from 12:00, "Evening" from 17:00, "Night" from 21:00; "Spring" for March to May, "Summer" for June to August, "Autumn" for September to November, "Winter" for December to February, the opposite south of the equator. A time that ends in Z is UTC: read it in the zone of the row's coordinates or town before deriving these. Without coordinates, use the northern table. - If the "source" cell is blank, use "csv". Never "pea". - The "people" and "topics" cells hold semicolon-separated names. For each distinct name, make one object in the top-level "people" or "concepts" array ("uuid", "name", "createdAt", "updatedAt", "source": "csv") and put its uuid in the entry's "peopleUUIDs" or "conceptUUIDs". Topics go into "concepts"; that is the key's name. Reuse the same uuid when a name repeats across rows. - Wrap the entries in the top-level object: "exportSchemaVersion": 3, "exportDate" (today, ISO 8601 with Z), "appVersion": "1.0", "readme": "Converted for P.E.A.", empty "places" and "mottos" arrays, and the "people" and "concepts" arrays built above. Every *Count field is the length of its array. Here is the CSV: [paste]Add the JSON file through Manage → Import & Export → Add data to P.E.A. That is the merge that keeps everything you have. (“Restore P.E.A. from backup” is for your own P.E.A. exports and replaces your whole archive.)
The template leaves out what the conversion fills in (uuid, and the timeOfDay, dayOfWeek and season labels) and the strength columns, since every imported row arrives Unset. For saved places, the moon phase, speed, elevation, steps, the Apple Music store ID or a sourceURL, edit the JSON after conversion. The full field reference is at archive.green/format.
Spreadsheet Template
If your data is in a spreadsheet, or you would rather fill in rows in Numbers, Excel or Google Sheets than write JSON, start from this template. Copy the rows into a file named PEA-Import-Template.csv and open it in your spreadsheet:
The columns are in the order you are likely to have the data. The date and what you wrote come first; they are all most entries need. Then where you were and the people and topics to associate, and last what a device captures (weather, activity, music), which you usually have only when converting another app’s export. Leave any column blank. The bare minimum is two columns:
The three example rows are based on the app’s sample archive:
Row 1, Frankies 457 olive oil on Pasta e Piselli. The full case: GPS, weather, activity, music, a nearby point of interest, ambient noise, a person (Felix) and two topics, captured on an Apple Watch.
Row 2, Bunched and finished so many annoying tasks today. The most. No coordinates: a street, a city, a state and the weather, with one topic. You don’t need GPS to log an experience.
Row 3, Falco on Walmart radio. The person wrote about Falco while the device captured September by Earth, Wind & Fire. Both are kept.
To use it:
Replace the example rows with your own. Leave a column blank when you have nothing for it; only the date and the text matter.
For people or topics, type their names in the
peopleandtopicscells, several separated by semicolons (“Felix; Mara”). The conversion makes the UUIDs.Save as CSV.
Convert the CSV to a P.E.A. file: paste it with this prompt into a local model. The import prompt at archive.green/format works with the rows too.
Convert this CSV into a P.E.A. archive JSON file matching the v3 schema at https://archive.green/format. Answer with the JSON only. - One CSV row = one entry in the "entries" array. - "uuid": a new random UUID (8-4-4-4-12 hex) for every entry. - Leave an empty cell out of the JSON. Never write null or "". The one exception is "text", which is required and may be "". - Every row arrives unrated: "archiveNumber": 0, "intensity": 1, "intensityLabel": "Minimum" and "isIntensityUnset": true on EVERY entry. Never guess a strength; I rate each moment in the app. - Use the "createdAt" cell for both "createdAt" and "updatedAt", and derive "timeOfDay", "dayOfWeek" and "season" from it, on the local clock: "Morning" before 12:00, "Afternoon" from 12:00, "Evening" from 17:00, "Night" from 21:00; "Spring" for March to May, "Summer" for June to August, "Autumn" for September to November, "Winter" for December to February, the opposite south of the equator. A time that ends in Z is UTC: read it in the zone of the row's coordinates or town before deriving these. Without coordinates, use the northern table. - If the "source" cell is blank, use "csv". Never "pea". - The "people" and "topics" cells hold semicolon-separated names. For each distinct name, make one object in the top-level "people" or "concepts" array ("uuid", "name", "createdAt", "updatedAt", "source": "csv") and put its uuid in the entry's "peopleUUIDs" or "conceptUUIDs". Topics go into "concepts"; that is the key's name. Reuse the same uuid when a name repeats across rows. - Wrap the entries in the top-level object: "exportSchemaVersion": 3, "exportDate" (today, ISO 8601 with Z), "appVersion": "1.0", "readme": "Converted for P.E.A.", empty "places" and "mottos" arrays, and the "people" and "concepts" arrays built above. Every *Count field is the length of its array. Here is the CSV: [paste]Add the JSON file through Manage → Import & Export → Add data to P.E.A. That is the merge that keeps everything you have. (“Restore P.E.A. from backup” is for your own P.E.A. exports and replaces your whole archive.)
The template leaves out what the conversion fills in (uuid, and the timeOfDay, dayOfWeek and season labels) and the strength columns, since every imported row arrives Unset. For saved places, the moon phase, speed, elevation, steps, the Apple Music store ID or a sourceURL, edit the JSON after conversion. The full field reference is at archive.green/format.
Spreadsheet Template
If your data is in a spreadsheet, or you would rather fill in rows in Numbers, Excel or Google Sheets than write JSON, start from this template. Copy the rows into a file named PEA-Import-Template.csv and open it in your spreadsheet:
The columns are in the order you are likely to have the data. The date and what you wrote come first; they are all most entries need. Then where you were and the people and topics to associate, and last what a device captures (weather, activity, music), which you usually have only when converting another app’s export. Leave any column blank. The bare minimum is two columns:
The three example rows are based on the app’s sample archive:
Row 1, Frankies 457 olive oil on Pasta e Piselli. The full case: GPS, weather, activity, music, a nearby point of interest, ambient noise, a person (Felix) and two topics, captured on an Apple Watch.
Row 2, Bunched and finished so many annoying tasks today. The most. No coordinates: a street, a city, a state and the weather, with one topic. You don’t need GPS to log an experience.
Row 3, Falco on Walmart radio. The person wrote about Falco while the device captured September by Earth, Wind & Fire. Both are kept.
To use it:
Replace the example rows with your own. Leave a column blank when you have nothing for it; only the date and the text matter.
For people or topics, type their names in the
peopleandtopicscells, several separated by semicolons (“Felix; Mara”). The conversion makes the UUIDs.Save as CSV.
Convert the CSV to a P.E.A. file: paste it with this prompt into a local model. The import prompt at archive.green/format works with the rows too.
Convert this CSV into a P.E.A. archive JSON file matching the v3 schema at https://archive.green/format. Answer with the JSON only. - One CSV row = one entry in the "entries" array. - "uuid": a new random UUID (8-4-4-4-12 hex) for every entry. - Leave an empty cell out of the JSON. Never write null or "". The one exception is "text", which is required and may be "". - Every row arrives unrated: "archiveNumber": 0, "intensity": 1, "intensityLabel": "Minimum" and "isIntensityUnset": true on EVERY entry. Never guess a strength; I rate each moment in the app. - Use the "createdAt" cell for both "createdAt" and "updatedAt", and derive "timeOfDay", "dayOfWeek" and "season" from it, on the local clock: "Morning" before 12:00, "Afternoon" from 12:00, "Evening" from 17:00, "Night" from 21:00; "Spring" for March to May, "Summer" for June to August, "Autumn" for September to November, "Winter" for December to February, the opposite south of the equator. A time that ends in Z is UTC: read it in the zone of the row's coordinates or town before deriving these. Without coordinates, use the northern table. - If the "source" cell is blank, use "csv". Never "pea". - The "people" and "topics" cells hold semicolon-separated names. For each distinct name, make one object in the top-level "people" or "concepts" array ("uuid", "name", "createdAt", "updatedAt", "source": "csv") and put its uuid in the entry's "peopleUUIDs" or "conceptUUIDs". Topics go into "concepts"; that is the key's name. Reuse the same uuid when a name repeats across rows. - Wrap the entries in the top-level object: "exportSchemaVersion": 3, "exportDate" (today, ISO 8601 with Z), "appVersion": "1.0", "readme": "Converted for P.E.A.", empty "places" and "mottos" arrays, and the "people" and "concepts" arrays built above. Every *Count field is the length of its array. Here is the CSV: [paste]Add the JSON file through Manage → Import & Export → Add data to P.E.A. That is the merge that keeps everything you have. (“Restore P.E.A. from backup” is for your own P.E.A. exports and replaces your whole archive.)
The template leaves out what the conversion fills in (uuid, and the timeOfDay, dayOfWeek and season labels) and the strength columns, since every imported row arrives Unset. For saved places, the moon phase, speed, elevation, steps, the Apple Music store ID or a sourceURL, edit the JSON after conversion. The full field reference is at archive.green/format.
Colophon
Positive Experience Archive / P.E.A.
is made by Florian in Seattle with care and good intentions.
Made with
Ableton / Acorn / Apple Watch / BBEdit / Claude Code / CleanShot X / Darkroom / Figma / Framer / FUJIFILM X100T+V / GitHub / HandBrake / iCloud / Icon Designer / iPhone / Keynote / Linear / JavaScript / Mac Mini / MacBook Pro / Paper / Pencil / Pixelmator Pro / Photos app / Python / SF Rounded / Sketch / SwiftUI / Terminal / Xcode
2163 P.E.s archived in the process.
When we lose focus,
we forget who we are.
No animals harmed,
human-tested only.
”Support people, not corporations.”
—David Watanabe
Positive
Experience
Archive
©2026 Fangohr, LLC
Colophon
Positive Experience Archive / P.E.A.
is made by Florian in Seattle with care and good intentions.
Made with
Ableton / Acorn / Apple Watch / BBEdit / Claude Code / CleanShot X / Darkroom / Figma / Framer / FUJIFILM X100T+V / GitHub / HandBrake / iCloud / Icon Designer / iPhone / Keynote / Linear / JavaScript / Mac Mini / MacBook Pro / Paper / Pencil / Pixelmator Pro / Photos app / Python / SF Rounded / Sketch / SwiftUI / Terminal / Xcode
2163 P.E.s archived in the process.
When we lose focus,
we forget who we are.
No animals harmed,
human-tested only.
”Support people, not corporations.”
—David Watanabe
Positive
Experience
Archive
©2026 Fangohr, LLC
Colophon
Positive Experience Archive / P.E.A.
is made by Florian in Seattle with care and good intentions.
Made with
Ableton / Acorn / Apple Watch / BBEdit / Claude Code / CleanShot X / Darkroom / Figma / Framer / FUJIFILM X100T+V / GitHub / HandBrake / iCloud / Icon Designer / iPhone / Keynote / Linear / JavaScript / Mac Mini / MacBook Pro / Paper / Pencil / Pixelmator Pro / Photos app / Python / SF Rounded / Sketch / SwiftUI / Terminal / Xcode
2163 P.E.s archived in the process.
When we lose focus,
we forget who we are.
No animals harmed,
human-tested only.
”Support people, not corporations.”
—David Watanabe
Positive
Experience
Archive
©2026 Fangohr, LLC