Apps & feature matrix

The data shapes of nine plurality apps, side by side. A translation reference, not a ranking. Each row is what an app actually stores; OpenPlural's job is to be a shape all of them can round-trip through.

Prism and Sheaf have said they'd adopt this. The adoption guide has their full mapping tables.

Feature matrix

What each app stores, in OpenPlural's module vocabulary. Empty cells are real gaps, not unknowns.

App Export shape Members Fronting Groups/tags Custom fields Notes Chat/messages Assets/privacy
Prism Encrypted .prism JSON envelope Yes Per-member intervals plus sleep Hierarchical groups Definitions and values Notes Internal chat with media + member board posts Assets, friend/share metadata
Sheaf /v1/export JSON v2; async zip backup with images Yes Co-front intervals Hierarchical groups + tags Definitions and values Journals + revision history Board messages (system + per-member walls) with single-level replies; plus polls and reminders Avatar URLs + uploaded-file inventory; privacy, safety, watch-token config
PluralSpace ZIP with manifest + data.json v1.0 (GDPR export) Yes Per-member intervals; co-fronting via overlapping rows Nested in app, flat in export (hierarchy dropped) Definitions; populated value shape unverified Journal entries with numeric visibility Channels with embedded messages (no member ID) media/ dir + avatar paths; visibility on system
Ampersand Local JSON backup Yes Per-member intervals with presence metadata Typed tags + nested systems Definitions, string values on members Journal posts Board messages Optional Data URI files/assets
Lighthouse ZIP of CSVs + narrow token API Yes Stubbed in inspected source Subsystems as systems Fixed rich alter fields Journals, communal journals, BDA plans, inner worlds, rules, wishlist Forum/thread posts Image URLs/blobs, token permissions
Octocon Discord-bot slash export: PK datafile v2 or Octocon-native "full" JSON Yes Per-alter intervals with short comment Hierarchical tags (used as groups) Definitions on user, string values on alters System + per-alter journals (in schema, not in export) Discord proxy fields on alter Avatar URLs; four-level security + friendships
OpenSelves Sync log DTOs, no export found Yes Per-member intervals No No No No Member image, account auth
PluralKit API + datafile v2 JSON Yes Switch events Flat groups No No Discord proxy records (out of core export) Avatar/banner URLs, rich privacy
Plural Star Local backup JSON v1.2 Yes Tiered primary / co-front / co-conscious Flat groups Definitions and values Journal Channels/messages + noteboards Avatar/banner dictionaries
Simply Plural Mongo collection export + token API Yes Per-member/status intervals Hierarchical groups Definitions, values on members Notes Chat + board messages Avatar URLs, privacy buckets, friends
Tupperbox tul!export JSON (Discord bot, closed source) Yes No Flat groups, one-per-member No No Discord proxy bot only Avatar URL (CDN) + banner; no privacy model

Per-app summaries

Prism and Sheaf first because they've committed. PluralSpace next because it has by far the largest install base of the apps still in active use. The rest alphabetical. Each block has a mapping snippet and links to the upstream repo and our research notes.

Prism Adopter

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.

Prism shapeOpenPlural target
headmates[]Member
frontSessions[] per-member intervals + sleepSessions[]FrontPeriod with single-member assignments; sleep via status: "sleep"
memberGroups[] with parentGroupIdGroup + GroupMembership
customFields[] + customFieldValues[]CustomFieldDefinition + CustomFieldValue
conversations[] + messages[] + mediaAttachments[]Conversation + ChatMessage + Attachment
member_board_posts (public/private audience, optional targetMemberId); sync-only, not in .prism export envelopeBoardPost in the boards module

Sheaf Adopter

FastAPI/PostgreSQL app with application-level encryption. Already exposes /v1/export 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. A separate async export job also packages image bytes into a zip.

Sheaf shapeOpenPlural target
system object (name, tag, privacy, etc.)System
members[] (decrypted on export)Member
fronts[] with inline member_idsFrontPeriod + one FrontAssignment per member_id
groups[] with parent_id + inline member_idsGroup + GroupMembership
tags[] with inline member_idsTaxonomyTerm (kind: "tag") + TaxonomyAssignment
custom_fields[] with nested valuesCustomFieldDefinition + CustomFieldValue
journals[]Note
messages[] (system board + per-member walls, single-level replies)BoardPost (reply pointer lands in extensions.sheaf until parent_post_id lands)
polls[], reminders[]extensions.sheaf.* until polls/reminders modules land in v0.2
revisions[], watch_tokens[], sync uploaded_files[]Best preserved in extensions today; the async zip is the better source for portable Asset records

