Skip to main content
API reference sections

Schema

Profile

A persona, not a folder: "Steven - Work", "Steven - Personal".

Creating one requires no login. [Profile::account] remains None until an explicit compare-and-set binds a hosted Koru Identity. A ProfileId remains distinct from account identity and content identity never changes.

A legacy Holder row can still be decoded for migration compatibility, but current code creates personas only.

Type object

Shape

FieldTypeDescription
idrequiredProfileId
namerequiredstring
purposestring or null

Free text the person chose - "work", "school". Not an enum: it is theirs.

avatarstring or null

A token, never a colour value and never a path. color:<name> today; blob:<hash> when a person can upload a picture. The prefix is what makes that addition free - a reader splits on the first colon and branches - where a bare purple would have needed a migration.

The store never interprets it. A client maps color:purple back to whatever purple is in the theme it is drawing, which is what keeps one theme's rendering of a colour out of the person's profile.

iconstring or null

Emoji and named tile colour used by profile switchers. Kept separate from avatar so a profile can have both an icon and a colour.

colorstring or null
accountstring or null

Exact koru:<canonical-v4-identity-uuid> after acknowledged attachment; None while local-only. Never an email or provider subject.

localerequiredLocale

BCP 47. Belongs to the person, never to their content.

created_atrequiredTimestamp

Epoch milliseconds, UTC. Signed, so instants before 1970 are representable.

kindProfileKind

Persona or legacy compatibility holder. See [ProfileKind].

#[serde(default)] keeps profiles written before the field readable. Current creation always writes Normal.

Default "normal"

Example
{
  "id": "00000000-0000-4000-8000-000000000000",
  "name": "string",
  "purpose": "string",
  "avatar": "string",
  "icon": "string",
  "color": "string",
  "account": "string",
  "locale": {},
  "created_at": 0,
  "kind": "normal"
}

The contract has no example values, so example bodies are generated from each schema: every field is shown with a placeholder of its type.

Used by

Generated from contract version 1. Last updated .

Privacy choices

Choose which optional tools Koru may use on this site. Your choice is saved in a cookie in this browser for 12 months. Privacy policy

Privacy choices

Keep you signed in, protect forms and remember your language and this choice.

Always on

PostHog and Google Analytics 4 measure page views and actions such as downloads, using cookies or local storage.

PostHog records how pages are used, with form inputs masked and private pages excluded. Needs Analytics.

Ahrefs Web Analytics measures visits and where they come from, and Google Ads measures whether our ads led to a visit or download.