# social.colibri.actor.profile

> Published by [colibri.social](https://lexicon.garden/identity/did:plc:mprdjqjluoswa7awzggaggj3)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:mprdjqjluoswa7awzggaggj3/social.colibri.actor.profile)
- [Documentation](https://lexicon.garden/lexicon/did:plc:mprdjqjluoswa7awzggaggj3/social.colibri.actor.profile/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:mprdjqjluoswa7awzggaggj3/social.colibri.actor.profile/examples)

## Definitions

### `social.colibri.actor.profile`

**Type**: `record`

A Colibri-specific user profile. Singleton record on the user's own repo, kept separate from app.bsky.actor.profile so Colibri never needs write access to the Bluesky record.

**Key**: `literal:self`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `$type` | `string` (nsid) | No | The type of the record. |
| `theme` | `ref` → `lex:social.colibri.actor.profile#theme` | No | Colibri-only profile theming. Always sourced from this record regardless of syncBluesky. |
| `avatar` | `blob` | No | The user's avatar image. |
| `banner` | `blob` | No | The user's profile banner image. |
| `description` | `string` | No | The user's profile description / bio. |
| `displayName` | `string` | No | The user's display name. |
| `syncBluesky` | `boolean` | No | When true, the AppView serves displayName/avatar/banner/description from the user's app.bsky.actor.profile record (Bluesky stays the live source); these mirrored fields may be omitted here. |
| `preferredBadge` | `string` | No | Label value of the badge the user chose to display as their primary badge. Absent means automatic (highest-priority badge). |
| `presenceService` | `string` (did) | No | DID of the AppView authorized to emit off-protocol presence (status, typing, voice) for this user via Humming. A receiving AppView MUST drop any Hum about this user whose authenticated origin does not equal this value. Absent means the user has not opted into cross-instance presence. |

### `social.colibri.actor.profile#theme`

**Type**: `object`

Colibri-only profile theming.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `gradient` | `ref` → `lex:social.colibri.actor.profile#themeGradient` | No | Two-color gradient profile theme. |
| `accentColor` | `string` | No | Accent color as a #rrggbb hex string. |
| `bannerColor` | `string` | No | Solid fallback banner color as #rrggbb, used when no banner image is set. |

### `social.colibri.actor.profile#themeGradient`

**Type**: `object`

Two-color gradient profile theme.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `primary` | `string` | No | Primary gradient color as #rrggbb. |
| `secondary` | `string` | No | Secondary gradient color as #rrggbb. |

## Raw Schema

```json
{
  "id": "social.colibri.actor.profile",
  "defs": {
    "main": {
      "key": "literal:self",
      "type": "record",
      "record": {
        "type": "object",
        "required": [],
        "properties": {
          "$type": {
            "type": "string",
            "format": "nsid",
            "description": "The type of the record."
          },
          "theme": {
            "ref": "lex:social.colibri.actor.profile#theme",
            "type": "ref",
            "description": "Colibri-only profile theming. Always sourced from this record regardless of syncBluesky."
          },
          "avatar": {
            "type": "blob",
            "accept": [
              "image/jpeg",
              "image/png",
              "image/gif",
              "image/webp"
            ],
            "description": "The user's avatar image."
          },
          "banner": {
            "type": "blob",
            "accept": [
              "image/jpeg",
              "image/png",
              "image/gif",
              "image/webp"
            ],
            "description": "The user's profile banner image."
          },
          "description": {
            "type": "string",
            "maxLength": 2560,
            "description": "The user's profile description / bio.",
            "maxGraphemes": 256
          },
          "displayName": {
            "type": "string",
            "maxLength": 640,
            "description": "The user's display name.",
            "maxGraphemes": 64
          },
          "syncBluesky": {
            "type": "boolean",
            "default": false,
            "description": "When true, the AppView serves displayName/avatar/banner/description from the user's app.bsky.actor.profile record (Bluesky stays the live source); these mirrored fields may be omitted here."
          },
          "preferredBadge": {
            "type": "string",
            "maxLength": 64,
            "description": "Label value of the badge the user chose to display as their primary badge. Absent means automatic (highest-priority badge)."
          },
          "presenceService": {
            "type": "string",
            "format": "did",
            "description": "DID of the AppView authorized to emit off-protocol presence (status, typing, voice) for this user via Humming. A receiving AppView MUST drop any Hum about this user whose authenticated origin does not equal this value. Absent means the user has not opted into cross-instance presence."
          }
        }
      },
      "description": "A Colibri-specific user profile. Singleton record on the user's own repo, kept separate from app.bsky.actor.profile so Colibri never needs write access to the Bluesky record."
    },
    "theme": {
      "type": "object",
      "required": [],
      "properties": {
        "gradient": {
          "ref": "lex:social.colibri.actor.profile#themeGradient",
          "type": "ref",
          "description": "Two-color gradient profile theme."
        },
        "accentColor": {
          "type": "string",
          "maxLength": 7,
          "description": "Accent color as a #rrggbb hex string."
        },
        "bannerColor": {
          "type": "string",
          "maxLength": 7,
          "description": "Solid fallback banner color as #rrggbb, used when no banner image is set."
        }
      },
      "description": "Colibri-only profile theming."
    },
    "themeGradient": {
      "type": "object",
      "required": [],
      "properties": {
        "primary": {
          "type": "string",
          "maxLength": 7,
          "description": "Primary gradient color as #rrggbb."
        },
        "secondary": {
          "type": "string",
          "maxLength": 7,
          "description": "Secondary gradient color as #rrggbb."
        }
      },
      "description": "Two-color gradient profile theme."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1,
  "revision": 2
}
```