PluralSpace

Web app at pluralspace.app. Separate product from Plural Star despite the shared naming history. Current portable surface is a GDPR-style ZIP (manifest.json + data.json v1.0); the shape documented here is reconstructed from inspected sample exports, not a published schema. The public developers page lists a REST API as "Coming Soon" with a preview, but it isn't a usable surface yet — too early to call it the long-term converter target. Per-member front rows (co-fronting via overlapping intervals), system-level polls, embedded chat messages, journal entries with a numeric visibility_level. Groups nest in the app but appear flat in the GDPR export.

PluralSpace shapeOpenPlural target
fronts[]: one row per member, co-fronts share started_at/ended_atFrontPeriod built by grouping rows on identical timestamps; one FrontAssignment per row
members[].role as free-text string arrayTaxonomyTerm (kind: "role") + TaxonomyAssignment per entry
member_groups[] flat (no parent_id); membership denormalized via members[].groups as group names and group.members[] with member IDsGroup + GroupMembership, prefer the ID-side; emit warnings[] with code: "hierarchy_dropped" — upstream export change needed to recover nesting
journal_entries[] with visibility_level (numeric)Note; raw scale preserved in extensions.pluralspace.visibility_level
chat_channels[] with embedded messages keyed by member_nameConversation + ChatMessage; original name preserved in extensions.pluralspace.author_name
polls[] system-scoped with embedded options[].votespolls module (post-v0.1)
custom_fields[] definitions; values shape unverified (no populated values seen)CustomFieldDefinition + CustomFieldValue — needs a sample export with populated values
members[].is_custom_front flag (no instances observed in inspected exports)Member with is_custom_front: true; full shape unverified

Ampersand

Offline-first Tauri/Vue app (alpha). Local backup JSON via exportDatabaseToJSON. Per-member intervals with presence metadata; typed tags for members/journals/assets; nested systems; optional Data URI–embedded files.

Ampersand shapeOpenPlural target
Front entries with presence metadataFrontPeriod with presence/mood/energy on assignments
Typed tags (members/journals/assets)TaxonomyTerm + scoped TaxonomyAssignment
Nested systemsSystem with parent_system_id
Board messages + pollsBoardPost + polls module (poll attached to a board post lives in polls and references the post via extensions until v0.2 formalizes attachment)

Lighthouse

Server-backed Node/Express + PostgreSQL app. Exports a ZIP of CSV files per user; also has a narrow token API. Uses subsystems as separate system records. Fixed rich alter fields rather than free-form custom fields. The export covers more than alters and journals: bdaPlan, innerWorlds, rules, wishlist, communal journals, and the forum surface (categories, threads, threadPosts) ship in the same ZIP. Most land in extensions for a converter built today.

Lighthouse shapeOpenPlural target
Subsystems as separate systemsMultiple System records with parent_system_id
Fixed alter fields (source/type/relationship)CustomFieldDefinition with kind: "select" or taxonomy
relationships column on alters (denormalized text per alter)MemberRelationship + RelationshipType via heuristic parse; emit warning code "relationships_parsed_from_text" (module is provisional)
Forums + threads + communal journalsConversation with kind: "forum"/"thread"

Octocon

Elixir/Phoenix/ScyllaDB monolith plus Discord bot for DID/OSDD system management. Backend (OctoconDev/octocon) and app (OctoconDev/app) repos are now public. Alters carry name, pronouns, color, avatar, four-level security, untracked/ archived/pinned flags, Discord proxy strings, and embedded custom-field values. Fronts are per-alter intervals with a short comment. Tags are hierarchical and play the role of groups. Custom-field definitions live on the user; values live inline on alters with text/number/boolean types. System and per-alter journals exist in the schema. Friendships are bidirectional with friend/trusted_friend levels that pair with alter/tag security_level.

The current user-facing export is a Discord slash command (/export) with two formats: PluralKit datafile v2 (one-way migration to PK; switch history dropped) or Octocon "full" JSON (alters, fronts, tags, polls, user profile). The full export currently omits journals, friendships, Discord settings, and several alter flags.

Octocon announced its own discontinuation in 2026, shortly after Simply Plural's — see the team's statement. The realistic audience for any Octocon exporter is people getting their data out before shutdown.

