# app.lovesky.actor.defs

> Published by [toddlambert.com](https://lexicon.garden/identity/did:plc:r5pj64joaywqnvk2obembpt7)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:r5pj64joaywqnvk2obembpt7/app.lovesky.actor.defs)
- [Documentation](https://lexicon.garden/lexicon/did:plc:r5pj64joaywqnvk2obembpt7/app.lovesky.actor.defs/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:r5pj64joaywqnvk2obembpt7/app.lovesky.actor.defs/examples)

## Definitions

### `app.lovesky.actor.defs#aspectRatio`

**Type**: `object`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `height` | `integer` | Yes |  |
| `width` | `integer` | Yes |  |

### `app.lovesky.actor.defs#photo`

**Type**: `object`

A public card photo. Blobs are world-readable and may be cached by any relay or mirror; users should be told this before upload.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `alt` | `string` | No |  |
| `aspectRatio` | `ref` → `#aspectRatio` | No |  |
| `image` | `blob` | Yes |  |

### `app.lovesky.actor.defs#photoView`

**Type**: `object`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `alt` | `string` | No |  |
| `aspectRatio` | `ref` → `#aspectRatio` | No |  |
| `fullsize` | `string` (uri) | Yes |  |
| `thumb` | `string` (uri) | Yes |  |

### `app.lovesky.actor.defs#preferences`

**Type**: `object`

PRIVATE. Matching preferences held only by the Lovesky AppView, encrypted at rest. This object is an XRPC payload, never a repo record. It holds everything a public card must not: gender, who the user is seeking, birthdate, location.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `ageMax` | `integer` | No |  |
| `ageMin` | `integer` | No |  |
| `birthDate` | `string` (datetime) | Yes | Used to enforce 18+ and to compute the age shown in-app. Never published. |
| `discoverable` | `boolean` | No | False pauses the account: the card stays published but is hidden from discovery. |
| `gender` | `string` | Yes |  |
| `geohash` | `string` | No | Client truncates to 6 characters (about 1.2 km cells) before sending. The AppView never stores anything finer. |
| `maxDistanceKm` | `integer` | No |  |
| `seeking` | `array` | Yes |  |

### `app.lovesky.actor.defs#profileView`

**Type**: `object`

A card hydrated by the AppView for an authenticated viewer. Combines the public record with private, per-viewer state.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `age` | `integer` | No | Computed at request time from private birthDate. Shown in-app only. |
| `bio` | `string` | No |  |
| `did` | `string` (did) | Yes |  |
| `displayName` | `string` | No |  |
| `handle` | `string` (handle) | Yes |  |
| `indexedAt` | `string` (datetime) | Yes |  |
| `intent` | `array` | No |  |
| `interests` | `array` | No |  |
| `labels` | `array` | No |  |
| `languages` | `array` | No |  |
| `mutuals` | `integer` | No | Number of accounts followed by both the viewer and this profile, from the public Bluesky graph. |
| `photos` | `array` | No |  |
| `prompts` | `array` | No |  |
| `pronouns` | `string` | No |  |
| `region` | `string` | No |  |
| `sharedInterests` | `array` | No |  |
| `tagline` | `string` | No |  |
| `viewer` | `ref` → `#viewerState` | No |  |

### `app.lovesky.actor.defs#prompt`

**Type**: `object`

A short question-and-answer pair shown on the public card.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `answer` | `string` | Yes |  |
| `question` | `string` | Yes |  |

### `app.lovesky.actor.defs#viewerState`

**Type**: `object`

Per-viewer relationship state. Deliberately omits likedBy and blockedBy so one-sided likes and blocks never leak. following/followedBy come from the public Bluesky graph.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `blocking` | `boolean` | No |  |
| `followedBy` | `boolean` | No | This account follows the viewer on Bluesky. |
| `following` | `boolean` | No | The viewer follows this account on Bluesky. |
| `liked` | `boolean` | No |  |
| `matched` | `boolean` | No |  |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "aspectRatio": {
      "properties": {
        "height": {
          "minimum": 1,
          "type": "integer"
        },
        "width": {
          "minimum": 1,
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height"
      ],
      "type": "object"
    },
    "photo": {
      "description": "A public card photo. Blobs are world-readable and may be cached by any relay or mirror; users should be told this before upload.",
      "properties": {
        "alt": {
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "aspectRatio": {
          "ref": "#aspectRatio",
          "type": "ref"
        },
        "image": {
          "accept": [
            "image/jpeg",
            "image/png",
            "image/webp"
          ],
          "maxSize": 2000000,
          "type": "blob"
        }
      },
      "required": [
        "image"
      ],
      "type": "object"
    },
    "photoView": {
      "properties": {
        "alt": {
          "type": "string"
        },
        "aspectRatio": {
          "ref": "#aspectRatio",
          "type": "ref"
        },
        "fullsize": {
          "format": "uri",
          "type": "string"
        },
        "thumb": {
          "format": "uri",
          "type": "string"
        }
      },
      "required": [
        "thumb",
        "fullsize"
      ],
      "type": "object"
    },
    "preferences": {
      "description": "PRIVATE. Matching preferences held only by the Lovesky AppView, encrypted at rest. This object is an XRPC payload, never a repo record. It holds everything a public card must not: gender, who the user is seeking, birthdate, location.",
      "properties": {
        "ageMax": {
          "maximum": 120,
          "minimum": 18,
          "type": "integer"
        },
        "ageMin": {
          "maximum": 120,
          "minimum": 18,
          "type": "integer"
        },
        "birthDate": {
          "description": "Used to enforce 18+ and to compute the age shown in-app. Never published.",
          "format": "datetime",
          "type": "string"
        },
        "discoverable": {
          "description": "False pauses the account: the card stays published but is hidden from discovery.",
          "type": "boolean"
        },
        "gender": {
          "knownValues": [
            "woman",
            "man",
            "non-binary"
          ],
          "maxLength": 64,
          "type": "string"
        },
        "geohash": {
          "description": "Client truncates to 6 characters (about 1.2 km cells) before sending. The AppView never stores anything finer.",
          "maxLength": 12,
          "type": "string"
        },
        "maxDistanceKm": {
          "maximum": 20000,
          "minimum": 1,
          "type": "integer"
        },
        "seeking": {
          "items": {
            "knownValues": [
              "women",
              "men",
              "non-binary",
              "everyone"
            ],
            "maxLength": 64,
            "type": "string"
          },
          "maxLength": 8,
          "type": "array"
        }
      },
      "required": [
        "birthDate",
        "gender",
        "seeking"
      ],
      "type": "object"
    },
    "profileView": {
      "description": "A card hydrated by the AppView for an authenticated viewer. Combines the public record with private, per-viewer state.",
      "properties": {
        "age": {
          "description": "Computed at request time from private birthDate. Shown in-app only.",
          "type": "integer"
        },
        "bio": {
          "maxGraphemes": 500,
          "maxLength": 5000,
          "type": "string"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "displayName": {
          "maxGraphemes": 64,
          "maxLength": 640,
          "type": "string"
        },
        "handle": {
          "format": "handle",
          "type": "string"
        },
        "indexedAt": {
          "format": "datetime",
          "type": "string"
        },
        "intent": {
          "items": {
            "maxLength": 64,
            "type": "string"
          },
          "type": "array"
        },
        "interests": {
          "items": {
            "maxGraphemes": 32,
            "maxLength": 320,
            "type": "string"
          },
          "type": "array"
        },
        "labels": {
          "items": {
            "ref": "com.atproto.label.defs#label",
            "type": "ref"
          },
          "type": "array"
        },
        "languages": {
          "items": {
            "format": "language",
            "type": "string"
          },
          "type": "array"
        },
        "mutuals": {
          "description": "Number of accounts followed by both the viewer and this profile, from the public Bluesky graph.",
          "type": "integer"
        },
        "photos": {
          "items": {
            "ref": "#photoView",
            "type": "ref"
          },
          "type": "array"
        },
        "prompts": {
          "items": {
            "ref": "#prompt",
            "type": "ref"
          },
          "type": "array"
        },
        "pronouns": {
          "maxGraphemes": 24,
          "maxLength": 240,
          "type": "string"
        },
        "region": {
          "maxGraphemes": 64,
          "maxLength": 640,
          "type": "string"
        },
        "sharedInterests": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "tagline": {
          "maxGraphemes": 120,
          "maxLength": 1200,
          "type": "string"
        },
        "viewer": {
          "ref": "#viewerState",
          "type": "ref"
        }
      },
      "required": [
        "did",
        "handle",
        "indexedAt"
      ],
      "type": "object"
    },
    "prompt": {
      "description": "A short question-and-answer pair shown on the public card.",
      "properties": {
        "answer": {
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "question": {
          "maxGraphemes": 120,
          "maxLength": 1200,
          "type": "string"
        }
      },
      "required": [
        "question",
        "answer"
      ],
      "type": "object"
    },
    "viewerState": {
      "description": "Per-viewer relationship state. Deliberately omits likedBy and blockedBy so one-sided likes and blocks never leak. following/followedBy come from the public Bluesky graph.",
      "properties": {
        "blocking": {
          "type": "boolean"
        },
        "followedBy": {
          "description": "This account follows the viewer on Bluesky.",
          "type": "boolean"
        },
        "following": {
          "description": "The viewer follows this account on Bluesky.",
          "type": "boolean"
        },
        "liked": {
          "type": "boolean"
        },
        "matched": {
          "type": "boolean"
        }
      },
      "type": "object"
    }
  },
  "id": "app.lovesky.actor.defs",
  "lexicon": 1
}
```
