
BerryTree
inactiveAndroid 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.
Last verified 2026-09-23
- app_id
- berrytree
- Status
- inactive
- Platform
- Android (unpublished), server-backed
Module support
| Module | Support | Notes |
|---|---|---|
| systems | Partial | 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. |
| members | Full | 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. |
| fronting | Full | 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. |
| groups | Full | Folders with a parent chain, so nesting is preserved. Membership is recorded on the member, not the folder. |
| taxonomy | Partial | 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. |
| custom_fields | Partial | 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. |
| notes | Partial | 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. |
| assets | Partial | 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. |
| privacy | Partial | 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. |
| chat | Partial | Messages posted as a member into channels. Channel and category records have no section in the export, so their names are lost. |
| boards | ||
| relationships | Partial | Three sections: member relationships, external relationships to people outside the system, and cross-system relationships. Relationship types have no section in the export. |
| polls | Partial | A question and options, with votes recorded per member. No close state or expiry. |
| reminders | Partial | Weekly reminders only: a title, a time of day and a set of weekdays, scheduled on the device. |
| habits | Partial | Habits with a daily target and per-day completion logs exist in the app, but have no section in the export. |
| proxy | Partial | Members carry proxy_tags, though the app is not a Discord proxy bot. |
| sharing | Partial | Friends between accounts, with access granted through privacy buckets. Friend records have no section in the export. |
| safety | Partial | An app PIN lock and a calculator disguise mode, held in account settings rather than exported. |
Data model mapping
| App shape | PluralPort target |
|---|---|
| members[] | Member |
| members[].tags | TaxonomyTerm + TaxonomyAssignment |
| field_templates[] + members[].custom_fields[] | CustomFieldDefinition + CustomFieldValue |
| custom_statuses[] where kind is "status" | Member (custom front) |
| 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. |
| front_entries[] | FrontPeriod |
| folders[] | Group with parent_group_id |
| journal[] + notes[] | Note, with the note kind in extensions |
| chat[] | Conversation + ChatMessage |
| relationships[] | MemberRelationship |
| polls[] | Provisional polls module |
| system_contexts[] and layers[] | No direct target. Closest fit is System records with parent_system_id, which loses the per-context member hiding. |
| places[] and map_nodes[] | No target. Inner-world map has no module in v0.1. |
Status
BerryTree has been unpublished from Google Play, and its server has been unreachable since roughly August 2026. There was never an iOS release. There is no project website; the Discord server linked above is the only official presence we have been able to find, and at time of writing it is locked with a notice that the service is down.
This entry exists because BerryTree users are holding export files from an app they can no longer run, and the recovery question is a real one.
Evidence level
This entry draws on two sources, neither reviewed or confirmed by anyone from the project, which is why it is not marked self-reported:
- A single export file, contributed by a BerryTree user. It was generated from a test account, so only seven sections held records.
- Static analysis of the last public Android client (1.0.16), carried out for interoperability. This shows how the app reads and writes each kind of record through its server API, which covers most of the sections the export sample left empty.
The two are not equally strong, and the record shapes below say which one each comes from. "Seen in export" means the field names were observed in a real export file. "Inferred from client" means the shape is what the app sends to and reads from its server; the export is a dump made on the server side, so its field names are very likely the same, but that has not been observed.
They can differ. The export sample carries fields that the 1.0.16 client
never references at all, such as status_label on front entries and
layer_ids, system_context_ids and hidden_in_contexts on members.
So the server's data model had moved ahead of that client, and a real
export may hold fields the client analysis cannot describe.
Corrections are very welcome, particularly a populated export.
Export shape
A single JSON document, produced by the server and saved unchanged by the app. Top-level keys observed:
app, schema_version, exported_at, system, members,
front_entries, custom_statuses, chat, polls, reminders,
privacy_buckets, useful_links, folders, sub_systems, notes,
journal, relationships, places, map_nodes, field_templates,
user_settings, external_contacts, external_relationships,
cross_system_relationships, system_contexts, layers,
_partial_errors.
The sample carried schema_version: 3.
Details worth knowing before writing a reader:
custom_statusesholds two different things, discriminated bykind. Rows withkind: "type"are fronting types that annotate a front entry. Rows withkind: "status"are standalone fronting entities that front with no member attached, which is the custom-front pattern. Treating them as one list produces a roster full of things that are not members. A missingkindmeans"status".- The system profile is not on the
systemobject. That one carries little more than a username and an account email. In the sample, the name, description, avatar, colour, tag and pronouns live on thesystem_contextsrow whosekindis"main". The 1.0.16 client, however, never references system contexts, and edits the profile through theseuser_settingskeys instead:system_description,system_avatar,system_banner,system_tags,system_custom_fieldsandsystem_status. A reader should check both places. _partial_errorsis the exporter's own failure log. A file carrying entries here was already incomplete when it was written, and a reader should surface that rather than presenting a clean import. Note that these strings are written by the exporter about a record that failed, so they can quote user content; treat them accordingly if your job logs are not encrypted.- Images are references, not bytes. An avatar, banner, folder image
or profile-block image is either a base64
data:image/...URI, which is self-contained and survives the server being gone, or a URL into public object storage, which only works for as long as that storage keeps serving. URLs pointing at the app's own server are dead.
Record shapes
Timestamps are ISO 8601 strings. Records carry a string id, and the
export sample shows a user_id owner field on every record type it had.
members[](seen in export):name,display_name,pronouns,role,description,color,emoji,avatar,banner,is_private,proxy_tags({prefix, suffix}pairs),custom_fields,tags,folder_idsplus a legacy singlefolder_id,sub_system_idsplus a legacy singlesub_system_id,pinned,is_template,archived(a flag with no date),counts_toward_headcount(defaults to true),hide_from_main,mood(free text),blocks,theme_overrides, and server-setshort_id, thumbnails andhas_avatar/has_bannerflags.tagsis a plain list of strings (inferred from client; empty in the sample).members[].custom_fields[](inferred from client): one object per field,{label, value, type, template_id}, matched to its template bytemplate_idor, failing that, by label ignoring case.valueis always a string. Afriend_notefield instead holdsentries, each with a body, a timestamp and the name of the friend who wrote it, which makes that content another user's writing.members[].blocks[](inferred from client): profile layout blocks of typeparagraph,h1toh3,quote,list,image,gallery,dividerandcolumns. The inside of acolumnsblock is not known.field_templates[](inferred from client):label,type,required,order. The types aretext,longtext,markdown,html,block,color,date,url,numberandfriend_note.front_entries[](seen in export):member_id,custom_status_id,fronting_type_id,note,custom_status(free text),status_label,started_at,ended_at(null while still fronting). A sub-system fronting as a unit is stored as one entry per member tagged withsubsystem_id(spelled without the underscore here, inferred from client). Legacy form: older data records a fronting type asmember_idplus acustom_status_idthat points at akind: "type"status, and sometimes as acustom_status_idof that kind with no member at all. Entries can also point at a status that has since been deleted.custom_statuses[](seen in export):name,emoji,color,description,image_url,kind,category,sort_order. The five default fronting types are created by the server.folders[](seen in export):name,color,emoji,description,image,is_private,parent_id,show_in_main_list,sub_system_id.sub_systems[](inferred from client):name,description,emoji,color,avatar,banner,pronouns,tag,leader_id,is_private,can_front_as_unit,hide_members_from_main,custom_fields({label, value}pairs) andmember_ids. Membership is also recorded on each member, so a reader should combine both.journal[](inferred from client):title,body(Markdown),mood(free text),member_ids(several authors, with a legacy singlemember_id),tag_ids,folder_id,created_at.notes[](inferred from client):title,body(plain text),color.polls[](inferred from client):questionandoptions, each option being{text, votes}wherevoteslists the ids of the members who chose it.reminders[](inferred from client):title,timeasHH:MM,daysas a list ofmontosun, andenabled.useful_links[](inferred from client):title,url,description.chat[](inferred from client):channel_id,member_id(the member posting) andtext(Markdown). The client shows no replies, reactions, attachments or timestamps.relationships[](inferred from client):member_a_id,member_b_id,type_id,type(a copy of the type's label),note, and optional per-link styling. Reciprocal relationships are stored as two rows, one in each direction, linked byinverse_pair_id, so a reader that does not deduplicate on it imports every such link twice. Older rows can have atypelabel and notype_id.external_contacts[](inferred from client):name,role,pronouns,emoji,color,description. No avatar.external_relationships[](inferred from client):member_id,external_contact_id,type,type_id,note.cross_system_relationships[](inferred from client):member_id,friend_user_id,friend_member_id,type,type_id,note. The friend ids point at another account on the same server, so they cannot be resolved anywhere else.privacy_buckets[](inferred from client):name,color,member_ids,friend_ids,allowed_features,field_template_ids.places[](inferred from client):name,description,color,icon,parent_place_id(places nest),map_id,member_ids,images, and a position asxandy.map_nodes[](inferred from client): member positions on the relationships graph, with no content of their own.
Not in the export
The app has several features whose records have no section in the
schema_version: 3 export. They were either not exported or added after
that version, and only a newer export would tell which:
- Journal tags and journal folders, which the journal entries refer to by id.
- Chat channels and categories, which the chat messages refer to by id.
- Relationship types, including their colours, symbols and whether they are reciprocal.
- Mood check-ins and dissociation self-assessment (DES) results.
- Named maps, the connections drawn between places, and free-form canvas items on the map.
- Habits and habit logs, custom quiz questions, and a companion pet.
- Friends, friend requests, and notes shared with a friend.
Known loss
Things BerryTree tracks that have no obvious v0.1 target:
- Fronting types as a first-class user-editable vocabulary attached per front entry.
- Multi-context rosters with layers, including per-context member
hiding (
hidden_in_contexts). - Inner-world map (
places,map_nodes). - Named privacy buckets.
- External and cross-system relationships, as distinct from member-to-member ones.
- Member templates as a first-class flag.
- Per-system useful-links list.
- Profile blocks, as a structured layout rather than a description.
- Assorted per-member flags:
silent_switch,hide_from_main,pinned,short_id,theme_overrides.
How to get an export
The export is generated by BerryTree's server: the app requests it and saves the reply as a JSON file. With the server unreachable, no new exports can be made, so the only exports that exist are ones users saved while it was running.
The app also keeps a local cache of the server responses for screens a user visited, stored in its private app storage. On a device where the app is still installed that cache may hold data that was never exported, but reading it requires root access to the device.
Reader implementations
Sheaf ships an importer covering the system profile, members, custom statuses, fronting history and folders, marked experimental for exactly the reason set out under Evidence level. It counts and reports every section it cannot read rather than guessing at field names, so an import tells the user what was left behind instead of quietly dropping it.
The PluralPort Converter reads the same export in the browser and writes a PluralPort file covering members, custom fronts, folders, tags, custom fields, front history and images, for apps that do not have a BerryTree importer of their own.
