System
A plurality system's profile and nesting metadata. Multiple systems may appear in one file (Lighthouse, Ampersand, and some user setups support nested systems).
| Field | Type | Required | Notes |
| id | UUID | yes | File-local. References target for system_id on other records. |
| name | string | yes | System name. Sheaf: system.name. Prism: from systemSettings.systemName. |
| display_name | string | null | no | Optional alternate display form. |
| description | string | null | no | Markdown allowed. |
| tag | string | null | no | System tag/suffix. Sheaf: system.tag. PluralKit: system.tag. |
| color | HexColor | null | no | Accent color. |
| avatar_asset_id | UUID | null | no | References an entry in assets[]. |
| banner_asset_id | UUID | null | no | References an entry in assets[]. |
| parent_system_id | UUID | null | no | For nested systems (Lighthouse subsystems, Ampersand nested systems). |
| archived | boolean | no | Defaults to false. |
| privacy | Privacy | no | See Privacy. |
| settings | Record<string, unknown> | no | App-agnostic system settings; app-specific settings belong in extensions. |
| source_refs | SourceRef[] | no | See SourceRef. |
| extensions | Record<string, unknown> | no | App-namespaced raw data preservation. |
{
"id": "sys_01HV4Z...",
"name": "Example System",
"display_name": null,
"description": "Markdown or plain text",
"tag": "| ex",
"color": "#66ccff",
"avatar_asset_id": "asset_avatar",
"banner_asset_id": null,
"parent_system_id": null,
"archived": false,
"privacy": { "visibility": "private", "source": {} },
"settings": {},
"source_refs": [{ "app": "sheaf", "collection": "system", "id": "u_..." }],
"extensions": {
"sheaf": { "date_format": "ymd", "replace_fronts_default": true }
}
}
Member
A member, alter, headmate, custom front, or equivalent profile record. Role-like data lives in taxonomy, not on this record.
| Field | Type | Required | Notes |
| id | UUID | yes | File-local. |
| system_id | UUID | yes | References systems[].id. |
| name | string | null | no | Sheaf: members[].name (decrypted in export). Optional because some apps (Octocon) allow nameless alters and synthesize a display label. Importers without name handling should derive a display string from display_name, pronouns, or a fallback. |
| display_name | string | null | no | Sheaf: members[].display_name. Prism: headmates[].displayName. |
| pronouns | string | null | no | Free text — no enum because every app uses free text. |
| description | string | null | no | Bio. Markdown allowed if extensions.openplural.markdown_fields says so. |
| age | string | null | no | Free text (some apps store ranges, "ageless", etc.). |
| birthday | Birthday | null | no | See Birthday. |
| color | HexColor | null | no | |
| avatar_asset_id | UUID | null | no | References assets[]. Prism: headmates[].profilePhotoData becomes an Asset. |
| banner_asset_id | UUID | null | no | |
| proxy_tags | ProxyTag[] | no | See ProxyTag. PluralKit primary source. |
| is_custom_front | boolean | no | Defaults to false. Used for Simply Plural and Ampersand custom fronts. |
| archived | boolean | no | Defaults to false. |
| created_at | ISO8601 | null | no | Sheaf: members[].created_at. Prism: headmates[].createdAt. |
| sort_order | number | null | no | Lower = earlier in the list. Prism: displayOrder. |
| privacy | Privacy | no | |
| source_refs | SourceRef[] | no | |
| extensions | Record<string, unknown> | no | |
{
"id": "mem_01HV4Z...",
"system_id": "sys_01HV4Z...",
"name": "Alex",
"display_name": "Alex",
"pronouns": "they/them",
"description": "Bio",
"age": null,
"birthday": { "value": "2001-04-29", "precision": "day", "year_visible": true },
"color": "#88ccaa",
"avatar_asset_id": "asset_avatar",
"banner_asset_id": null,
"proxy_tags": [{ "prefix": "a:", "suffix": null }],
"is_custom_front": false,
"archived": false,
"created_at": "2026-04-29T18:00:00Z",
"sort_order": 0,
"privacy": { "visibility": "private", "source": {} },
"source_refs": [{ "app": "sheaf", "collection": "members", "id": "0193..." }],
"extensions": {}
}
Birthday
Birthdays vary by precision: full date, month-day only, year-only, or with year hidden. Sub-record on Member.
| Field | Type | Required | Notes |
| value | string | yes | Date in YYYY-MM-DD, --MM-DD, YYYY, or YYYY-MM form depending on precision. |
| precision | "day" | "month" | "year" | "month_day" | yes | Granularity actually known. |
| year_visible | boolean | no | If false, importers should hide the year in UI even though it's stored. Defaults to true. |