[{"data":1,"prerenderedAt":3490},["ShallowReactive",2],{"apps-index":3},[4,102,190,1390,1526,1602,1663,1731,1782,1845,1905,1969,2023,2070,2134,2200,2270,2356],{"id":5,"title":6,"app_id":7,"apple_store":8,"body":9,"description":16,"export":17,"export_shape":18,"extension":19,"google_play":20,"import":21,"last_verified":22,"license":22,"links":23,"logo":22,"mapping":27,"meta":46,"modules":47,"name":6,"navigation":17,"order":91,"path":92,"platform":93,"repo":94,"self_reported":17,"seo":95,"spec_version":96,"status":97,"stem":98,"summary":99,"website":100,"__hash__":101},"apps\u002Fapps\u002Fprism.md","Prism","prism","https:\u002F\u002Ftestflight.apple.com\u002Fjoin\u002FeuZtqXJN",{"type":10,"value":11,"toc":12},"minimark",[],{"title":13,"searchDepth":14,"depth":14,"links":15},"",2,[],"Local-first Flutter app with structured data tables and an encrypted .prism export envelope.",true,"Encrypted .prism JSON envelope","md","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.prismplural.prism",false,null,[24],{"label":25,"href":26},"Research Doc","https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fprism.md",[28,31,34,37,40,43],{"source":29,"target":30},"headmates[]","Member",{"source":32,"target":33},"frontSessions[] + sleepSessions[]","FrontPeriod with single-member assignments; sleep via status: \"sleep\"",{"source":35,"target":36},"memberGroups[] with parentGroupId","Group + GroupMembership",{"source":38,"target":39},"customFields[] + customFieldValues[]","CustomFieldDefinition + CustomFieldValue",{"source":41,"target":42},"conversations[] + messages[] + mediaAttachments[]","Conversation + ChatMessage + Attachment",{"source":44,"target":45},"member_board_posts (sync-only, not in .prism export envelope)","BoardPost in the boards module",{},[48,50,53,56,59,61,64,67,70,72,75,77,79,81,83,85,87,89],{"key":49,"support":22,"note":22},"systems",{"key":51,"support":52,"note":22},"members","full",{"key":54,"support":22,"note":55},"fronting","Per-member intervals plus sleep",{"key":57,"support":22,"note":58},"groups","Hierarchical groups",{"key":60,"support":22,"note":58},"taxonomy",{"key":62,"support":22,"note":63},"custom_fields","Definitions and values",{"key":65,"support":22,"note":66},"notes","Notes",{"key":68,"support":22,"note":69},"assets","Assets, friend\u002Fshare metadata",{"key":71,"support":22,"note":69},"privacy",{"key":73,"support":22,"note":74},"chat","Internal chat with media + member board posts",{"key":76,"support":22,"note":22},"boards",{"key":78,"support":22,"note":22},"relationships",{"key":80,"support":22,"note":22},"polls",{"key":82,"support":22,"note":22},"reminders",{"key":84,"support":22,"note":22},"habits",{"key":86,"support":22,"note":22},"proxy",{"key":88,"support":22,"note":22},"sharing",{"key":90,"support":22,"note":22},"safety",0,"\u002Fapps\u002Fprism","Android (Early Access), iOS (Testflight)","https:\u002F\u002Fgithub.com\u002Fprismplural\u002Fprism-app",{"description":16},"v0.1","adopter","apps\u002Fprism","Local-first Flutter app with structured database tables and an encrypted .prism export envelope (currently V3). Broad in scope: members, fronting, groups, custom fields, chat, member board posts, polls, habits, reminders, media, and local sharing.","https:\u002F\u002Fprismplural.com\u002F","NnCX4WW_4Uo3selW7Mrr_3Sd9dkFA1tgTz4N9zY0gvg",{"id":103,"title":104,"app_id":105,"apple_store":106,"body":107,"description":111,"export":17,"export_shape":112,"extension":19,"google_play":113,"import":17,"last_verified":114,"license":115,"links":116,"logo":119,"mapping":120,"meta":145,"modules":146,"name":104,"navigation":17,"order":180,"path":181,"platform":182,"repo":183,"self_reported":17,"seo":184,"spec_version":185,"status":97,"stem":186,"summary":187,"website":188,"__hash__":189},"apps\u002Fapps\u002Fsheaf.md","Sheaf","sheaf","https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fsheaf-plural-system-tracker\u002Fid6766770364",{"type":10,"value":108,"toc":109},[],{"title":13,"searchDepth":14,"depth":14,"links":110},[],"FastAPI\u002FPostgreSQL app exposing JSON export v2 plus async zip backups with images.","\u002Fv1\u002Fexport JSON v2; async zip backup with images","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=systems.lupine.sheaf","2026-09-08","AGPL-3.0-or-later",[117],{"label":25,"href":118},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fsheaf.md","https:\u002F\u002Fsheaf.sh\u002Fimages\u002Fsheaf-pluralport-embed.png",[121,124,126,129,131,134,136,139,142],{"source":122,"target":123},"system object","System",{"source":125,"target":30},"members[]",{"source":127,"target":128},"fronts[] with inline member_ids","FrontPeriod + one FrontAssignment per member_id",{"source":130,"target":36},"groups[] with parent_id + member_ids",{"source":132,"target":133},"tags[] with inline member_ids","TaxonomyTerm + TaxonomyAssignment",{"source":135,"target":39},"custom_fields[] with nested values",{"source":137,"target":138},"journals[]","Note",{"source":140,"target":141},"messages[]","BoardPost; replies are preserved in extensions for now",{"source":143,"target":144},"polls[], reminders[]","extensions.sheaf.* until modules land",{},[147,149,150,152,154,156,158,160,163,165,167,168,170,171,172,174,176,178],{"key":49,"support":52,"note":148},"System profile, settings, safety and retention config.",{"key":51,"support":52,"note":22},{"key":54,"support":52,"note":151},"Co-front intervals and point-in-time switches (front_events).",{"key":57,"support":52,"note":153},"Hierarchical groups with manual ordering.",{"key":60,"support":52,"note":155},"Tags.",{"key":62,"support":52,"note":157},"Definitions and values, including select choices and privacy.",{"key":65,"support":52,"note":159},"Journals with revision history.",{"key":68,"support":161,"note":162},"partial","Avatar\u002Fbanner URLs and an optional zip bundle with images.",{"key":71,"support":52,"note":164},"Per-member, group, field, and relationship levels.",{"key":73,"support":52,"note":166},"Board messages.",{"key":76,"support":52,"note":22},{"key":78,"support":52,"note":169},"Types plus member and group relationships.",{"key":80,"support":52,"note":22},{"key":82,"support":52,"note":22},{"key":84,"support":173,"note":22},"none",{"key":86,"support":173,"note":175},"Sheaf does not proxy messages.",{"key":88,"support":161,"note":177},"Share views round-trip; grants (live links) are deliberately never exported.",{"key":90,"support":52,"note":179},"Carried in the sheaf extension.",1,"\u002Fapps\u002Fsheaf","Web (hosted), Android+WearOS, iOS+WatchOS","https:\u002F\u002Fgithub.com\u002Fsheaf-project\u002Fsheaf",{"description":111},"0.1","apps\u002Fsheaf","FastAPI\u002FPostgreSQL app with application-level encryption. It already exposes \u002Fv1\u002Fexport returning JSON v2 with system, members, fronts, groups, tags, custom fields, journals, revision history, board messages, polls, reminders, watch-token notification config, and uploaded-file inventory.","https:\u002F\u002Fsheaf.sh","nTfRmmI6T85Uxud68gPeiBzTVIP_OgN2JSy_KrViN40",{"id":191,"title":192,"app_id":193,"apple_store":22,"body":194,"description":1302,"export":17,"export_shape":1303,"extension":19,"google_play":22,"import":17,"last_verified":1304,"license":1305,"links":1306,"logo":1310,"mapping":1311,"meta":1346,"modules":1347,"name":725,"navigation":17,"order":14,"path":1383,"platform":1384,"repo":13,"self_reported":17,"seo":1385,"spec_version":185,"status":97,"stem":1386,"summary":1387,"website":1388,"__hash__":1389},"apps\u002Fapps\u002Fpluralspace.md","Pluralspace","pluralspace",{"type":10,"value":195,"toc":1288},[196,201,205,208,212,215,218,221,566,570,573,581,603,614,621,636,898,902,917,923,929,932,942,946,989,994,998,1024,1035,1195,1202,1206,1211,1234,1238,1252,1256,1267,1271,1274,1281,1284],[197,198,200],"h2",{"id":199},"what-pluralspace-is","What PluralSpace is",[202,203,204],"p",{},"PluralSpace is an app for plural systems (web, PWA, and mobile soon). It is a monolithic Laravel setup with\nInertiaJS and VueJS as the current UI. Mobile apps are being written in CapacitorJS, and use an on-device\nencrypted SQLite database for offline support with sync to PluralSpace's API.",[202,206,207],{},"PluralSpace helped shape several PluralPort modules. The provisional relationships module for example\nwas first mapped against PluralSpace's data model and then generalized.",[197,209,211],{"id":210},"infrastructure","Infrastructure",[202,213,214],{},"PluralSpace runs on a cluster of servers with a load balancer in front of them. 3 servers run the web app, api, feedback\nportal, support portal, and public profiles (public profiles are deprecated, and will be removed in a future release).",[202,216,217],{},"2 servers are dedicated to queue workers, which handle background tasks like sending emails, generating exports, and\nprocessing imports, and any request that would take longer than a few seconds to complete. The queue workers are also\nresponsible for generating the ZIP files for exports, and for processing the ZIP files for imports.",[202,219,220],{},"This may seem overkill, but it allows PluralSpace to support the ~5.5 million requests per day (~150 million requests per month)\nthe app receives and the ~16,000 daily active users (1.3-2k concurrent at any time), while still being able to process everything.",[222,223,227],"pre",{"className":224,"code":225,"language":226,"meta":13,"style":13},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart LR\n    web[\"Web users\"]\n    api[\"API requests\"]\n    mobile[\"Mobile apps\"]\n\n    cloudflare[\"Cloudflare\u003Cbr\u002F>Proxy enabled\"]\n    r2[(\"Cloudflare R2\u003Cbr\u002F>Object storage\")]\n\n    web -->|\"HTTPS\u002FWSS\"| cloudflare\n    api -->|\"HTTPS\"| cloudflare\n    mobile -->|\"API\u002FOTA\u002FWSS\"| cloudflare\n\n    subgraph vpc[\"VPC - DigitalOcean infrastructure\"]\n        lb[\"Load balancer\u003Cbr\u002F>Only public endpoint\"]\n\n        subgraph private[\"Private Infra\"]\n            subgraph apps[\"3 application servers (Web\u002FAPI)\"]\n                app1[\"App server 1\"]\n                app2[\"App server 2\"]\n                app3[\"App server 3\"]\n            end\n\n            websocket[\"WebSocket server\u003Cbr\u002F>1 server\"]\n            ota[\"OTA update server\u003Cbr\u002F>Upcoming mobile infrastructure\"]\n\n            subgraph workers[\"Queue workers and cron jobs\"]\n                worker1[\"Worker server 1\"]\n                worker2[\"Worker server 2\"]\n            end\n\n            postgres[(\"PostgreSQL 18\")]\n            redis[(\"Redis\")]\n            meili[\"Meilisearch\"]\n            sentry[\"Sentry\u003Cbr\u002F>Backend errors only no PII\u003Cbr\u002F>Self hosted w\u002Fo telemetry\"]\n        end\n\n        lb -->|\"Web\u002FAPI\"| apps\n        lb \u003C-->|\"WebSocket traffic\"| websocket\n        lb -->|\"OTA requests\"| ota\n\n        apps \u003C--> postgres\n        apps \u003C--> redis\n        apps \u003C--> meili\n        apps --> websocket\n\n        redis \u003C-->|\"Queued jobs\"| workers\n        workers \u003C--> postgres\n        workers \u003C--> meili\n        workers --> websocket\n\n        apps -.-> sentry\n        workers -.-> sentry\n    end\n\n    cloudflare -->|\"HTTPS\u002FWSS\"| lb\n    cloudflare \u003C--> r2\n    apps --> r2\n    workers --> r2\n","mermaid",[228,229,230,237,242,248,254,260,266,272,277,283,289,295,300,306,312,317,323,329,335,341,347,353,358,364,370,375,381,387,393,398,403,409,415,421,427,433,438,444,450,456,461,467,473,479,485,490,496,502,508,514,519,525,531,537,542,548,554,560],"code",{"__ignoreMap":13},[231,232,234],"span",{"class":233,"line":180},"line",[231,235,236],{},"flowchart LR\n",[231,238,239],{"class":233,"line":14},[231,240,241],{},"    web[\"Web users\"]\n",[231,243,245],{"class":233,"line":244},3,[231,246,247],{},"    api[\"API requests\"]\n",[231,249,251],{"class":233,"line":250},4,[231,252,253],{},"    mobile[\"Mobile apps\"]\n",[231,255,257],{"class":233,"line":256},5,[231,258,259],{"emptyLinePlaceholder":17},"\n",[231,261,263],{"class":233,"line":262},6,[231,264,265],{},"    cloudflare[\"Cloudflare\u003Cbr\u002F>Proxy enabled\"]\n",[231,267,269],{"class":233,"line":268},7,[231,270,271],{},"    r2[(\"Cloudflare R2\u003Cbr\u002F>Object storage\")]\n",[231,273,275],{"class":233,"line":274},8,[231,276,259],{"emptyLinePlaceholder":17},[231,278,280],{"class":233,"line":279},9,[231,281,282],{},"    web -->|\"HTTPS\u002FWSS\"| cloudflare\n",[231,284,286],{"class":233,"line":285},10,[231,287,288],{},"    api -->|\"HTTPS\"| cloudflare\n",[231,290,292],{"class":233,"line":291},11,[231,293,294],{},"    mobile -->|\"API\u002FOTA\u002FWSS\"| cloudflare\n",[231,296,298],{"class":233,"line":297},12,[231,299,259],{"emptyLinePlaceholder":17},[231,301,303],{"class":233,"line":302},13,[231,304,305],{},"    subgraph vpc[\"VPC - DigitalOcean infrastructure\"]\n",[231,307,309],{"class":233,"line":308},14,[231,310,311],{},"        lb[\"Load balancer\u003Cbr\u002F>Only public endpoint\"]\n",[231,313,315],{"class":233,"line":314},15,[231,316,259],{"emptyLinePlaceholder":17},[231,318,320],{"class":233,"line":319},16,[231,321,322],{},"        subgraph private[\"Private Infra\"]\n",[231,324,326],{"class":233,"line":325},17,[231,327,328],{},"            subgraph apps[\"3 application servers (Web\u002FAPI)\"]\n",[231,330,332],{"class":233,"line":331},18,[231,333,334],{},"                app1[\"App server 1\"]\n",[231,336,338],{"class":233,"line":337},19,[231,339,340],{},"                app2[\"App server 2\"]\n",[231,342,344],{"class":233,"line":343},20,[231,345,346],{},"                app3[\"App server 3\"]\n",[231,348,350],{"class":233,"line":349},21,[231,351,352],{},"            end\n",[231,354,356],{"class":233,"line":355},22,[231,357,259],{"emptyLinePlaceholder":17},[231,359,361],{"class":233,"line":360},23,[231,362,363],{},"            websocket[\"WebSocket server\u003Cbr\u002F>1 server\"]\n",[231,365,367],{"class":233,"line":366},24,[231,368,369],{},"            ota[\"OTA update server\u003Cbr\u002F>Upcoming mobile infrastructure\"]\n",[231,371,373],{"class":233,"line":372},25,[231,374,259],{"emptyLinePlaceholder":17},[231,376,378],{"class":233,"line":377},26,[231,379,380],{},"            subgraph workers[\"Queue workers and cron jobs\"]\n",[231,382,384],{"class":233,"line":383},27,[231,385,386],{},"                worker1[\"Worker server 1\"]\n",[231,388,390],{"class":233,"line":389},28,[231,391,392],{},"                worker2[\"Worker server 2\"]\n",[231,394,396],{"class":233,"line":395},29,[231,397,352],{},[231,399,401],{"class":233,"line":400},30,[231,402,259],{"emptyLinePlaceholder":17},[231,404,406],{"class":233,"line":405},31,[231,407,408],{},"            postgres[(\"PostgreSQL 18\")]\n",[231,410,412],{"class":233,"line":411},32,[231,413,414],{},"            redis[(\"Redis\")]\n",[231,416,418],{"class":233,"line":417},33,[231,419,420],{},"            meili[\"Meilisearch\"]\n",[231,422,424],{"class":233,"line":423},34,[231,425,426],{},"            sentry[\"Sentry\u003Cbr\u002F>Backend errors only no PII\u003Cbr\u002F>Self hosted w\u002Fo telemetry\"]\n",[231,428,430],{"class":233,"line":429},35,[231,431,432],{},"        end\n",[231,434,436],{"class":233,"line":435},36,[231,437,259],{"emptyLinePlaceholder":17},[231,439,441],{"class":233,"line":440},37,[231,442,443],{},"        lb -->|\"Web\u002FAPI\"| apps\n",[231,445,447],{"class":233,"line":446},38,[231,448,449],{},"        lb \u003C-->|\"WebSocket traffic\"| websocket\n",[231,451,453],{"class":233,"line":452},39,[231,454,455],{},"        lb -->|\"OTA requests\"| ota\n",[231,457,459],{"class":233,"line":458},40,[231,460,259],{"emptyLinePlaceholder":17},[231,462,464],{"class":233,"line":463},41,[231,465,466],{},"        apps \u003C--> postgres\n",[231,468,470],{"class":233,"line":469},42,[231,471,472],{},"        apps \u003C--> redis\n",[231,474,476],{"class":233,"line":475},43,[231,477,478],{},"        apps \u003C--> meili\n",[231,480,482],{"class":233,"line":481},44,[231,483,484],{},"        apps --> websocket\n",[231,486,488],{"class":233,"line":487},45,[231,489,259],{"emptyLinePlaceholder":17},[231,491,493],{"class":233,"line":492},46,[231,494,495],{},"        redis \u003C-->|\"Queued jobs\"| workers\n",[231,497,499],{"class":233,"line":498},47,[231,500,501],{},"        workers \u003C--> postgres\n",[231,503,505],{"class":233,"line":504},48,[231,506,507],{},"        workers \u003C--> meili\n",[231,509,511],{"class":233,"line":510},49,[231,512,513],{},"        workers --> websocket\n",[231,515,517],{"class":233,"line":516},50,[231,518,259],{"emptyLinePlaceholder":17},[231,520,522],{"class":233,"line":521},51,[231,523,524],{},"        apps -.-> sentry\n",[231,526,528],{"class":233,"line":527},52,[231,529,530],{},"        workers -.-> sentry\n",[231,532,534],{"class":233,"line":533},53,[231,535,536],{},"    end\n",[231,538,540],{"class":233,"line":539},54,[231,541,259],{"emptyLinePlaceholder":17},[231,543,545],{"class":233,"line":544},55,[231,546,547],{},"    cloudflare -->|\"HTTPS\u002FWSS\"| lb\n",[231,549,551],{"class":233,"line":550},56,[231,552,553],{},"    cloudflare \u003C--> r2\n",[231,555,557],{"class":233,"line":556},57,[231,558,559],{},"    apps --> r2\n",[231,561,563],{"class":233,"line":562},58,[231,564,565],{},"    workers --> r2\n",[197,567,569],{"id":568},"export-shape","Export shape",[202,571,572],{},"A per-system export is a ZIP, with a layout like this:",[222,574,579],{"className":575,"code":577,"language":578},[576],"language-text","pluralspace-export-2026-09-06.zip\n├── manifest.json\n├── openplural.json\n└── media\u002F\n    ├── member-avatar-018f2c3a-....webp\n    └── system-banner-018f2c41-....webp\n","text",[228,580,577],{"__ignoreMap":13},[202,582,583,584,587,588,591,592,595,596,599,600,602],{},"The implementation currently uses the legacy OpenPlural naming: ",[228,585,586],{},"openplural.json"," for the document and\n",[228,589,590],{},"openplural_version"," for its version marker. This applies to current exports as well as older ones.\n",[228,593,594],{},"manifest.json"," contains export metadata such as the date, format version, system name, and account email.\nMedia paths and SHA-256 checksums live in ",[228,597,598],{},"assets[]"," inside ",[228,601,586],{},".",[202,604,605,606,609,610,613],{},"A whole-account export contains account-level data plus one document at ",[228,607,608],{},"systems\u002F{slug}\u002Fopenplural.json","\nand a separate ",[228,611,612],{},"media\u002F"," directory inside each owned system's folder.",[202,615,616,617,620],{},"An abbreviated example of the current envelope is below. The exporter currently lists only the optional modules\nin ",[228,618,619],{},"capabilities.modules","; the other exported sections are still included in the document.",[202,622,623,627,628,631,632,635],{},[624,625,626],"strong",{},"NOTE:"," Upcoming update will include both ",[228,629,630],{},"pluralport.json"," and ",[228,633,634],{},"pluralport_version"," alongside the legacy OpenPlural fields,\nso that other apps can detect the PluralPort version without needing to rely solely on the legacy OpenPlural fields.",[222,637,641],{"className":638,"code":639,"language":640,"meta":13,"style":13},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"openplural_version\": \"0.1\",\n  \"exported_at\": \"2026-09-06T18:00:00Z\",\n  \"producer\": {\n    \"app\": \"PluralSpace\",\n    \"app_id\": \"pluralspace\",\n    \"app_version\": \"unknown\",\n    \"exporter_version\": \"0.1\"\n  },\n  \"capabilities\": {\n    \"modules\": [\n      \"chat\",\n      \"relationships\",\n      \"polls\",\n      \"boards\"\n    ]\n  },\n  \"systems\": [],\n  \"members\": []\n}\n","json",[228,642,643,649,674,694,708,730,749,769,787,792,805,819,830,840,850,858,863,867,880,893],{"__ignoreMap":13},[231,644,645],{"class":233,"line":180},[231,646,648],{"class":647},"sMK4o","{\n",[231,650,651,654,657,660,663,666,669,671],{"class":233,"line":14},[231,652,653],{"class":647},"  \"",[231,655,590],{"class":656},"spNyl",[231,658,659],{"class":647},"\"",[231,661,662],{"class":647},":",[231,664,665],{"class":647}," \"",[231,667,185],{"class":668},"sfazB",[231,670,659],{"class":647},[231,672,673],{"class":647},",\n",[231,675,676,678,681,683,685,687,690,692],{"class":233,"line":244},[231,677,653],{"class":647},[231,679,680],{"class":656},"exported_at",[231,682,659],{"class":647},[231,684,662],{"class":647},[231,686,665],{"class":647},[231,688,689],{"class":668},"2026-09-06T18:00:00Z",[231,691,659],{"class":647},[231,693,673],{"class":647},[231,695,696,698,701,703,705],{"class":233,"line":250},[231,697,653],{"class":647},[231,699,700],{"class":656},"producer",[231,702,659],{"class":647},[231,704,662],{"class":647},[231,706,707],{"class":647}," {\n",[231,709,710,713,717,719,721,723,726,728],{"class":233,"line":256},[231,711,712],{"class":647},"    \"",[231,714,716],{"class":715},"sBMFI","app",[231,718,659],{"class":647},[231,720,662],{"class":647},[231,722,665],{"class":647},[231,724,725],{"class":668},"PluralSpace",[231,727,659],{"class":647},[231,729,673],{"class":647},[231,731,732,734,737,739,741,743,745,747],{"class":233,"line":262},[231,733,712],{"class":647},[231,735,736],{"class":715},"app_id",[231,738,659],{"class":647},[231,740,662],{"class":647},[231,742,665],{"class":647},[231,744,193],{"class":668},[231,746,659],{"class":647},[231,748,673],{"class":647},[231,750,751,753,756,758,760,762,765,767],{"class":233,"line":268},[231,752,712],{"class":647},[231,754,755],{"class":715},"app_version",[231,757,659],{"class":647},[231,759,662],{"class":647},[231,761,665],{"class":647},[231,763,764],{"class":668},"unknown",[231,766,659],{"class":647},[231,768,673],{"class":647},[231,770,771,773,776,778,780,782,784],{"class":233,"line":274},[231,772,712],{"class":647},[231,774,775],{"class":715},"exporter_version",[231,777,659],{"class":647},[231,779,662],{"class":647},[231,781,665],{"class":647},[231,783,185],{"class":668},[231,785,786],{"class":647},"\"\n",[231,788,789],{"class":233,"line":279},[231,790,791],{"class":647},"  },\n",[231,793,794,796,799,801,803],{"class":233,"line":285},[231,795,653],{"class":647},[231,797,798],{"class":656},"capabilities",[231,800,659],{"class":647},[231,802,662],{"class":647},[231,804,707],{"class":647},[231,806,807,809,812,814,816],{"class":233,"line":291},[231,808,712],{"class":647},[231,810,811],{"class":715},"modules",[231,813,659],{"class":647},[231,815,662],{"class":647},[231,817,818],{"class":647}," [\n",[231,820,821,824,826,828],{"class":233,"line":297},[231,822,823],{"class":647},"      \"",[231,825,73],{"class":668},[231,827,659],{"class":647},[231,829,673],{"class":647},[231,831,832,834,836,838],{"class":233,"line":302},[231,833,823],{"class":647},[231,835,78],{"class":668},[231,837,659],{"class":647},[231,839,673],{"class":647},[231,841,842,844,846,848],{"class":233,"line":308},[231,843,823],{"class":647},[231,845,80],{"class":668},[231,847,659],{"class":647},[231,849,673],{"class":647},[231,851,852,854,856],{"class":233,"line":314},[231,853,823],{"class":647},[231,855,76],{"class":668},[231,857,786],{"class":647},[231,859,860],{"class":233,"line":319},[231,861,862],{"class":647},"    ]\n",[231,864,865],{"class":233,"line":325},[231,866,791],{"class":647},[231,868,869,871,873,875,877],{"class":233,"line":331},[231,870,653],{"class":647},[231,872,49],{"class":656},[231,874,659],{"class":647},[231,876,662],{"class":647},[231,878,879],{"class":647}," [],\n",[231,881,882,884,886,888,890],{"class":233,"line":337},[231,883,653],{"class":647},[231,885,51],{"class":656},[231,887,659],{"class":647},[231,889,662],{"class":647},[231,891,892],{"class":647}," []\n",[231,894,895],{"class":233,"line":343},[231,896,897],{"class":647},"}\n",[197,899,901],{"id":900},"import-behaviour","Import behaviour",[202,903,904,905,907,908,910,911,913,914,916],{},"PluralSpace accepts the legacy OpenPlural document shape as a JSON file or a ZIP containing ",[228,906,586],{},".\nThe document must include ",[228,909,590],{},"; a document containing only ",[228,912,634],{},", or a ZIP\ncontaining only ",[228,915,630],{},", is not currently accepted. A JSON-only import skips bundled media.",[202,918,919,920,602],{},"Unsupported modules and extension namespaces are not imported. Known unsupported modules and unrecognised\ntop-level extensions produce warnings, but there is no complete report of every dropped field. The synchronous\nimporter returns created and skipped counts per step. Queued imports show completion status and warning or error\nmessages instead of returning a structured PluralPort ",[228,921,922],{},"ImportResult",[202,924,925,926,928],{},"Records are matched using stored source references, with the file's record ID under the producer's ",[228,927,736],{}," as a\nfallback identity. Members and groups can also match upstream references from another app. Otherwise PluralSpace\ncreates new IDs. Matching records are generally skipped rather than updated, so re-importing is not a sync operation.",[202,930,931],{},"Fields inside a known record are imported only where PluralSpace has an explicit mapping. Unknown fields and\nunsupported extensions are not stored for a later export.",[202,933,934,936,937,631,939,941],{},[624,935,626],{}," Upcoming update will look for ",[228,938,630],{},[228,940,634],{}," and fall back to the legacy OpenPlural\nspec name.",[197,943,945],{"id":944},"known-loss","Known loss",[947,948,949,953,956,959,962,965,968,971,974,982],"ul",{},[950,951,952],"li",{},"Chat attachments and message reactions are not exported. Message text and member author references are exported,\nbut references to members in systems the exporting user does not own are removed.",[950,954,955],{},"Member profile visibility and field visibility overrides are exported but not restored on import. Only the first\nproxy-tag pair is imported.",[950,957,958],{},"Separate front events and front comments are not imported. Front interval notes are carried on the periods.",[950,960,961],{},"Text, textarea, and link custom-field types all export as text, so their original type distinction is lost.",[950,963,964],{},"Partner-only note and journal visibility becomes trusted. Imports do not restore the source system's visibility\nor public profile.",[950,966,967],{},"Board imports retain body, author, pinned state, and creation time, but do not retain target member, title, or audience.",[950,969,970],{},"Asset support covers member and system avatars and banners, plus the system media library. JSON-only imports\ncannot restore bundled files.",[950,972,973],{},"Unknown fields and unsupported extensions are dropped on import.",[950,975,976,977,631,979,981],{},"The ",[228,978,78],{},[228,980,80],{}," modules are still provisional. PluralSpace exports its current field interpretation,\nwhich may not match the final v0.1 shape.",[950,983,984,985,988],{},"Mood history is not a standard module. It lives in ",[228,986,987],{},"extensions[\"pluralspace:moods\"]",", so other importers may\nignore or drop it unless they preserve unsupported extensions.",[202,990,991,993],{},[624,992,626],{}," We are working on updates that will improve import\u002Fexport fidelity, preventing as much loss as possible.",[197,995,997],{"id":996},"extensions-namespace","Extensions namespace",[202,999,1000,1001,1004,1005,1008,1009,1012,1013,1012,1016,1019,1020,1023],{},"Mood history is namespaced under ",[228,1002,1003],{},"pluralspace:moods",". Other PluralSpace-specific fields currently use unprefixed\nkeys inside record-level ",[228,1006,1007],{},"extensions",", such as ",[228,1010,1011],{},"kind",", ",[228,1014,1015],{},"is_pinned",[228,1017,1018],{},"profile_visibility",", and ",[228,1021,1022],{},"is_multiple",".\nThe implementation does not yet namespace every app-specific field.",[202,1025,1026,1027,1030,1031,1034],{},"Mood entries describe intervals. A null ",[228,1028,1029],{},"member_id"," means a whole-system mood, and a null ",[228,1032,1033],{},"ended_at"," means the\ninterval is still open:",[222,1036,1038],{"className":638,"code":1037,"language":640,"meta":13,"style":13},"{\n  \"extensions\": {\n    \"pluralspace:moods\": [\n      {\n        \"id\": \"018f2c3a-3270-7df0-8a94-74293079c4d1\",\n        \"mood\": \"content\",\n        \"member_id\": null,\n        \"started_at\": \"2026-09-01T14:02:00Z\",\n        \"ended_at\": null,\n        \"created_at\": \"2026-09-01T14:02:00Z\"\n      }\n    ]\n  }\n}\n",[228,1039,1040,1044,1056,1068,1073,1095,1115,1128,1148,1160,1177,1182,1186,1191],{"__ignoreMap":13},[231,1041,1042],{"class":233,"line":180},[231,1043,648],{"class":647},[231,1045,1046,1048,1050,1052,1054],{"class":233,"line":14},[231,1047,653],{"class":647},[231,1049,1007],{"class":656},[231,1051,659],{"class":647},[231,1053,662],{"class":647},[231,1055,707],{"class":647},[231,1057,1058,1060,1062,1064,1066],{"class":233,"line":244},[231,1059,712],{"class":647},[231,1061,1003],{"class":715},[231,1063,659],{"class":647},[231,1065,662],{"class":647},[231,1067,818],{"class":647},[231,1069,1070],{"class":233,"line":250},[231,1071,1072],{"class":647},"      {\n",[231,1074,1075,1078,1082,1084,1086,1088,1091,1093],{"class":233,"line":256},[231,1076,1077],{"class":647},"        \"",[231,1079,1081],{"class":1080},"sbssI","id",[231,1083,659],{"class":647},[231,1085,662],{"class":647},[231,1087,665],{"class":647},[231,1089,1090],{"class":668},"018f2c3a-3270-7df0-8a94-74293079c4d1",[231,1092,659],{"class":647},[231,1094,673],{"class":647},[231,1096,1097,1099,1102,1104,1106,1108,1111,1113],{"class":233,"line":262},[231,1098,1077],{"class":647},[231,1100,1101],{"class":1080},"mood",[231,1103,659],{"class":647},[231,1105,662],{"class":647},[231,1107,665],{"class":647},[231,1109,1110],{"class":668},"content",[231,1112,659],{"class":647},[231,1114,673],{"class":647},[231,1116,1117,1119,1121,1123,1125],{"class":233,"line":268},[231,1118,1077],{"class":647},[231,1120,1029],{"class":1080},[231,1122,659],{"class":647},[231,1124,662],{"class":647},[231,1126,1127],{"class":647}," null,\n",[231,1129,1130,1132,1135,1137,1139,1141,1144,1146],{"class":233,"line":274},[231,1131,1077],{"class":647},[231,1133,1134],{"class":1080},"started_at",[231,1136,659],{"class":647},[231,1138,662],{"class":647},[231,1140,665],{"class":647},[231,1142,1143],{"class":668},"2026-09-01T14:02:00Z",[231,1145,659],{"class":647},[231,1147,673],{"class":647},[231,1149,1150,1152,1154,1156,1158],{"class":233,"line":279},[231,1151,1077],{"class":647},[231,1153,1033],{"class":1080},[231,1155,659],{"class":647},[231,1157,662],{"class":647},[231,1159,1127],{"class":647},[231,1161,1162,1164,1167,1169,1171,1173,1175],{"class":233,"line":285},[231,1163,1077],{"class":647},[231,1165,1166],{"class":1080},"created_at",[231,1168,659],{"class":647},[231,1170,662],{"class":647},[231,1172,665],{"class":647},[231,1174,1143],{"class":668},[231,1176,786],{"class":647},[231,1178,1179],{"class":233,"line":291},[231,1180,1181],{"class":647},"      }\n",[231,1183,1184],{"class":233,"line":297},[231,1185,862],{"class":647},[231,1187,1188],{"class":233,"line":302},[231,1189,1190],{"class":647},"  }\n",[231,1192,1193],{"class":233,"line":308},[231,1194,897],{"class":647},[202,1196,1197,1198,1201],{},"Importers that do not understand these keys can ignore them, but will lose the associated mood history or\napp-specific detail. For example, ",[228,1199,1200],{},"extensions.kind"," distinguishes a journal entry from a member note.",[197,1203,1205],{"id":1204},"how-to-get-an-export","How to get an export",[1207,1208,1210],"h3",{"id":1209},"system-export","System Export",[1212,1213,1214,1224,1231],"ol",{},[950,1215,1216,1217,1220,1221,602],{},"Open ",[624,1218,1219],{},"System Settings",", then ",[624,1222,1223],{},"Data Export",[950,1225,1226,1227,1230],{},"Pick ",[624,1228,1229],{},"OpenPlural"," and request the export.",[950,1232,1233],{},"Exports are queued, and you will receive a notification when the ZIP is ready for download.",[1207,1235,1237],{"id":1236},"account-export","Account Export",[1212,1239,1240,1247,1250],{},[950,1241,1216,1242,1220,1245,602],{},[624,1243,1244],{},"Account Settings",[624,1246,1223],{},[950,1248,1249],{},"Request the export. The account page uses OpenPlural automatically and does not have a format picker.",[950,1251,1233],{},[197,1253,1255],{"id":1254},"architecture","Architecture",[947,1257,1258,1261,1264],{},[950,1259,1260],{},"Structured data lives in Postgres. Media lives in Cloudflare R2. Bundled media is streamed from object storage into\na temporary directory, then added to the ZIP. Large record collections are written incrementally, so the full export\ndoes not need to fit in app memory, but temporary disk space is still required for the staged files and archive.",[950,1262,1263],{},"Exports are generated on a queue worker instead of in the request cycle. A system with hundreds of thousands of\nrecords can take minutes.",[950,1265,1266],{},"Media checksums use SHA-256 and are computed from the staged files during export. Bundling reads the media files\nand does not rely on checksums saved at upload time.",[197,1268,1270],{"id":1269},"privacy-handling","Privacy handling",[202,1272,1273],{},"Data is encrypted in transit. Journal content, note content, and other sensitive data is encrypted by the application\nbefore storage, but the export contains their decrypted content in a plaintext ZIP. Treat it as sensitive. Any encryption\nprovided by the hosting or storage layer is separate.",[202,1275,1276,1277,1280],{},"Privacy flags on systems, members, and custom fields are exported as ",[228,1278,1279],{},"Privacy"," objects. Notes also carry their\nvisibility, but this does not preserve the complete visibility model. Partner-only note visibility becomes trusted,\nand PluralSpace's importer does not restore system visibility or member profile and field visibility overrides.",[202,1282,1283],{},"An upcoming update (TBD when) will introduce privacy buckets, mimicking what was available through SimplyPlural. This\nwill allow for more granular privacy control and better preservation of visibility settings during import\u002Fexport operations.",[1285,1286,1287],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":13,"searchDepth":14,"depth":14,"links":1289},[1290,1291,1292,1293,1294,1295,1296,1300,1301],{"id":199,"depth":14,"text":200},{"id":210,"depth":14,"text":211},{"id":568,"depth":14,"text":569},{"id":900,"depth":14,"text":901},{"id":944,"depth":14,"text":945},{"id":996,"depth":14,"text":997},{"id":1204,"depth":14,"text":1205,"children":1297},[1298,1299],{"id":1209,"depth":244,"text":1210},{"id":1236,"depth":244,"text":1237},{"id":1254,"depth":14,"text":1255},{"id":1269,"depth":14,"text":1270},"Web app targeting PluralPort v0.1 with legacy OpenPlural import and export, bundled media, relationships, boards, polls, and PluralSpace-specific mood preservation.","Per-system ZIP containing manifest.json, openplural.json, and media\u002F. Whole-account exports contain account data plus one OpenPlural document per owned system.","2026-09-06","Proprietary",[1307],{"label":1308,"href":1309},"Implementation profile","https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fpluralspace.md","https:\u002F\u002Fpluralspace.app\u002Ficons\u002Fpluralspace_icon.svg",[1312,1314,1317,1320,1323,1326,1329,1332,1335,1338,1341,1343],{"source":51,"target":1313},"Member records with proxy tags, privacy, profile visibility, pinned state, and template state",{"source":1315,"target":1316},"fronts and system front types","FrontPeriod with one member assignment per interval; front types become status TaxonomyTerms and TaxonomyAssignments",{"source":1318,"target":1319},"member roles","Role TaxonomyTerms and TaxonomyAssignments",{"source":1321,"target":1322},"member groups and memberships","Group with parent_group_id plus GroupMembership records",{"source":1324,"target":1325},"custom fields and custom field values","CustomFieldDefinition and CustomFieldValue records",{"source":1327,"target":1328},"journal entries and notes","Note records distinguished by extensions.kind as journal or note",{"source":1330,"target":1331},"chat channels and messages","Conversation and ChatMessage records with member author IDs",{"source":1333,"target":1334},"relationship types and member relationships","Provisional relationships module with RelationshipType and MemberRelationship records",{"source":1336,"target":1337},"polls, options, and votes","Provisional polls module using PluralSpace's current field interpretation",{"source":1339,"target":1340},"thought of the day entries","System-wide BoardPost records with extensions.kind set to thought_of_the_day",{"source":1342,"target":987},"system and member mood entries",{"source":1344,"target":1345},"member and system media","Asset records with bundled files, source references, and checksums",{},[1348,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382],{"key":49,"support":161,"note":1349},"System records export; imports fill selected settings in an existing system without restoring its identity, visibility, or public profile.",{"key":51,"support":161,"note":1351},"Exports proxy tags, privacy, profile visibility, pinned and template state; imports keep one proxy-tag pair and do not restore profile visibility or field visibility overrides.",{"key":54,"support":161,"note":1353},"One assignment per exported interval; overlapping periods represent co-fronting. Separate front events and front comments are not imported.",{"key":57,"support":52,"note":1355},"Nested groups preserve parent_group_id; memberships exported separately.",{"key":60,"support":52,"note":1357},"Carries front types and member roles.",{"key":62,"support":161,"note":1359},"Definitions and populated values, including privacy and multi-value metadata; text, textarea, and link types all export as text.",{"key":65,"support":161,"note":1361},"Journals and notes share notes[], distinguished by extensions.kind; partner-only visibility becomes trusted.",{"key":68,"support":161,"note":1363},"Member and system avatars and banners, plus system library files, bundle with SHA-256 checksums and source references. Media import requires the ZIP.",{"key":71,"support":161,"note":1365},"Exported for systems, members, and custom fields; notes carry visibility. Imports do not restore system visibility or member profile visibility overrides, and some note tiers are combined.",{"key":73,"support":161,"note":1367},"Channels and messages export; attachments and reactions do not.",{"key":76,"support":161,"note":1369},"Thought of the day becomes system-wide BoardPost records; imports keep body, author, pinned state, and creation time, but not target member, title, or audience.",{"key":78,"support":161,"note":1371},"Provisional module; shape may change before v0.1 is final.",{"key":80,"support":161,"note":1373},"Provisional module; uses PluralSpace's current field interpretation.",{"key":82,"support":173,"note":1375},"PluralSpace has reminder is early testing, but they are not mapped for import or export.",{"key":84,"support":173,"note":1377},"No equivalent concept in PluralSpace.",{"key":86,"support":173,"note":1379},"The standalone proxy module is not mapped; member proxy tags are carried on Member records.",{"key":88,"support":173,"note":1381},"Sharing is handled differently in PluralSpace, no exact path to export yet.",{"key":90,"support":173,"note":1377},"\u002Fapps\u002Fpluralspace","Web (hosted)",{"description":1302},"apps\u002Fpluralspace","Hosted web app targeting PluralPort v0.1, currently using OpenPlural filenames and version markers. Covers systems, members, front intervals, groups, taxonomy, custom fields, notes, chat, boards, assets, and privacy, plus the provisional relationships and polls modules, with some loss on import. Mood history is preserved under extensions[\"pluralspace:moods\"].","https:\u002F\u002Fpluralspace.app","gxqG9Y6bh4347Ll4HFbH5QFUZw8y6d9pQp8nVV39a44",{"id":1391,"title":1392,"app_id":1393,"apple_store":22,"body":1394,"description":1453,"export":17,"export_shape":1454,"extension":19,"google_play":1455,"import":17,"last_verified":1456,"license":1457,"links":1458,"logo":22,"mapping":1465,"meta":1486,"modules":1487,"name":1392,"navigation":17,"order":244,"path":1518,"platform":1519,"repo":1520,"self_reported":21,"seo":1521,"spec_version":185,"status":97,"stem":1522,"summary":1523,"website":1524,"__hash__":1525},"apps\u002Fapps\u002Foceans-symphony.md","Oceans Symphony","oceans-symphony",{"type":10,"value":1395,"toc":1446},[1396,1400,1403,1405,1426,1428,1434,1436,1439,1443],[197,1397,1399],{"id":1398},"what-oceans-symphony-is","What Oceans Symphony is",[202,1401,1402],{},"A local-first companion app for dissociative and plural systems. Data lives in\nthe browser (or the Android wrapper) and never has to touch a server. It also\nimports Simply Plural, Octocon, and Plural Star data.",[197,1404,569],{"id":568},[202,1406,1407,1408,673,1410,1412,1413,1415,1416,1419,1420,1422,1423,602],{},"One ZIP per system, named after the system, containing ",[228,1409,594],{},[228,1411,586],{},", and a ",[228,1414,612],{}," folder with every image the document refers\nto. The document declares ",[228,1417,1418],{},"openplural_version: \"0.1\""," and a ",[228,1421,700],{}," block\nwith ",[228,1424,1425],{},"app_id: oceans-symphony",[197,1427,901],{"id":900},[202,1429,1430,1431,1433],{},"The importer accepts either a raw ",[228,1432,586],{}," or a ZIP that contains one,\nand was written against PluralSpace exports. Every imported record keeps its\nsource id so re-importing the same file deduplicates instead of duplicating.\nA full local backup is taken before a replace-everything import.",[197,1435,945],{"id":944},[202,1437,1438],{},"Front events and comments, boards, polls, reminders, habits, proxy tags, and\nsharing are not represented. Asset entries carry no hash or size.",[197,1440,1442],{"id":1441},"naming","Naming",[202,1444,1445],{},"Support landed in June 2026, before OpenPlural was renamed to PluralPort, so\nthe app's UI, filenames, and code all still say OpenPlural. The data inside is\nthe same v0.1 format. This page was written from the app's source rather than\nreported by its maintainer.",{"title":13,"searchDepth":14,"depth":14,"links":1447},[1448,1449,1450,1451,1452],{"id":1398,"depth":14,"text":1399},{"id":568,"depth":14,"text":569},{"id":900,"depth":14,"text":901},{"id":944,"depth":14,"text":945},{"id":1441,"depth":14,"text":1442},"Local-first companion app with a shipped OpenPlural v0.1 importer and exporter that bundles images into a ZIP.","Per-system ZIP with manifest.json, openplural.json, and media\u002F","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=app.oceans_symphony.twa","2026-09-09","MIT",[1459,1462],{"label":1460,"href":1461},"Exporter source","https:\u002F\u002Fgithub.com\u002Fpenumbrias\u002Foceans-symphony\u002Fblob\u002Fmain\u002Fsrc\u002Flib\u002FopenPluralExport.js",{"label":1463,"href":1464},"Importer source","https:\u002F\u002Fgithub.com\u002Fpenumbrias\u002Foceans-symphony\u002Fblob\u002Fmain\u002Fsrc\u002Flib\u002FopenPlural.js",[1466,1468,1471,1473,1475,1478,1480,1483],{"source":1467,"target":30},"alters[]",{"source":1469,"target":1470},"front sessions","FrontPeriod + FrontAssignment",{"source":1472,"target":36},"groups + alter group lists",{"source":1474,"target":133},"tags",{"source":1476,"target":1477},"journal entries + alter notes","Note, with the note kind in extensions",{"source":78,"target":1479},"RelationshipType + member edges",{"source":1481,"target":1482},"system chat channels + messages","Conversation + ChatMessage + categories",{"source":1484,"target":1485},"alter and system images","Asset with uri under media\u002F",{},[1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1513,1514,1515,1516,1517],{"key":49,"support":52,"note":1489},"System profile from app settings.",{"key":51,"support":52,"note":1491},"Alters map to members, including alias, age, birthday, and pronouns.",{"key":54,"support":161,"note":1493},"Front periods with assignments only; no front events or front comments.",{"key":57,"support":52,"note":1495},"Groups plus group memberships.",{"key":60,"support":52,"note":1497},"Terms and assignments.",{"key":62,"support":52,"note":1499},"Definitions and values.",{"key":65,"support":52,"note":1501},"Journal entries and per-member notes; the kind is carried in extensions.",{"key":68,"support":161,"note":1503},"Referenced images are bundled under media\u002F; no hashes or sizes are written.",{"key":71,"support":22,"note":1505},"Not verified from source.",{"key":73,"support":52,"note":1507},"Conversations, messages, and categories; no attachments or reactions.",{"key":76,"support":173,"note":1509},"Emitted empty.",{"key":78,"support":52,"note":1511},"Relationship types and member edges.",{"key":80,"support":173,"note":1509},{"key":82,"support":173,"note":22},{"key":84,"support":173,"note":22},{"key":86,"support":173,"note":22},{"key":88,"support":173,"note":22},{"key":90,"support":173,"note":22},"\u002Fapps\u002Foceans-symphony","Web (PWA), Android","https:\u002F\u002Fgithub.com\u002Fpenumbrias\u002Foceans-symphony",{"description":1453},"apps\u002Foceans-symphony","Local-first React PWA (also on Android) for dissociative and plural systems. It ships a full OpenPlural v0.1 export and import: one ZIP per system with openplural.json, a manifest, and bundled media. Covers members, fronting, groups, taxonomy, custom fields, notes, chat, and relationships. It still uses the OpenPlural name and filenames from before the rename.","https:\u002F\u002Foceans-symphony.app\u002F","b-VOlImQWfw3slJtUSv0TM1BHoTG_bROtb5OpeRh8pw",{"id":1527,"title":1528,"app_id":1529,"apple_store":22,"body":1530,"description":1534,"export":17,"export_shape":1535,"extension":19,"google_play":1536,"import":21,"last_verified":1456,"license":1537,"links":1538,"logo":1551,"mapping":1552,"meta":1567,"modules":1568,"name":1528,"navigation":17,"order":250,"path":1593,"platform":1594,"repo":1595,"self_reported":17,"seo":1596,"spec_version":22,"status":1597,"stem":1598,"summary":1599,"website":1600,"__hash__":1601},"apps\u002Fapps\u002Fampersand.md","Ampersand","ampersand",{"type":10,"value":1531,"toc":1532},[],{"title":13,"searchDepth":14,"depth":14,"links":1533},[],"Offline-first Tauri\u002FVue app with a self-backup archive and a generic JSON export in its own schema.",".ampar self-backup archive, or a single JSON document in Ampersand's own schema","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=moe.ampersand.track","AGPL-3.0-only",[1539,1542,1545,1548],{"label":1540,"href":1541},"Research doc","https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fampersand.md",{"label":1543,"href":1544},"GitHub mirror","https:\u002F\u002Fgithub.com\u002FNyaomiDEV\u002FAmpersand",{"label":1546,"href":1547},"Export docs","https:\u002F\u002Fcodeberg.org\u002FAmpersand\u002Fapp\u002Fwiki\u002FImport-Export",{"label":1549,"href":1550},"Convert an export to PluralPort","https:\u002F\u002Fpluralport.github.io\u002Fpluralport-converter\u002F","\u002Fimages\u002Flogos\u002Fampersand.png",[1553,1556,1559,1562,1564],{"source":1554,"target":1555},"nested systems","System records with parent_system_id",{"source":1557,"target":1558},"per-member fronting intervals","FrontPeriod + assignment metadata",{"source":1560,"target":1561},"typed tags","Group + TaxonomyTerm patterns",{"source":1563,"target":39},"custom field values",{"source":1565,"target":1566},"board messages with polls","BoardPost and extensions",{},[1569,1570,1571,1573,1575,1576,1578,1580,1582,1583,1585,1586,1587,1588,1589,1590,1591,1592],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1572},"Per-member intervals with main\u002Finfluencing\u002Fcustom-status\u002Fpresence",{"key":57,"support":22,"note":1574},"Typed tags + nested systems",{"key":60,"support":22,"note":1574},{"key":62,"support":22,"note":1577},"Definitions, string values on members",{"key":65,"support":22,"note":1579},"Journal posts",{"key":68,"support":22,"note":1581},"Imports SP \u002F Octocon \u002F PluralKit \u002F Tupperbox",{"key":71,"support":22,"note":1581},{"key":73,"support":22,"note":1584},"Board messages with polls",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Fampersand","Android, iOS (sideload), Desktop","https:\u002F\u002Fcodeberg.org\u002FAmpersand\u002Fapp",{"description":1534},"research","apps\u002Fampersand","Offline-first Tauri\u002FVue app. Its main backup is a self-contained .ampar archive, and since 0.2.0 it also writes a generic JSON export in its own schema that other tools can read. Its interop surface is import-first: it reads Simply Plural, Octocon, PluralKit, and Tupperbox exports.","https:\u002F\u002Fampersand.moe","uEBVkSp_K5BxgNIMD6PfBV0HQlZQ5kYs2Mw2T-SBDAk",{"id":1603,"title":1604,"app_id":1605,"apple_store":22,"body":1606,"description":1610,"export":17,"export_shape":1611,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1612,"links":1613,"logo":22,"mapping":1616,"meta":1629,"modules":1630,"name":1604,"navigation":17,"order":256,"path":1655,"platform":1656,"repo":1657,"self_reported":17,"seo":1658,"spec_version":22,"status":1597,"stem":1659,"summary":1660,"website":1661,"__hash__":1662},"apps\u002Fapps\u002Flighthouse.md","Lighthouse","lighthouse",{"type":10,"value":1607,"toc":1608},[],{"title":13,"searchDepth":14,"depth":14,"links":1609},[],"Server-backed app exporting a ZIP of CSV files plus a narrow token API.","ZIP of CSVs + narrow token API","Unspecified (no LICENSE file)",[1614],{"label":1540,"href":1615},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Flighthouse.md",[1617,1620,1623,1626],{"source":1618,"target":1619},"Subsystems as separate systems","System with parent_system_id",{"source":1621,"target":1622},"Fixed alter fields","CustomFieldDefinition or taxonomy mapping",{"source":1624,"target":1625},"relationships column on alters","MemberRelationship + RelationshipType via heuristic parse",{"source":1627,"target":1628},"forums + threads + journals","Conversation + Note",{},[1631,1632,1633,1635,1637,1638,1640,1642,1644,1645,1647,1648,1649,1650,1651,1652,1653,1654],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1634},"Stubbed in inspected source",{"key":57,"support":22,"note":1636},"Subsystems as systems",{"key":60,"support":22,"note":1636},{"key":62,"support":22,"note":1639},"Fixed rich alter fields",{"key":65,"support":22,"note":1641},"Journals, communal journals, BDA plans, inner worlds, rules, wishlist",{"key":68,"support":22,"note":1643},"Image URLs\u002Fblobs, token permissions",{"key":71,"support":22,"note":1643},{"key":73,"support":22,"note":1646},"Forum\u002Fthread posts",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Flighthouse","Web (hosted, self-hostable)","https:\u002F\u002Fgithub.com\u002Fteam-crystalline\u002FLighthouse",{"description":1610},"apps\u002Flighthouse","Server-backed Node\u002FExpress + PostgreSQL app. Exports a ZIP of CSV files and has a narrow token API. Most of its richer data lands in extensions until a converter is built. Sign-ups on the hosted instance closed in September 2026 while an offline desktop version is being built.","https:\u002F\u002Fwww.writelighthouse.com","dXTa5qBQhH4hNchD7_F5jsMv1iMWY3fWduA1lV9bOp0",{"id":1664,"title":1665,"app_id":1666,"apple_store":22,"body":1667,"description":1671,"export":17,"export_shape":1672,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1457,"links":1673,"logo":22,"mapping":1683,"meta":1696,"modules":1697,"name":1665,"navigation":17,"order":262,"path":1722,"platform":1723,"repo":1724,"self_reported":17,"seo":1725,"spec_version":22,"status":1726,"stem":1727,"summary":1728,"website":1729,"__hash__":1730},"apps\u002Fapps\u002Foctocon.md","Octocon","octocon",{"type":10,"value":1668,"toc":1669},[],{"title":13,"searchDepth":14,"depth":14,"links":1670},[],"Elixir\u002FPhoenix app with Discord export formats and a full JSON export option. Shutdown announced March 2026; sign-ups are closed.","Discord slash export: PK datafile v2 or Octocon 'full' JSON",[1674,1676,1679,1682],{"label":1540,"href":1675},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Foctocon.md",{"label":1677,"href":1678},"App repo","https:\u002F\u002Fgithub.com\u002FOctoconDev\u002Fapp",{"label":1680,"href":1681},"Public docs","https:\u002F\u002Foctocon.app\u002Fdocs",{"label":1549,"href":1550},[1684,1687,1689,1691,1693],{"source":1685,"target":1686},"Alters.Alter with flags","Member; preserve flags in extensions",{"source":1688,"target":1470},"Fronts.Front rows",{"source":1690,"target":36},"Tags.Tag with parent_tag_id",{"source":1692,"target":39},"Accounts.Field + Alters.Field values",{"source":1694,"target":1695},"discord_proxies + security_level","ProxyTag + Privacy fragment",{},[1698,1699,1700,1702,1704,1705,1707,1709,1711,1712,1714,1715,1716,1717,1718,1719,1720,1721],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1701},"Per-alter intervals with short comments",{"key":57,"support":22,"note":1703},"Hierarchical tags used as groups",{"key":60,"support":22,"note":1703},{"key":62,"support":22,"note":1706},"Definitions on user, values on alters",{"key":65,"support":22,"note":1708},"System + per-alter journals present in schema, not always in export",{"key":68,"support":22,"note":1710},"Avatar URLs; four-level security + friendships",{"key":71,"support":22,"note":1710},{"key":73,"support":22,"note":1713},"Discord proxy fields on alter",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Foctocon","iOS\u002FAndroid + Discord bot","https:\u002F\u002Fgithub.com\u002FOctoconDev\u002Foctocon",{"description":1671},"inactive","apps\u002Foctocon","Elixir\u002FPhoenix\u002FScyllaDB monolith plus Discord bot. Its shutdown was announced in March 2026 and sign-ups are closed, though parts of the service were still reachable in September 2026. It has a full JSON export option, plus Discord-based migration formats that still matter for users who exported before leaving.","https:\u002F\u002Foctocon.app","efroVjsD5VRIRqZjtE1JjHuvx9dxrZckEdFnWxinDGs",{"id":1732,"title":1733,"app_id":1734,"apple_store":22,"body":1735,"description":1739,"export":21,"export_shape":1740,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1741,"links":1742,"logo":22,"mapping":1745,"meta":1752,"modules":1753,"name":1774,"navigation":17,"order":268,"path":1775,"platform":1656,"repo":1776,"self_reported":17,"seo":1777,"spec_version":22,"status":1597,"stem":1778,"summary":1779,"website":1780,"__hash__":1781},"apps\u002Fapps\u002Fopenselves.md","Openselves","openselves",{"type":10,"value":1736,"toc":1737},[],{"title":13,"searchDepth":14,"depth":14,"links":1738},[],"Smaller offline-first app with browser storage and a sync schema, but no general export file found.","Sync log DTOs; no export found","AGPL-3.0",[1743],{"label":1540,"href":1744},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fopenselves.md",[1746,1749],{"source":1747,"target":1748},"per-member front intervals","FrontPeriod",{"source":1750,"target":1751},"no groups\u002Fcustom fields\u002Fnotes\u002Fchat","No portable representation yet",{},[1754,1755,1756,1758,1759,1760,1761,1762,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1757},"Per-member intervals",{"key":57,"support":173,"note":22},{"key":60,"support":173,"note":22},{"key":62,"support":173,"note":22},{"key":65,"support":173,"note":22},{"key":68,"support":22,"note":1763},"Member image, account auth",{"key":71,"support":22,"note":1763},{"key":73,"support":173,"note":22},{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"OpenSelves","\u002Fapps\u002Fopenselves","https:\u002F\u002Fcodeberg.org\u002FFreckleQueens\u002FOpenSelves",{"description":1739},"apps\u002Fopenselves","Smaller offline-first app with browser IndexedDB + a Drizzle\u002FPostgreSQL sync schema. No general export file was found in source, so the portable shape is inferred from DTOs and schema.","https:\u002F\u002Fopenselves.org","jBOUMeL9xC03CMUBcm1XlMKIdgUEFizYh6tWoWLnG8c",{"id":1783,"title":1784,"app_id":1785,"apple_store":22,"body":1786,"description":1790,"export":17,"export_shape":1791,"extension":19,"google_play":22,"import":21,"last_verified":22,"license":1741,"links":1792,"logo":22,"mapping":1799,"meta":1812,"modules":1813,"name":1836,"navigation":17,"order":274,"path":1837,"platform":1838,"repo":1839,"self_reported":17,"seo":1840,"spec_version":22,"status":1597,"stem":1841,"summary":1842,"website":1843,"__hash__":1844},"apps\u002Fapps\u002Fpluralkit.md","Pluralkit","pluralkit",{"type":10,"value":1787,"toc":1788},[],{"title":13,"searchDepth":14,"depth":14,"links":1789},[],"Discord bot with a public API and JSON datafile export based on switch events.","API + datafile v2 JSON",[1793,1795,1798],{"label":1540,"href":1794},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fpluralkit.md",{"label":1796,"href":1797},"API docs","https:\u002F\u002Fpluralkit.me\u002Fapi\u002F",{"label":1549,"href":1550},[1800,1803,1806,1809],{"source":1801,"target":1802},"switches[] with members array","FrontEvent + assignment records",{"source":1804,"target":1805},"members[] with proxy_tags","Member + ProxyTag",{"source":1807,"target":1808},"flat groups[]","Group with null parent_group_id",{"source":1810,"target":1811},"per-record privacy","Privacy fragment with PluralKit raw detail",{},[1814,1815,1816,1818,1820,1821,1822,1823,1825,1826,1828,1829,1830,1831,1832,1833,1834,1835],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1817},"Switch events",{"key":57,"support":22,"note":1819},"Flat groups",{"key":60,"support":22,"note":1819},{"key":62,"support":173,"note":22},{"key":65,"support":173,"note":22},{"key":68,"support":22,"note":1824},"Avatar\u002Fbanner URLs, rich privacy",{"key":71,"support":22,"note":1824},{"key":73,"support":22,"note":1827},"Discord proxy records (out of core export)",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"PluralKit","\u002Fapps\u002Fpluralkit","Discord bot","https:\u002F\u002Fgithub.com\u002FPluralKit\u002FPluralKit",{"description":1790},"apps\u002Fpluralkit","Discord bot with a public API and a JSON datafile produced by DataFileService.ExportSystem. It models fronting as switch events rather than intervals.","https:\u002F\u002Fpluralkit.me","PBtTYqpNdovOQiJXYsGblD92qSQPuLmGs4uCcH18wZM",{"id":1846,"title":1847,"app_id":1848,"apple_store":1849,"body":1850,"description":1854,"export":17,"export_shape":1855,"extension":19,"google_play":1856,"import":17,"last_verified":1456,"license":1741,"links":1857,"logo":22,"mapping":1863,"meta":1873,"modules":1874,"name":1847,"navigation":17,"order":279,"path":1897,"platform":1898,"repo":1899,"self_reported":17,"seo":1900,"spec_version":22,"status":1597,"stem":1901,"summary":1902,"website":1903,"__hash__":1904},"apps\u002Fapps\u002Fplural-star.md","Plural Star","plural_star","https:\u002F\u002Fapps.apple.com\u002Fapp\u002Fid6763964266",{"type":10,"value":1851,"toc":1852},[],{"title":13,"searchDepth":14,"depth":14,"links":1853},[],"React Native app with local backup JSON and tiered fronting semantics.","Local backup JSON v1.2","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.pluralspace.app",[1858,1860],{"label":1540,"href":1859},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fplural-star.md",{"label":1861,"href":1862},"Desktop edition","https:\u002F\u002Fgithub.com\u002FByHanyou\u002FPlural-Star-Desktop",[1864,1867,1870],{"source":1865,"target":1866},"Tiered front periods","FrontPeriod with explicit front_role + source_kind: \"tiered\"",{"source":1868,"target":1869},"chatChannels + ps:chat:\u003Cid> messages","Conversation + ChatMessage",{"source":1871,"target":1872},"noteboards","BoardPost with target_member_id + pinned",{},[1875,1876,1877,1879,1880,1881,1882,1884,1886,1887,1889,1890,1891,1892,1893,1894,1895,1896],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1878},"Tiered primary \u002F co-front \u002F co-conscious",{"key":57,"support":22,"note":1819},{"key":60,"support":22,"note":1819},{"key":62,"support":22,"note":63},{"key":65,"support":22,"note":1883},"Journal",{"key":68,"support":22,"note":1885},"Avatar\u002Fbanner dictionaries",{"key":71,"support":22,"note":1885},{"key":73,"support":22,"note":1888},"Channels\u002Fmessages + noteboards",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Fplural-star","Android\u002FiOS + Desktop (Electron)","https:\u002F\u002Fgithub.com\u002FByHanyou\u002FPlural-Star",{"description":1854},"apps\u002Fplural-star","React Native app with AsyncStorage + filesystem backups. It has tiered fronting, flat groups, definitions + values for custom fields, channels + messages, and noteboards. Since v1.15.0 its PluralSpace importer also reads OpenPlural v0.1 bundles (openplural.json), though there is no export in that format yet.","https:\u002F\u002Fbyhanyou.github.io\u002FPlural-Star\u002F","yR-_YUt3JN6yJbaMsjZPEnhMnU56hcPN-05aoId_LpU",{"id":1906,"title":1907,"app_id":1908,"apple_store":22,"body":1909,"description":1913,"export":17,"export_shape":1914,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1915,"links":1916,"logo":22,"mapping":1922,"meta":1938,"modules":1939,"name":1907,"navigation":17,"order":285,"path":1961,"platform":1962,"repo":1963,"self_reported":17,"seo":1964,"spec_version":22,"status":1726,"stem":1965,"summary":1966,"website":1967,"__hash__":1968},"apps\u002Fapps\u002Fsimply-plural.md","Simply Plural","simply_plural",{"type":10,"value":1910,"toc":1911},[],{"title":13,"searchDepth":14,"depth":14,"links":1912},[],"Former public token API plus Mongo collection export used by migration tooling. Shut down 2026-07-01.","Mongo collection export + token API (previously downloaded exports only)","Closed source (API server source published)",[1917,1919],{"label":1540,"href":1918},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Fsimply-plural.md",{"label":1920,"href":1921},"Discontinuation notice","https:\u002F\u002Fapparyllis.com\u002Fsimply-plural-will-be-discontinued\u002F",[1923,1925,1927,1930,1933,1935],{"source":1924,"target":1748},"Per-member\u002Fstatus intervals",{"source":58,"target":1926},"Group with parent_group_id",{"source":1928,"target":1929},"Custom fronts","Member with is_custom_front: true",{"source":1931,"target":1932},"Privacy buckets","Privacy fragment",{"source":1934,"target":1869},"Channels + chat messages",{"source":1936,"target":1937},"boardMessages","BoardPost",{},[1940,1941,1942,1943,1944,1945,1947,1948,1950,1951,1953,1954,1955,1956,1957,1958,1959,1960],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":22,"note":1924},{"key":57,"support":22,"note":58},{"key":60,"support":22,"note":58},{"key":62,"support":22,"note":1946},"Definitions, values on members",{"key":65,"support":22,"note":66},{"key":68,"support":22,"note":1949},"Avatar URLs, privacy buckets, friends",{"key":71,"support":22,"note":1949},{"key":73,"support":22,"note":1952},"Chat + board messages",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Fsimply-plural","iOS\u002FAndroid + Web (shut down)","https:\u002F\u002Fgithub.com\u002FApparyllisOrg\u002FSimplyPluralApi",{"description":1913},"apps\u002Fsimply-plural","Public token API + raw Mongo export. The service shut down on 2026-07-01, so no new exports can be made, but it still matters because many migration paths flow through exports users downloaded before then.","https:\u002F\u002Fapparyllis.com","frV5ZCxQryOGFV4qholMldII9DrkvY-xHxpo1BA1mHE",{"id":1970,"title":1971,"app_id":1972,"apple_store":22,"body":1973,"description":1977,"export":17,"export_shape":1978,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1979,"links":1980,"logo":22,"mapping":1986,"meta":1994,"modules":1995,"name":1971,"navigation":17,"order":291,"path":2017,"platform":1838,"repo":22,"self_reported":17,"seo":2018,"spec_version":22,"status":1597,"stem":2019,"summary":2020,"website":2021,"__hash__":2022},"apps\u002Fapps\u002Ftupperbox.md","Tupperbox","tupperbox",{"type":10,"value":1974,"toc":1975},[],{"title":13,"searchDepth":14,"depth":14,"links":1976},[],"Discord bot export that is useful as a migration source, not a long-term portable format.","tul!export JSON (Discord bot, closed source)","Closed source",[1981,1983],{"label":1540,"href":1982},"https:\u002F\u002Fgithub.com\u002Fpluralport\u002Fspec\u002Fblob\u002Fmain\u002Fdocs\u002Fapps\u002Ftupperbox.md",{"label":1984,"href":1985},"Command guide","https:\u002F\u002Ftupperbox.app\u002Fguide",[1987,1990,1992],{"source":1988,"target":1989},"Discord proxy bot export","Member + Group records; preserve proxy info in extensions",{"source":1991,"target":1808},"flat groups",{"source":1993,"target":1751},"no fronting or notes model",{},[1996,1997,1998,1999,2001,2002,2003,2004,2006,2007,2009,2010,2011,2012,2013,2014,2015,2016],{"key":49,"support":22,"note":22},{"key":51,"support":52,"note":22},{"key":54,"support":173,"note":22},{"key":57,"support":22,"note":2000},"Flat groups, one-per-member",{"key":60,"support":22,"note":2000},{"key":62,"support":173,"note":22},{"key":65,"support":173,"note":22},{"key":68,"support":22,"note":2005},"Avatar URL (CDN) + banner; no privacy model",{"key":71,"support":22,"note":2005},{"key":73,"support":22,"note":2008},"Discord proxy bot only",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Ftupperbox",{"description":1977},"apps\u002Ftupperbox","Discord bot export that is useful as a migration source, not a long-term portable format. It preserves the member and group model but not a general-purpose import\u002Fexport contract.","https:\u002F\u002Ftupperbox.app","CL45YRliTqJrRO9O7aPzdaxFxOg_RgdnIUEfPdPX5KE",{"id":2024,"title":2025,"app_id":2026,"apple_store":22,"body":2027,"description":2031,"export":17,"export_shape":2032,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":2033,"links":2034,"logo":22,"mapping":2038,"meta":2039,"modules":2040,"name":2025,"navigation":17,"order":297,"path":2063,"platform":2064,"repo":2065,"self_reported":21,"seo":2066,"spec_version":22,"status":1597,"stem":2067,"summary":2068,"website":22,"__hash__":2069},"apps\u002Fapps\u002Fmasquerade.md","Masquerade","masquerade",{"type":10,"value":2028,"toc":2029},[],{"title":13,"searchDepth":14,"depth":14,"links":2030},[],"Proxy bot for Stoat with a small members-only JSON export, useful as a migration source.","Single JSON document ({\"profiles\":[...]})","Unlicensed (no LICENSE file)",[2035],{"label":2036,"href":2037},"Support server","https:\u002F\u002Fstt.gg\u002FSPMxwwC8",[],{},[2041,2042,2044,2045,2046,2047,2048,2049,2051,2053,2054,2055,2056,2057,2058,2059,2061,2062],{"key":49,"support":173,"note":22},{"key":51,"support":161,"note":2043},"Name, display name, avatar URL, color, and a hidden flag; no pronouns, birthday, or description.",{"key":54,"support":173,"note":22},{"key":57,"support":173,"note":22},{"key":60,"support":173,"note":22},{"key":62,"support":173,"note":22},{"key":65,"support":173,"note":22},{"key":68,"support":161,"note":2050},"Avatar URL only; no uploaded media.",{"key":71,"support":161,"note":2052},"A per-member hidden flag only.",{"key":73,"support":173,"note":22},{"key":76,"support":173,"note":22},{"key":78,"support":173,"note":22},{"key":80,"support":173,"note":22},{"key":82,"support":173,"note":22},{"key":84,"support":173,"note":22},{"key":86,"support":52,"note":2060},"Prefix\u002Fsuffix tag pairs, several per member.",{"key":88,"support":173,"note":22},{"key":90,"support":173,"note":22},"\u002Fapps\u002Fmasquerade","Stoat bot","https:\u002F\u002Fgithub.com\u002FTheBobBobs\u002Fmasquerade-bot",{"description":2031},"apps\u002Fmasquerade","PluralKit-style proxy bot for Stoat. It imports PluralKit and Tupperbox exports and writes its own members-only JSON export (name, display name, avatar, color, proxy tags), which makes it a migration source rather than a general-purpose import\u002Fexport contract.","87wBRIHszE1yp4m68ghF9jFQO8iBEOXnFMLaNCXhZ28",{"id":2071,"title":2072,"app_id":2073,"apple_store":22,"body":2074,"description":2089,"export":17,"export_shape":2090,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":2091,"links":2092,"logo":22,"mapping":2096,"meta":2097,"modules":2098,"name":2072,"navigation":17,"order":302,"path":2127,"platform":2128,"repo":2129,"self_reported":21,"seo":2130,"spec_version":22,"status":2101,"stem":2131,"summary":2132,"website":22,"__hash__":2133},"apps\u002Fapps\u002Fpluris-haven.md","Pluris Haven","pluris_haven",{"type":10,"value":2075,"toc":2086},[2076,2080,2083],[197,2077,2079],{"id":2078},"where-openplural-support-stands","Where OpenPlural support stands",[202,2081,2082],{},"The project's own state document marks OpenPlural import as regressed: the\nimporter disappeared in a history rewrite rather than being removed on purpose,\nand restoring it through the current import architecture is listed among the\nnext completion priorities. Export in the format is not on the roadmap yet.",[202,2084,2085],{},"The app is pre-alpha and not yet in public testing, so this page was written\nfrom its repository rather than reported by its maintainers. The module table\nreflects what the app stores locally and could carry once the importer returns,\nnot anything shipped today.",{"title":13,"searchDepth":14,"depth":14,"links":2087},[2088],{"id":2078,"depth":14,"text":2079},"Pre-alpha offline-first Flutter app whose roadmap lists restoring its OpenPlural importer.","Local export and a password-protected portable recovery archive, both in its own format","Source-available, noncommercial",[2093],{"label":2094,"href":2095},"Project state doc","https:\u002F\u002Fgithub.com\u002FEndofTimeWorks\u002Fpluris-haven\u002Fblob\u002Fmain\u002Fdocs\u002Fproject-state.md",[],{},[2099,2100,2103,2105,2107,2109,2111,2113,2114,2115,2117,2118,2119,2121,2123,2124,2125,2126],{"key":49,"support":22,"note":22},{"key":51,"support":2101,"note":2102},"planned","Members stored locally.",{"key":54,"support":2101,"note":2104},"Fronts stored locally.",{"key":57,"support":2101,"note":2106},"Groups stored locally.",{"key":60,"support":2101,"note":2108},"Tags stored locally.",{"key":62,"support":2101,"note":2110},"Custom fields stored locally.",{"key":65,"support":2101,"note":2112},"Notes and journals stored locally.",{"key":68,"support":22,"note":22},{"key":71,"support":22,"note":22},{"key":73,"support":22,"note":2116},"Messages exist locally; chat surfaces are still being built.",{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":2120},"Polls stored locally.",{"key":82,"support":22,"note":2122},"Reminders stored locally.",{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Fpluris-haven","Android\u002FiOS (pre-alpha)","https:\u002F\u002Fgithub.com\u002FEndofTimeWorks\u002Fpluris-haven",{"description":2089},"apps\u002Fpluris-haven","Offline-first Flutter app for systems and other collectives, with an optional server for accounts, friends, and encrypted backups. It is pre-alpha. An OpenPlural importer existed before a history rewrite and restoring it is on the current priority list, alongside importers for Simply Plural, PluralKit, Tupperbox, PluralSpace, and Ampersand.","xIKTRdKfdal70MlucPRhZIaAhHSrymaK8L4W2ex8KoQ",{"id":2135,"title":2136,"app_id":2137,"apple_store":22,"body":2138,"description":2157,"export":17,"export_shape":2158,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":1979,"links":2159,"logo":22,"mapping":2166,"meta":2167,"modules":2168,"name":2192,"navigation":17,"order":308,"path":2193,"platform":2194,"repo":22,"self_reported":21,"seo":2195,"spec_version":22,"status":1597,"stem":2196,"summary":2197,"website":2198,"__hash__":2199},"apps\u002Fapps\u002Fimplural.md","Implural","implural",{"type":10,"value":2139,"toc":2154},[2140,2144,2151],[197,2141,2143],{"id":2142},"where-things-stand","Where things stand",[202,2145,2146,2147,2150],{},"imPlural's source is not public, so this page is built from its public site\nand its participation in the spec. In July 2026 its developers proposed a\nstandard registry for ",[228,2148,2149],{},"System.settings",", covering language, colour scheme,\nreduced motion, contrast, text scale, and font preferences, so that\naccessibility settings survive a move between apps. That discussion is open on\nthe spec repository.",[202,2152,2153],{},"The app's documentation page says public API and export format documentation\nare planned. Until either lands, the module table above is a sketch of what the\napp visibly stores rather than a mapping.",{"title":13,"searchDepth":14,"depth":14,"links":2155},[2156],{"id":2142,"depth":14,"text":2143},"Hosted system tracker with Simply Plural import whose developers are contributing to the spec.","Not yet documented; the app promises export format documentation",[2160,2163],{"label":2161,"href":2162},"Spec discussion on System.settings","https:\u002F\u002Fgithub.com\u002FPluralPort\u002Fspec\u002Fissues\u002F14",{"label":2164,"href":2165},"Migration guide","https:\u002F\u002Fplural.im\u002Flanding\u002Fhelp\u002Fmigration",[],{},[2169,2170,2172,2174,2176,2177,2179,2180,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191],{"key":49,"support":22,"note":22},{"key":51,"support":22,"note":2171},"Members and custom fronts.",{"key":54,"support":22,"note":2173},"Fronting status with notifications.",{"key":57,"support":22,"note":2175},"Groups come across from Simply Plural imports.",{"key":60,"support":22,"note":22},{"key":62,"support":22,"note":2178},"Per-member info comes across from Simply Plural imports.",{"key":65,"support":22,"note":22},{"key":68,"support":22,"note":2181},"Avatars.",{"key":71,"support":22,"note":22},{"key":73,"support":22,"note":22},{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"imPlural","\u002Fapps\u002Fimplural","Web (hosted, installable)",{"description":2157},"apps\u002Fimplural","Hosted, installable web app focused on a simple system tracker: members, custom fronts, fronting notifications, and profile customisation, with accessibility as a stated priority. It imports Simply Plural exports through an Import\u002FExport settings section, and export format documentation is promised. Its developers have opened spec discussions but no PluralPort support has been announced.","https:\u002F\u002Fplural.im","HZPv_MwDojqiMjjrPIAjoBrin8HnretJHlV2R48tMIg",{"id":2201,"title":2202,"app_id":2203,"apple_store":22,"body":2204,"description":2226,"export":21,"export_shape":2227,"extension":19,"google_play":22,"import":21,"last_verified":2228,"license":2229,"links":2230,"logo":22,"mapping":2236,"meta":2237,"modules":2238,"name":2261,"navigation":17,"order":314,"path":2262,"platform":2263,"repo":2264,"self_reported":17,"seo":2265,"spec_version":22,"status":1597,"stem":2266,"summary":2267,"website":2268,"__hash__":2269},"apps\u002Fapps\u002Fpluralbridge.md","Pluralbridge","pluralbridge",{"type":10,"value":2205,"toc":2223},[2206,2208,2211,2214,2217,2220],[197,2207,2143],{"id":2142},[202,2209,2210],{},"PluralBridge is not a system tracker in the usual sense. It exists to keep\nSimply Plural data usable after that service shut down, first as preservation\nand recovery tooling, and then as a browser app that imports preserved data\nthrough a reviewable, auditable process.",[202,2212,2213],{},"The PluralBridge import design is source-independent: source formats are\nhandled through per-source import paths, with provenance, validation summaries,\nand warnings rather than silent normalization. Simply Plural is the first major\nsource target.",[202,2215,2216],{},"The maintainers intend to support PluralPort\u002FOpenPlural as a versioned\ninterchange source format among several. The intent is conformance against a\nspecific version, not adoption of the interchange format as PluralBridge's\ninternal data model.",[202,2218,2219],{},"Lighthouse-DID Hub has also reported testing against Simply Plural \u002F\nPluralBridge-shaped data, including importer edge cases around front-history\nrecords, multiple open front entries, timestamp assumptions, custom fields,\nempty-but-valid structures, archived members, and group\u002Ffolder mapping.",[202,2221,2222],{},"This page is now maintainer-updated from the project's public repository,\nwebsite, and public issue discussion.",{"title":13,"searchDepth":14,"depth":14,"links":2224},[2225],{"id":2142,"depth":14,"text":2143},"Simply Plural preservation and recovery toolkit, with a browser app in development and a source-independent import framework planned for versioned interchange formats.","No PluralBridge export of its own yet; consumes preserved Simply Plural data and PluralBridge-shaped per-collection exports during development","2026-09-23","GPL-3.0",[2231,2234],{"label":2232,"href":2233},"Stated plan for OpenPlural support","https:\u002F\u002Fgithub.com\u002Fneedsofmany\u002FPluralBridge\u002Fissues\u002F38#issuecomment-5227545557",{"label":2235,"href":2233},"Lighthouse-DID Hub importer feedback",[],{},[2239,2240,2242,2244,2245,2246,2247,2248,2250,2252,2253,2254,2255,2256,2257,2258,2259,2260],{"key":49,"support":22,"note":22},{"key":51,"support":22,"note":2241},"Preserved from Simply Plural exports.",{"key":54,"support":22,"note":2243},"Fronting history preserved from Simply Plural exports.",{"key":57,"support":22,"note":22},{"key":60,"support":22,"note":22},{"key":62,"support":22,"note":2241},{"key":65,"support":22,"note":22},{"key":68,"support":22,"note":2249},"Avatars preserved from Simply Plural exports.",{"key":71,"support":22,"note":2251},"Simply Plural privacy settings preserved; ownership and consent are a stated design focus.",{"key":73,"support":22,"note":22},{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":22},{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"PluralBridge","\u002Fapps\u002Fpluralbridge","Browser app (in development), Python and SQL tooling","https:\u002F\u002Fgithub.com\u002Fneedsofmany\u002FPluralBridge",{"description":2226},"apps\u002Fpluralbridge","An independent preservation and continuity project for systems affected by the Simply Plural shutdown. Today it includes Python and SQL tooling for working with preserved Simply Plural data, with a privacy-focused browser app and source-independent import framework in development. Its maintainers intend to support PluralPort\u002FOpenPlural as one versioned interchange format among several, with provenance, warnings, and conformance testing rather than treating it as the internal data model.","https:\u002F\u002Fthepluralbridge.org","zJg6eiMDvOMXeKxmwdlI2VrVkwon6__8wJG8b-68X2E",{"id":2271,"title":2272,"app_id":2273,"apple_store":22,"body":2274,"description":2295,"export":17,"export_shape":2296,"extension":19,"google_play":22,"import":21,"last_verified":1456,"license":2229,"links":2297,"logo":22,"mapping":2304,"meta":2320,"modules":2321,"name":2272,"navigation":17,"order":319,"path":2348,"platform":2349,"repo":2350,"self_reported":21,"seo":2351,"spec_version":22,"status":1597,"stem":2352,"summary":2353,"website":2354,"__hash__":2355},"apps\u002Fapps\u002Fopen-plural.md","Open Plural","open_plural",{"type":10,"value":2275,"toc":2291},[2276,2280,2283,2285,2288],[197,2277,2279],{"id":2278},"about-the-name","About the name",[202,2281,2282],{},"This spec was called OpenPlural until September 2026. The app on this page was\nalready using that name, which is why the spec became PluralPort. The two are\nunrelated projects. In particular, this app's \"OpenPlural export\" is its own\nnative JSON schema, not a PluralPort document, and its importer only reads that\nnative format and Simply Plural exports.",[197,2284,569],{"id":568},[202,2286,2287],{},"A single JSON document from the backend's export endpoint, rate-limited to one\nexport every six hours per account. It contains privacy buckets, custom field\ndefinitions, folders, members with their field values and privacy, polls with\nanswers, and gallery albums. Fronting history is not included.",[202,2289,2290],{},"This page was written from the app's public repositories rather than reported\nby its maintainers.",{"title":13,"searchDepth":14,"depth":14,"links":2292},[2293,2294],{"id":2278,"depth":14,"text":2279},{"id":568,"depth":14,"text":569},"Simply Plural-style hosted app with its own JSON export. Not related to the OpenPlural spec, which is now called PluralPort.","Single JSON document in its own schema, limited to one export every six hours",[2298,2301],{"label":2299,"href":2300},"Web app source","https:\u002F\u002Fgithub.com\u002FOpenPlural\u002Fopl-webapp",{"label":2302,"href":2303},"Android app (archived)","https:\u002F\u002Fgithub.com\u002FOpenPlural\u002Fopl-android",[2305,2308,2310,2312,2314,2317],{"source":2306,"target":2307},"members[] with custom flag","Member, with is_custom_front from custom",{"source":2309,"target":36},"folders[] with parent_id",{"source":2311,"target":39},"fields[] + per-member fields map",{"source":2313,"target":1932},"privacy[] buckets",{"source":2315,"target":2316},"polls[]","polls module",{"source":2318,"target":2319},"gallery[] albums","Asset records in extensions",{},[2322,2323,2325,2327,2329,2331,2333,2334,2336,2338,2339,2340,2341,2343,2344,2345,2346,2347],{"key":49,"support":22,"note":22},{"key":51,"support":22,"note":2324},"Name, pronouns, avatar, description, colour, archived and custom-front flags, sort order.",{"key":54,"support":22,"note":2326},"Front history exists in the app but is not part of the export.",{"key":57,"support":22,"note":2328},"Folders with a parent id, so hierarchical.",{"key":60,"support":22,"note":2330},"Folders only.",{"key":62,"support":22,"note":2332},"Typed definitions with string values on members.",{"key":65,"support":22,"note":22},{"key":68,"support":22,"note":2335},"Avatar URLs and per-member gallery albums.",{"key":71,"support":22,"note":2337},"Named privacy buckets applied to members, folders, fields, and albums.",{"key":73,"support":22,"note":22},{"key":76,"support":22,"note":22},{"key":78,"support":22,"note":22},{"key":80,"support":22,"note":2342},"Polls with abstain and veto options and per-member answers.",{"key":82,"support":22,"note":22},{"key":84,"support":22,"note":22},{"key":86,"support":22,"note":22},{"key":88,"support":22,"note":22},{"key":90,"support":22,"note":22},"\u002Fapps\u002Fopen-plural","Web (hosted PWA)","https:\u002F\u002Fgithub.com\u002FOpenPlural\u002Fopl-backend",{"description":2295},"apps\u002Fopen-plural","A hosted Simply Plural-style tracker with a Rust backend and an Angular web app, started in March 2026. It has its own JSON export and import covering privacy buckets, custom fields, folders, members, polls, and gallery albums, plus a Simply Plural importer. It shares a name with this spec's original name but has no connection to it and no support for the format.","https:\u002F\u002Fopenplural.webbiii.cc\u002F","N7d0-DkcwlQMH9WNJG6BlFibLvNJMXCaBaaHl8egTvU",{"id":2357,"title":2358,"app_id":2359,"apple_store":22,"body":2360,"description":3402,"export":17,"export_shape":3403,"extension":19,"google_play":22,"import":21,"last_verified":2228,"license":22,"links":3404,"logo":3412,"mapping":3413,"meta":3446,"modules":3447,"name":3483,"navigation":17,"order":325,"path":3484,"platform":3485,"repo":22,"self_reported":21,"seo":3486,"spec_version":22,"status":1726,"stem":3487,"summary":3488,"website":22,"__hash__":3489},"apps\u002Fapps\u002Fberrytree.md","Berrytree","berrytree",{"type":10,"value":2361,"toc":3392},[2362,2366,2369,2372,2376,2379,2394,2397,2414,2417,2419,2422,2497,2503,2506,2592,2596,2606,3258,3262,3268,3291,3293,3296,3364,3366,3373,3376,3380,3383],[197,2363,2365],{"id":2364},"status","Status",[202,2367,2368],{},"BerryTree has been unpublished from Google Play, and its server has been\nunreachable since roughly August 2026. There was never an iOS release.\nThere is no project website; the Discord server linked above is the only\nofficial presence we have been able to find, and at time of writing it\nis locked with a notice that the service is down.",[202,2370,2371],{},"This entry exists because BerryTree users are holding export files from\nan app they can no longer run, and the recovery question is a real one.",[197,2373,2375],{"id":2374},"evidence-level","Evidence level",[202,2377,2378],{},"This entry draws on two sources, neither reviewed or confirmed by anyone\nfrom the project, which is why it is not marked self-reported:",[947,2380,2381,2388],{},[950,2382,2383,2384,2387],{},"A ",[624,2385,2386],{},"single export file",", contributed by a BerryTree user. It was\ngenerated from a test account, so only seven sections held records.",[950,2389,2390,2393],{},[624,2391,2392],{},"Static analysis of the last public Android client (1.0.16)",", carried\nout for interoperability. This shows how the app reads and writes each\nkind of record through its server API, which covers most of the\nsections the export sample left empty.",[202,2395,2396],{},"The two are not equally strong, and the record shapes below say which\none each comes from. \"Seen in export\" means the field names were\nobserved in a real export file. \"Inferred from client\" means the shape\nis what the app sends to and reads from its server; the export is a dump\nmade on the server side, so its field names are very likely the same,\nbut that has not been observed.",[202,2398,2399,2400,2403,2404,1012,2407,631,2410,2413],{},"They can differ. The export sample carries fields that the 1.0.16 client\nnever references at all, such as ",[228,2401,2402],{},"status_label"," on front entries and\n",[228,2405,2406],{},"layer_ids",[228,2408,2409],{},"system_context_ids",[228,2411,2412],{},"hidden_in_contexts"," on members.\nSo the server's data model had moved ahead of that client, and a real\nexport may hold fields the client analysis cannot describe.",[202,2415,2416],{},"Corrections are very welcome, particularly a populated export.",[197,2418,569],{"id":568},[202,2420,2421],{},"A single JSON document, produced by the server and saved unchanged by\nthe app. Top-level keys observed:",[202,2423,2424,1012,2426,1012,2429,1012,2431,1012,2434,673,2436,1012,2439,1012,2442,1012,2444,1012,2446,673,2448,1012,2451,1012,2454,1012,2457,1012,2460,673,2462,1012,2465,1012,2467,1012,2470,1012,2473,673,2476,1012,2479,1012,2482,673,2485,1012,2488,1012,2491,673,2494,602],{},[228,2425,716],{},[228,2427,2428],{},"schema_version",[228,2430,680],{},[228,2432,2433],{},"system",[228,2435,51],{},[228,2437,2438],{},"front_entries",[228,2440,2441],{},"custom_statuses",[228,2443,73],{},[228,2445,80],{},[228,2447,82],{},[228,2449,2450],{},"privacy_buckets",[228,2452,2453],{},"useful_links",[228,2455,2456],{},"folders",[228,2458,2459],{},"sub_systems",[228,2461,65],{},[228,2463,2464],{},"journal",[228,2466,78],{},[228,2468,2469],{},"places",[228,2471,2472],{},"map_nodes",[228,2474,2475],{},"field_templates",[228,2477,2478],{},"user_settings",[228,2480,2481],{},"external_contacts",[228,2483,2484],{},"external_relationships",[228,2486,2487],{},"cross_system_relationships",[228,2489,2490],{},"system_contexts",[228,2492,2493],{},"layers",[228,2495,2496],{},"_partial_errors",[202,2498,2499,2500,602],{},"The sample carried ",[228,2501,2502],{},"schema_version: 3",[202,2504,2505],{},"Details worth knowing before writing a reader:",[947,2507,2508,2533,2574,2582],{},[950,2509,2510,2515,2516,2518,2519,2522,2523,2526,2527,2529,2530,602],{},[624,2511,2512,2514],{},[228,2513,2441],{}," holds two different things",", discriminated by\n",[228,2517,1011],{},". Rows with ",[228,2520,2521],{},"kind: \"type\""," are fronting types that annotate a\nfront entry. Rows with ",[228,2524,2525],{},"kind: \"status\""," are standalone fronting\nentities that front with no member attached, which is the custom-front\npattern. Treating them as one list produces a roster full of things\nthat are not members. A missing ",[228,2528,1011],{}," means ",[228,2531,2532],{},"\"status\"",[950,2534,2535,2541,2542,2544,2545,2547,2548,2551,2552,2554,2555,673,2558,1012,2561,1012,2564,673,2567,631,2570,2573],{},[624,2536,2537,2538,2540],{},"The system profile is not on the ",[228,2539,2433],{}," object."," That one carries\nlittle more than a username and an account email. In the sample, the\nname, description, avatar, colour, tag and pronouns live on the\n",[228,2543,2490],{}," row whose ",[228,2546,1011],{}," is ",[228,2549,2550],{},"\"main\"",". The 1.0.16 client,\nhowever, never references system contexts, and edits the profile\nthrough these ",[228,2553,2478],{}," keys instead: ",[228,2556,2557],{},"system_description",[228,2559,2560],{},"system_avatar",[228,2562,2563],{},"system_banner",[228,2565,2566],{},"system_tags",[228,2568,2569],{},"system_custom_fields",[228,2571,2572],{},"system_status",". A reader should check both\nplaces.",[950,2575,2576,2581],{},[624,2577,2578,2580],{},[228,2579,2496],{}," is the exporter's own failure log."," A file\ncarrying entries here was already incomplete when it was written, and\na reader should surface that rather than presenting a clean import.\nNote that these strings are written by the exporter about a record\nthat failed, so they can quote user content; treat them accordingly if\nyour job logs are not encrypted.",[950,2583,2584,2587,2588,2591],{},[624,2585,2586],{},"Images are references, not bytes."," An avatar, banner, folder image\nor profile-block image is either a base64 ",[228,2589,2590],{},"data:image\u002F..."," URI, which\nis self-contained and survives the server being gone, or a URL into\npublic object storage, which only works for as long as that storage\nkeeps serving. URLs pointing at the app's own server are dead.",[197,2593,2595],{"id":2594},"record-shapes","Record shapes",[202,2597,2598,2599,2601,2602,2605],{},"Timestamps are ISO 8601 strings. Records carry a string ",[228,2600,1081],{},", and the\nexport sample shows a ",[228,2603,2604],{},"user_id"," owner field on every record type it had.",[947,2607,2608,2713,2741,2780,2828,2877,2904,2931,2976,3005,3019,3040,3069,3082,3098,3133,3153,3171,3193,3215,3250],{},[950,2609,2610,2614,2615,1012,2618,1012,2621,673,2624,1012,2627,1012,2630,1012,2633,1012,2636,1012,2639,673,2642,1012,2645,2648,2649,2652,2653,673,2655,1012,2657,2660,2661,1012,2664,2667,2668,1012,2671,1012,2674,673,2677,2680,2681,2684,2685,1012,2688,2690,2691,673,2694,2697,2698,2701,2702,2705,2706,2709,2710,2712],{},[624,2611,2612],{},[228,2613,125],{}," (seen in export): ",[228,2616,2617],{},"name",[228,2619,2620],{},"display_name",[228,2622,2623],{},"pronouns",[228,2625,2626],{},"role",[228,2628,2629],{},"description",[228,2631,2632],{},"color",[228,2634,2635],{},"emoji",[228,2637,2638],{},"avatar",[228,2640,2641],{},"banner",[228,2643,2644],{},"is_private",[228,2646,2647],{},"proxy_tags"," (",[228,2650,2651],{},"{prefix, suffix}"," pairs), ",[228,2654,62],{},[228,2656,1474],{},[228,2658,2659],{},"folder_ids"," plus a legacy single ",[228,2662,2663],{},"folder_id",[228,2665,2666],{},"sub_system_ids","\nplus a legacy single ",[228,2669,2670],{},"sub_system_id",[228,2672,2673],{},"pinned",[228,2675,2676],{},"is_template",[228,2678,2679],{},"archived"," (a flag with no date), ",[228,2682,2683],{},"counts_toward_headcount"," (defaults\nto true), ",[228,2686,2687],{},"hide_from_main",[228,2689,1101],{}," (free text), ",[228,2692,2693],{},"blocks",[228,2695,2696],{},"theme_overrides",", and server-set ",[228,2699,2700],{},"short_id",", thumbnails and\n",[228,2703,2704],{},"has_avatar","\u002F",[228,2707,2708],{},"has_banner"," flags. ",[228,2711,1474],{}," is a plain list of strings\n(inferred from client; empty in the sample).",[950,2714,2715,2720,2721,2724,2725,2728,2729,2732,2733,2736,2737,2740],{},[624,2716,2717],{},[228,2718,2719],{},"members[].custom_fields[]"," (inferred from client): one object per\nfield, ",[228,2722,2723],{},"{label, value, type, template_id}",", matched to its template by\n",[228,2726,2727],{},"template_id"," or, failing that, by label ignoring case. ",[228,2730,2731],{},"value"," is\nalways a string. A ",[228,2734,2735],{},"friend_note"," field instead holds ",[228,2738,2739],{},"entries",", each\nwith a body, a timestamp and the name of the friend who wrote it, which\nmakes that content another user's writing.",[950,2742,2743,2748,2749,1012,2752,2755,2756,1012,2758,1012,2761,1012,2764,1012,2767,673,2770,631,2773,2776,2777,2779],{},[624,2744,2745],{},[228,2746,2747],{},"members[].blocks[]"," (inferred from client): profile layout blocks\nof type ",[228,2750,2751],{},"paragraph",[228,2753,2754],{},"h1"," to ",[228,2757,1207],{},[228,2759,2760],{},"quote",[228,2762,2763],{},"list",[228,2765,2766],{},"image",[228,2768,2769],{},"gallery",[228,2771,2772],{},"divider",[228,2774,2775],{},"columns",". The inside of a ",[228,2778,2775],{}," block is not known.",[950,2781,2782,2787,2788,1012,2791,673,2794,1012,2797,2800,2801,1012,2803,1012,2806,673,2809,1012,2812,1012,2815,1012,2817,1012,2820,1012,2823,631,2826,602],{},[624,2783,2784],{},[228,2785,2786],{},"field_templates[]"," (inferred from client): ",[228,2789,2790],{},"label",[228,2792,2793],{},"type",[228,2795,2796],{},"required",[228,2798,2799],{},"order",". The types are ",[228,2802,578],{},[228,2804,2805],{},"longtext",[228,2807,2808],{},"markdown",[228,2810,2811],{},"html",[228,2813,2814],{},"block",[228,2816,2632],{},[228,2818,2819],{},"date",[228,2821,2822],{},"url",[228,2824,2825],{},"number",[228,2827,2735],{},[950,2829,2830,2614,2835,673,2837,1012,2840,1012,2843,1012,2846,2849,2850,1012,2852,1012,2854,2856,2857,2860,2861,2864,2865,2867,2868,2870,2871,2873,2874,2876],{},[624,2831,2832],{},[228,2833,2834],{},"front_entries[]",[228,2836,1029],{},[228,2838,2839],{},"custom_status_id",[228,2841,2842],{},"fronting_type_id",[228,2844,2845],{},"note",[228,2847,2848],{},"custom_status"," (free\ntext), ",[228,2851,2402],{},[228,2853,1134],{},[228,2855,1033],{}," (null while still\nfronting). A sub-system fronting as a unit is stored as one entry per\nmember tagged with ",[228,2858,2859],{},"subsystem_id"," (spelled without the underscore\nhere, inferred from client). ",[624,2862,2863],{},"Legacy form:"," older data records a\nfronting type as ",[228,2866,1029],{}," plus a ",[228,2869,2839],{}," that points at\na ",[228,2872,2521],{}," status, and sometimes as a ",[228,2875,2839],{}," of that\nkind with no member at all. Entries can also point at a status that\nhas since been deleted.",[950,2878,2879,2614,2884,1012,2886,1012,2888,673,2890,1012,2892,1012,2895,1012,2897,1012,2900,2903],{},[624,2880,2881],{},[228,2882,2883],{},"custom_statuses[]",[228,2885,2617],{},[228,2887,2635],{},[228,2889,2632],{},[228,2891,2629],{},[228,2893,2894],{},"image_url",[228,2896,1011],{},[228,2898,2899],{},"category",[228,2901,2902],{},"sort_order",". The\nfive default fronting types are created by the server.",[950,2905,2906,2614,2911,1012,2913,1012,2915,673,2917,1012,2919,1012,2921,1012,2923,673,2926,1012,2929,602],{},[624,2907,2908],{},[228,2909,2910],{},"folders[]",[228,2912,2617],{},[228,2914,2632],{},[228,2916,2635],{},[228,2918,2629],{},[228,2920,2766],{},[228,2922,2644],{},[228,2924,2925],{},"parent_id",[228,2927,2928],{},"show_in_main_list",[228,2930,2670],{},[950,2932,2933,2787,2938,1012,2940,673,2942,1012,2944,1012,2946,1012,2948,1012,2950,1012,2952,1012,2955,673,2958,1012,2960,1012,2963,673,2966,2648,2968,2971,2972,2975],{},[624,2934,2935],{},[228,2936,2937],{},"sub_systems[]",[228,2939,2617],{},[228,2941,2629],{},[228,2943,2635],{},[228,2945,2632],{},[228,2947,2638],{},[228,2949,2641],{},[228,2951,2623],{},[228,2953,2954],{},"tag",[228,2956,2957],{},"leader_id",[228,2959,2644],{},[228,2961,2962],{},"can_front_as_unit",[228,2964,2965],{},"hide_members_from_main",[228,2967,62],{},[228,2969,2970],{},"{label, value}"," pairs) and ",[228,2973,2974],{},"member_ids",". Membership\nis also recorded on each member, so a reader should combine both.",[950,2977,2978,2787,2983,1012,2986,2989,2990,2690,2992,2994,2995,2997,2998,1012,3001,1012,3003,602],{},[624,2979,2980],{},[228,2981,2982],{},"journal[]",[228,2984,2985],{},"title",[228,2987,2988],{},"body"," (Markdown),\n",[228,2991,1101],{},[228,2993,2974],{}," (several authors, with a legacy single\n",[228,2996,1029],{},"), ",[228,2999,3000],{},"tag_ids",[228,3002,2663],{},[228,3004,1166],{},[950,3006,3007,2787,3012,1012,3014,3016,3017,602],{},[624,3008,3009],{},[228,3010,3011],{},"notes[]",[228,3013,2985],{},[228,3015,2988],{}," (plain text),\n",[228,3018,2632],{},[950,3020,3021,2787,3025,631,3028,3031,3032,3035,3036,3039],{},[624,3022,3023],{},[228,3024,2315],{},[228,3026,3027],{},"question",[228,3029,3030],{},"options",", each\noption being ",[228,3033,3034],{},"{text, votes}"," where ",[228,3037,3038],{},"votes"," lists the ids of the\nmembers who chose it.",[950,3041,3042,2787,3047,1012,3049,3052,3053,673,3056,3059,3060,2755,3063,1019,3066,602],{},[624,3043,3044],{},[228,3045,3046],{},"reminders[]",[228,3048,2985],{},[228,3050,3051],{},"time"," as ",[228,3054,3055],{},"HH:MM",[228,3057,3058],{},"days"," as a list of ",[228,3061,3062],{},"mon",[228,3064,3065],{},"sun",[228,3067,3068],{},"enabled",[950,3070,3071,2787,3076,1012,3078,673,3080,602],{},[624,3072,3073],{},[228,3074,3075],{},"useful_links[]",[228,3077,2985],{},[228,3079,2822],{},[228,3081,2629],{},[950,3083,3084,2787,3089,1012,3092,3094,3095,3097],{},[624,3085,3086],{},[228,3087,3088],{},"chat[]",[228,3090,3091],{},"channel_id",[228,3093,1029],{}," (the\nmember posting) and ",[228,3096,578],{}," (Markdown). The client shows no replies,\nreactions, attachments or timestamps.",[950,3099,3100,2787,3105,673,3108,1012,3111,1012,3114,3116,3117,3119,3120,3123,3124,3127,3128,3130,3131,602],{},[624,3101,3102],{},[228,3103,3104],{},"relationships[]",[228,3106,3107],{},"member_a_id",[228,3109,3110],{},"member_b_id",[228,3112,3113],{},"type_id",[228,3115,2793],{}," (a copy of the type's label), ",[228,3118,2845],{},",\nand optional per-link styling. Reciprocal relationships are stored as\n",[624,3121,3122],{},"two rows",", one in each direction, linked by ",[228,3125,3126],{},"inverse_pair_id",", so a\nreader that does not deduplicate on it imports every such link twice.\nOlder rows can have a ",[228,3129,2793],{}," label and no ",[228,3132,3113],{},[950,3134,3135,2787,3140,1012,3142,673,3144,1012,3146,1012,3148,1012,3150,3152],{},[624,3136,3137],{},[228,3138,3139],{},"external_contacts[]",[228,3141,2617],{},[228,3143,2626],{},[228,3145,2623],{},[228,3147,2635],{},[228,3149,2632],{},[228,3151,2629],{},". No avatar.",[950,3154,3155,2787,3160,673,3162,1012,3165,1012,3167,1012,3169,602],{},[624,3156,3157],{},[228,3158,3159],{},"external_relationships[]",[228,3161,1029],{},[228,3163,3164],{},"external_contact_id",[228,3166,2793],{},[228,3168,3113],{},[228,3170,2845],{},[950,3172,3173,2787,3178,673,3180,1012,3183,1012,3186,1012,3188,1012,3190,3192],{},[624,3174,3175],{},[228,3176,3177],{},"cross_system_relationships[]",[228,3179,1029],{},[228,3181,3182],{},"friend_user_id",[228,3184,3185],{},"friend_member_id",[228,3187,2793],{},[228,3189,3113],{},[228,3191,2845],{},". The\nfriend ids point at another account on the same server, so they cannot\nbe resolved anywhere else.",[950,3194,3195,2787,3200,1012,3202,673,3204,1012,3206,1012,3209,673,3212,602],{},[624,3196,3197],{},[228,3198,3199],{},"privacy_buckets[]",[228,3201,2617],{},[228,3203,2632],{},[228,3205,2974],{},[228,3207,3208],{},"friend_ids",[228,3210,3211],{},"allowed_features",[228,3213,3214],{},"field_template_ids",[950,3216,3217,2787,3222,1012,3224,673,3226,1012,3228,1012,3231,3234,3235,673,3238,1012,3240,3243,3244,631,3247,602],{},[624,3218,3219],{},[228,3220,3221],{},"places[]",[228,3223,2617],{},[228,3225,2629],{},[228,3227,2632],{},[228,3229,3230],{},"icon",[228,3232,3233],{},"parent_place_id"," (places nest), ",[228,3236,3237],{},"map_id",[228,3239,2974],{},[228,3241,3242],{},"images",", and a position as ",[228,3245,3246],{},"x",[228,3248,3249],{},"y",[950,3251,3252,3257],{},[624,3253,3254],{},[228,3255,3256],{},"map_nodes[]"," (inferred from client): member positions on the\nrelationships graph, with no content of their own.",[197,3259,3261],{"id":3260},"not-in-the-export","Not in the export",[202,3263,3264,3265,3267],{},"The app has several features whose records have no section in the\n",[228,3266,2502],{}," export. They were either not exported or added after\nthat version, and only a newer export would tell which:",[947,3269,3270,3273,3276,3279,3282,3285,3288],{},[950,3271,3272],{},"Journal tags and journal folders, which the journal entries refer to\nby id.",[950,3274,3275],{},"Chat channels and categories, which the chat messages refer to by id.",[950,3277,3278],{},"Relationship types, including their colours, symbols and whether they\nare reciprocal.",[950,3280,3281],{},"Mood check-ins and dissociation self-assessment (DES) results.",[950,3283,3284],{},"Named maps, the connections drawn between places, and free-form canvas\nitems on the map.",[950,3286,3287],{},"Habits and habit logs, custom quiz questions, and a companion pet.",[950,3289,3290],{},"Friends, friend requests, and notes shared with a friend.",[197,3292,945],{"id":944},[202,3294,3295],{},"Things BerryTree tracks that have no obvious v0.1 target:",[947,3297,3298,3304,3313,3322,3327,3333,3339,3344,3350],{},[950,3299,3300,3303],{},[624,3301,3302],{},"Fronting types"," as a first-class user-editable vocabulary attached\nper front entry.",[950,3305,3306,3309,3310,3312],{},[624,3307,3308],{},"Multi-context rosters with layers",", including per-context member\nhiding (",[228,3311,2412],{},").",[950,3314,3315,2648,3318,1012,3320,3312],{},[624,3316,3317],{},"Inner-world map",[228,3319,2469],{},[228,3321,2472],{},[950,3323,3324],{},[624,3325,3326],{},"Named privacy buckets.",[950,3328,3329,3332],{},[624,3330,3331],{},"External and cross-system relationships",", as distinct from\nmember-to-member ones.",[950,3334,3335,3338],{},[624,3336,3337],{},"Member templates"," as a first-class flag.",[950,3340,3341],{},[624,3342,3343],{},"Per-system useful-links list.",[950,3345,3346,3349],{},[624,3347,3348],{},"Profile blocks",", as a structured layout rather than a description.",[950,3351,3352,3353,1012,3356,673,3358,1012,3360,1012,3362,602],{},"Assorted per-member flags: ",[228,3354,3355],{},"silent_switch",[228,3357,2687],{},[228,3359,2673],{},[228,3361,2700],{},[228,3363,2696],{},[197,3365,1205],{"id":1204},[202,3367,3368,3369,3372],{},"The export is generated by BerryTree's server: the app requests it and\nsaves the reply as a JSON file. With the server unreachable, ",[624,3370,3371],{},"no new\nexports can be made",", so the only exports that exist are ones users\nsaved while it was running.",[202,3374,3375],{},"The app also keeps a local cache of the server responses for screens a\nuser visited, stored in its private app storage. On a device where the\napp is still installed that cache may hold data that was never exported,\nbut reading it requires root access to the device.",[197,3377,3379],{"id":3378},"reader-implementations","Reader implementations",[202,3381,3382],{},"Sheaf ships an importer covering the system profile, members, custom\nstatuses, fronting history and folders, marked experimental for exactly\nthe reason set out under Evidence level. It counts and reports every\nsection it cannot read rather than guessing at field names, so an import\ntells the user what was left behind instead of quietly dropping it.",[202,3384,976,3385,3391],{},[3386,3387,3390],"a",{"href":1550,"rel":3388},[3389],"nofollow","PluralPort Converter","\nreads the same export in the browser and writes a PluralPort file covering\nmembers, custom fronts, folders, tags, custom fields, front history and\nimages, for apps that do not have a BerryTree importer of their own.",{"title":13,"searchDepth":14,"depth":14,"links":3393},[3394,3395,3396,3397,3398,3399,3400,3401],{"id":2364,"depth":14,"text":2365},{"id":2374,"depth":14,"text":2375},{"id":568,"depth":14,"text":569},{"id":2594,"depth":14,"text":2595},{"id":3260,"depth":14,"text":3261},{"id":944,"depth":14,"text":945},{"id":1204,"depth":14,"text":1205},{"id":3378,"depth":14,"text":3379},"Android app with a server component and a single-document JSON export. Unpublished from Google Play; its server has been unreachable since August 2026.","Single JSON document generated by the server, one key per section, plus a _partial_errors array the exporter uses to record sections it failed to write. It carries no media bytes.",[3405,3408,3411],{"label":3406,"href":3407},"Discord server (Disboard listing)","https:\u002F\u002Fdisboard.org\u002Fserver\u002F1503465858687570000",{"label":3409,"href":3410},"Discord invite","https:\u002F\u002Fdiscord.com\u002Finvite\u002F8vYzuEGrcQ",{"label":1549,"href":1550},"\u002Fimages\u002Flogos\u002Fberrytree.png",[3414,3416,3419,3422,3425,3428,3430,3431,3433,3435,3438,3440,3443],{"source":125,"target":30,"note":3415},"counts_toward_headcount: false is the custom-front pattern; role and mood have no obvious target and suit custom fields.",{"source":3417,"target":133,"note":3418},"members[].tags","Tags are plain strings, deduplicated case-insensitively.",{"source":3420,"target":39,"note":3421},"field_templates[] + members[].custom_fields[]","Values are inline on the member and reference a template by template_id when they have one, otherwise by label.",{"source":3423,"target":3424},"custom_statuses[] where kind is \"status\"","Member (custom front)",{"source":3426,"target":3427},"custom_statuses[] where kind is \"type\"","No direct target. Fronting types annotate a front rather than being one; they map naturally onto FrontAssignment front_role.",{"source":2834,"target":1748,"note":3429},"An entry names either a member or a custom status. Older entries can carry a fronting type in custom_status_id, so resolve that id and check its kind before treating the entry as a status.",{"source":2910,"target":1926},{"source":3432,"target":1477},"journal[] + notes[]",{"source":3088,"target":1869,"note":3434},"Channel records are not exported, so conversations can only be rebuilt from each message's channel_id.",{"source":3104,"target":3436,"note":3437},"MemberRelationship","Reciprocal relationships are stored as two rows linked by inverse_pair_id; deduplicate on it. Types are not exported, so RelationshipType can only be rebuilt from each row's type label.",{"source":2315,"target":3439},"Provisional polls module",{"source":3441,"target":3442},"system_contexts[] and layers[]","No direct target. Closest fit is System records with parent_system_id, which loses the per-context member hiding.",{"source":3444,"target":3445},"places[] and map_nodes[]","No target. Inner-world map has no module in v0.1.",{},[3448,3450,3452,3454,3456,3458,3460,3462,3464,3466,3468,3469,3471,3473,3475,3477,3479,3481],{"key":49,"support":161,"note":3449},"One account system, plus a multi-context model (system_contexts, layers) and a separate sub_systems section with leaders, members and unit fronting. The editable system profile is split between system_contexts and user_settings.",{"key":51,"support":52,"note":3451},"Name, display name, pronouns, description, colour, emoji, avatar, banner, privacy flag, role, mood, tags, proxy tags, profile blocks, multiple folders, archive and template flags, and a counts_toward_headcount flag equivalent to a custom front.",{"key":54,"support":52,"note":3453},"Intervals naming either a member or a custom status, with a user-editable fronting-type vocabulary (Fronting, Co-fronting, Co-conscious, Blurry, Influencing) attached per entry. Older data can encode the fronting type differently, see below.",{"key":57,"support":52,"note":3455},"Folders with a parent chain, so nesting is preserved. Membership is recorded on the member, not the folder.",{"key":60,"support":161,"note":3457},"Per-member tags as plain strings, with no tag records of their own. Journal tags exist in the app but have no section in the export.",{"key":62,"support":161,"note":3459},"field_templates definitions with ten field types, and values stored inline on each member keyed by label. One field type holds entries written by friends rather than by the system.",{"key":65,"support":161,"note":3461},"Separate notes (plain text) and journal (Markdown, several member authors) sections. Journal folders and tags exist in the app but have no section in the export.",{"key":68,"support":161,"note":3463},"Avatars and banners are either base64 data URIs, which are self-contained, or URLs into public object storage. The export carries no media bytes, so URL-referenced images depend on that storage still serving.",{"key":71,"support":161,"note":3465},"Per-record is_private booleans, plus privacy_buckets that grant chosen friends access to chosen members, features and custom fields, and per-context member hiding.",{"key":73,"support":161,"note":3467},"Messages posted as a member into channels. Channel and category records have no section in the export, so their names are lost.",{"key":76,"support":22,"note":22},{"key":78,"support":161,"note":3470},"Three sections: member relationships, external relationships to people outside the system, and cross-system relationships. Relationship types have no section in the export.",{"key":80,"support":161,"note":3472},"A question and options, with votes recorded per member. No close state or expiry.",{"key":82,"support":161,"note":3474},"Weekly reminders only: a title, a time of day and a set of weekdays, scheduled on the device.",{"key":84,"support":161,"note":3476},"Habits with a daily target and per-day completion logs exist in the app, but have no section in the export.",{"key":86,"support":161,"note":3478},"Members carry proxy_tags, though the app is not a Discord proxy bot.",{"key":88,"support":161,"note":3480},"Friends between accounts, with access granted through privacy buckets. Friend records have no section in the export.",{"key":90,"support":161,"note":3482},"An app PIN lock and a calculator disguise mode, held in account settings rather than exported.","BerryTree","\u002Fapps\u002Fberrytree","Android (unpublished), server-backed",{"description":3402},"apps\u002Fberrytree","Android app backed by a server, with a broad feature surface covering members, fronting, folders, journals, chat, polls, reminders, an inner-world map, and a multi-context roster model. It was unpublished from Google Play and its server has been unreachable since around August 2026, so the practical question for its users is what can be recovered from an export they already hold. Its JSON export writes a key for every section whether or not it has rows, which makes the feature surface unusually easy to enumerate from a single file.","eA9AK_0TF3GrZIk0WBweMPSK0h0cenz10gBq_7wJJ-8",1792272242088]