com.emdashcms.experimental.package.profile

emdashcms.com

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "author": {
      "description": "FAIR Metadata Document authors[] item. Authors SHOULD include at least one of url or email so users can identify the publisher behind the package; clients render absent contact information as 'unknown'.",
      "properties": {
        "email": {
          "maxLength": 256,
          "type": "string"
        },
        "name": {
          "maxGraphemes": 64,
          "maxLength": 256,
          "type": "string"
        },
        "url": {
          "format": "uri",
          "maxLength": 1024,
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "contact": {
      "description": "FAIR Metadata Document security[] item. At least one of url or email MUST be present; Lexicon cannot express required-one-of, so aggregators MUST validate this and reject records carrying a contact with neither field.",
      "properties": {
        "email": {
          "maxLength": 256,
          "type": "string"
        },
        "url": {
          "format": "uri",
          "maxLength": 1024,
          "type": "string"
        }
      },
      "type": "object"
    },
    "main": {
      "description": "A plugin package profile, identifying the package and carrying metadata that does not change between releases. Each release belongs to exactly one profile in the same publisher's repo. The record key is the package slug.",
      "key": "any",
      "record": {
        "properties": {
          "authors": {
            "description": "At least one author. Vendors SHOULD specify at least one of url or email per author.",
            "items": {
              "ref": "#author",
              "type": "ref"
            },
            "maxLength": 32,
            "minLength": 1,
            "type": "array"
          },
          "description": {
            "description": "Short description of the package. SHOULD NOT exceed 140 characters per FAIR convention.",
            "maxGraphemes": 140,
            "maxLength": 1024,
            "type": "string"
          },
          "extensions": {
            "description": "Opaque extension container keyed by NSID. The base profile Lexicon does not validate entries; consumers dispatch known entries to their embedded extension schemas. EmDash delegated-release policy uses com.emdashcms.experimental.package.profileExtension here.",
            "type": "unknown"
          },
          "id": {
            "description": "Canonical AT URI of this profile record. Derived from the record's location at publish time; not authored by the publisher. Aggregators MUST reject records whose id does not match the AT URI they were fetched from. Mirrors FAIR's id-must-match-the-resolved-identifier rule.",
            "format": "at-uri",
            "type": "string"
          },
          "keywords": {
            "description": "Search keywords. SHOULD NOT exceed 5 items per FAIR convention.",
            "items": {
              "maxGraphemes": 64,
              "maxLength": 128,
              "type": "string"
            },
            "maxLength": 5,
            "type": "array"
          },
          "lastUpdated": {
            "description": "ISO 8601 datetime for the package's last update.",
            "format": "datetime",
            "type": "string"
          },
          "license": {
            "description": "SPDX license expression, or the literal 'proprietary'. Clients SHOULD refuse to install packages without a valid license.",
            "maxLength": 256,
            "type": "string"
          },
          "name": {
            "description": "Human-readable name for the package, displayed in directory listings.",
            "maxGraphemes": 100,
            "maxLength": 1024,
            "type": "string"
          },
          "sections": {
            "description": "Map of human-readable text sections (description, installation, faq, changelog, security). CommonMark Markdown. Each value capped at 20000 bytes / 2000 graphemes.",
            "ref": "#sections",
            "type": "ref"
          },
          "security": {
            "description": "At least one security contact. Vendors SHOULD specify at least one of url or email per contact. Clients SHOULD refuse to install packages without at least one valid security contact.",
            "items": {
              "ref": "#contact",
              "type": "ref"
            },
            "maxLength": 8,
            "minLength": 1,
            "type": "array"
          },
          "slug": {
            "description": "URL-safe slug. ASCII letter followed by ASCII letters, digits, '-', or '_'. If present, MUST equal the record key. If absent, clients use the rkey as the display slug. Aggregators MUST reject records where slug is present and disagrees with the rkey.",
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "type": {
            "description": "Package type from FAIR's type registry. EmDash plugins use 'emdash-plugin'. Custom types use the 'x-' prefix.",
            "knownValues": [
              "emdash-plugin"
            ],
            "maxLength": 64,
            "type": "string"
          }
        },
        "required": [
          "id",
          "type",
          "license",
          "authors",
          "security"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "sections": {
      "description": "Free-form map keyed by section name (FAIR-recognised: description, installation, faq, changelog, security). Each value is CommonMark Markdown capped at 20000 bytes / 2000 graphemes. Clients sanitise rendered output. Lexicon cannot type arbitrary keys; unrecognised sections pass through verbatim and renderers display them with the section key as heading.",
      "properties": {
        "changelog": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "description": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "faq": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "installation": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "security": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        }
      },
      "type": "object"
    }
  },
  "description": "Plugin package profile record. EXPERIMENTAL: this NSID is part of the experimental phase of the EmDash plugin registry. The stable namespace target is com.emdashcms.package.profile.",
  "id": "com.emdashcms.experimental.package.profile",
  "lexicon": 1
}

Validate Record

Validate a record against com.emdashcms.experimental.package.profile

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:ilznslhspsvk6naatedr66pi
CID
bafyreidwcexpnzgyrv6qhfejxi7v3ux3wps5gxockibe2s2bwwlfuhfgam
Indexed At
2026-10-08 09:24 UTC
AT-URI
at://did:plc:ilznslhspsvk6naatedr66pi/com.atproto.lexicon.schema/com.emdashcms.experimental.package.profile

Similar Lexicons

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

  • com.emdashcms.experimental.publisher.profile recordnot from the namespace authority

    Identity-level metadata for a plugin publisher. One record per publisher DID, located at rkey `self`. Optional: a DID may publish packages without ever publishing a publisher.profile, in which case clients fall back to …

  • com.emdashcms.experimental.package.release recordnot from the namespace authority

    Plugin package release record. EXPERIMENTAL: this NSID is part of the experimental phase of the EmDash plugin registry. The stable namespace target is com.emdashcms.package.release.

Lexicon Garden

@