# app.zeens.profile

> Published by [zeens.app](https://lexicon.garden/identity/did:plc:pwpuqwge6g7xrjmfbw73uycw)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:pwpuqwge6g7xrjmfbw73uycw/app.zeens.profile)
- [Documentation](https://lexicon.garden/lexicon/did:plc:pwpuqwge6g7xrjmfbw73uycw/app.zeens.profile/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:pwpuqwge6g7xrjmfbw73uycw/app.zeens.profile/examples)

## Definitions

### `app.zeens.profile`

**Type**: `record`

Zeens-specific profile extensions. Stored on the user's own PDS so the data is portable — Zeens reads it on top of app.bsky.actor.profile to render extras like social links. The Bluesky profile (name, avatar, banner, bio) remains the canonical identity.

**Key**: `literal:self`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `$type` | `string` | No |  |
| `bio` | `string` | No | Zeens-specific bio. Replaces the Bluesky description on Zeens profile pages. Independent from app.bsky.actor.profile.description. |
| `socials` | `array` | No | The member's profile links, in the order shown. Any https link: services Zeens recognises are stored under their platform id and drawn with that service's icon, everything else as 'link' with the site's own favicon. Capped at 6 entries; order is preserved. |
| `website` | `string` (uri) | No | LEGACY. A single personal website URL, from before profile links became one list. Readers show it as the first link; Zeens moves it into `socials` (as a 'link') and drops this field the next time the member saves. New writers should not set it. |

### `app.zeens.profile#socialLink`

**Type**: `object`

One profile link.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `handle` | `string` | Yes | The link's full https URL. Records written before links were URL-only may hold a bare username here (user@instance for Mastodon/Pixelfed). |
| `icon` | `blob` | No | A plain link's favicon, fetched when the link was added and re-encoded as a 64px PNG. Absent = draw a generic link mark. |
| `platform` | `string` | Yes | The service the link belongs to, detected from the URL rather than chosen. 'link' is any site Zeens does not recognise. Readers should treat an unknown value as 'link'. |
| `title` | `string` | No | A plain link's site name, read from the site (og:site_name, else its page title) when the link was added. Not member-entered. Absent = show the host. Ignored for recognised services, which show the service's name. |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "Zeens-specific profile extensions. Stored on the user's own PDS so the data is portable — Zeens reads it on top of app.bsky.actor.profile to render extras like social links. The Bluesky profile (name, avatar, banner, bio) remains the canonical identity.",
      "key": "literal:self",
      "record": {
        "properties": {
          "$type": {
            "const": "app.zeens.profile",
            "type": "string"
          },
          "bio": {
            "description": "Zeens-specific bio. Replaces the Bluesky description on Zeens profile pages. Independent from app.bsky.actor.profile.description.",
            "maxGraphemes": 256,
            "maxLength": 2560,
            "type": "string"
          },
          "socials": {
            "description": "The member's profile links, in the order shown. Any https link: services Zeens recognises are stored under their platform id and drawn with that service's icon, everything else as 'link' with the site's own favicon. Capped at 6 entries; order is preserved.",
            "items": {
              "ref": "#socialLink",
              "type": "ref"
            },
            "maxLength": 6,
            "type": "array"
          },
          "website": {
            "description": "LEGACY. A single personal website URL, from before profile links became one list. Readers show it as the first link; Zeens moves it into `socials` (as a 'link') and drops this field the next time the member saves. New writers should not set it.",
            "format": "uri",
            "maxLength": 200,
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "type": "record"
    },
    "socialLink": {
      "description": "One profile link.",
      "properties": {
        "handle": {
          "description": "The link's full https URL. Records written before links were URL-only may hold a bare username here (user@instance for Mastodon/Pixelfed).",
          "maxLength": 100,
          "type": "string"
        },
        "icon": {
          "accept": [
            "image/png"
          ],
          "description": "A plain link's favicon, fetched when the link was added and re-encoded as a 64px PNG. Absent = draw a generic link mark.",
          "maxSize": 65536,
          "type": "blob"
        },
        "platform": {
          "description": "The service the link belongs to, detected from the URL rather than chosen. 'link' is any site Zeens does not recognise. Readers should treat an unknown value as 'link'.",
          "knownValues": [
            "bluesky",
            "mastodon",
            "pixelfed",
            "flickr",
            "glass",
            "vsco",
            "500px",
            "behance",
            "youtube",
            "kofi",
            "patreon",
            "grain",
            "flashes",
            "link"
          ],
          "type": "string"
        },
        "title": {
          "description": "A plain link's site name, read from the site (og:site_name, else its page title) when the link was added. Not member-entered. Absent = show the host. Ignored for recognised services, which show the service's name.",
          "maxGraphemes": 80,
          "maxLength": 800,
          "type": "string"
        }
      },
      "required": [
        "platform",
        "handle"
      ],
      "type": "object"
    }
  },
  "id": "app.zeens.profile",
  "lexicon": 1
}
```
