app.lovesky.actor.defs

toddlambert.com

{
  "$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
}

Validate Record

Validate a record against app.lovesky.actor.defs

Validation Options
Automatically resolve and include external schemas for full validation
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:r5pj64joaywqnvk2obembpt7
CID
bafyreidf2ahsgktuldbr7ccquooe46kjbt2be6oiagspdwyjktr4m7nr3q
Indexed At
2026-10-14 09:27 UTC
AT-URI
at://did:plc:r5pj64joaywqnvk2obembpt7/com.atproto.lexicon.schema/app.lovesky.actor.defs

Referenced Schemas (1)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • app.lovesky.actor.profile recordnot from the namespace authority

    The public Lovesky dating card. Creating this record is the act of opting in; deleting it is the act of opting out. It is replicated to every relay and readable by anyone, so it must never contain sexual orientation, ge…

  • Record of the user confirming they're 18 or over. Required before flipping any adult-content label (nsfw, etc.) from 'hide' to 'blur' or 'show'. Once present, persists indefinitely — set at first opt-in, cleared only …

  • The viewer's home browse area and search radius.

Lexicon Garden

@