Octocon shapeOpenPlural target
Alters.Alter with untracked/archived/pinnedMember; untracked mirrors SP custom-front via extensions.octocon.untracked
Fronts.Front rows (per-alter, with optional comment)FrontPeriod + one FrontAssignment per row; carry comment on the assignment
Tags.Tag with parent_tag_idGroup + GroupMembership (Octocon's PK exporter already calls these groups)
Accounts.Field defs + Alters.Field valuesCustomFieldDefinition + CustomFieldValue; values stringly typed
discord_proxies array (prefixtextsuffix) + proxy_nameProxyTag array; preserve proxy_name via display name
security_level on alters/tags + Friendships.Friendship.levelPrivacy fragment; raw enums via extensions.octocon.security_level / friendship_level
Journals (GlobalJournalEntry, AlterJournalEntry) — present in schema, not in exportNote only when read directly from the API; the Discord export drops them

OpenSelves

Smaller offline-first app with browser IndexedDB + a Drizzle/PostgreSQL sync schema. No general export file found in source — portable shape is inferred from sync DTOs and database schema. Per-member front intervals; no groups, custom fields, notes, or chat.

PluralKit

Discord bot with public API and a JSON datafile (currently version: 2) produced by DataFileService.ExportSystem. Uses point-in-time switch events rather than intervals. Flat groups. Rich privacy on members. Discord proxy records sit outside the core export.

PluralKit shapeOpenPlural target
switches[] with members arrayFrontEvent[] with assignments using front_role: "member"
members[] with proxy_tagsMember with ProxyTag array
Flat groups[]Group with null parent_group_id
Per-record privacyPrivacy fragment with source.pluralkit raw detail

Plural Star

React Native app with AsyncStorage + filesystem backups. Local backup JSON v1.2. Tiered fronting (primary / co-front / co-conscious), flat groups, definitions + values for custom fields, channels + messages, noteboards, journals. Formerly "Plural Space" (with a space) before its rebrand — not the same product as PluralSpace below.

Plural Star shapeOpenPlural target
Tiered front periodsFrontPeriod with explicit front_role per tier; source_kind: "tiered"
chatChannels + ps:chat:<id> messagesConversation + ChatMessage
Noteboards (member-targeted posts)BoardPost with target_member_id + pinned

Simply Plural

Announced March 7, 2026 — servers stay up until at least June 1, 2026. Public token API + a more raw Mongo-collection export. Many migration paths flow through it, so the export shape still matters.

Simply Plural shapeOpenPlural target
Per-member/status intervalsFrontPeriod
Hierarchical groupsGroup with parent_group_id
Custom frontsMember with is_custom_front: true
Privacy bucketsPrivacy fragment with source.simply_plural.privacyBuckets
Channels + chat messagesConversation + ChatMessage
boardMessages (member-addressed with title/body, written by/for)BoardPost

Chat & messaging across apps

Messaging is where apps disagree most. The optional chat module covers what they share; per-app oddities go in extensions.

Prism

Closest to a modern internal chat schema.

  • Conversations with participants, categories, read timestamps, archive/mute state.
  • Messages with author, content, edits, replies, reactions, system-message flag.
  • Media attachments with hashes, MIME data, dimensions, blurhash, waveform.

Simply Plural

Two surfaces: chat and board messages.

  • channels + chatMessages form Discord-like chat.
  • boardMessages are member-addressed posts with title, body, target.
  • Chat text is decrypted on export.

Plural Star

Local channels plus noteboards.

  • chatChannels + per-channel ps:chat:<id> message arrays.
  • Messages: text, image, file, reply, or reaction.
  • Noteboard entries are member-targeted with author and pinned state.

Ampersand

Board-style, not channel chat.

  • boardMessages have member, title, body, date, pinned/archive flags.
  • Board messages can include polls with choices and votes.
  • No channel/thread chat in the inspected export.

PluralKit / Octocon

Discord proxying, not internal chat.

  • PluralKit: proxy tags, autoproxy config, proxied messages outside core export.
  • Octocon: discord_proxies array on the alter (prefixtextsuffix) + proxy_name; no internal chat.
  • Portable data should preserve proxy settings separately from message archives.

Lighthouse / Sheaf / OpenSelves

No internal chat surface; boards-style content where present.

  • Lighthouse: forums, threads, thread posts, communal journals.
  • Sheaf: board messages on a system-wide board plus per-member walls, with single-level replies and shared revision history. Not chat-style threading.
  • OpenSelves: no chat model in inspected schema.