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.
any
Any valid record key
Properties
authors
array
of
ref
#author
Required
At least one author. Vendors SHOULD specify at least one of url or email per author.
maxLength: 32 itemsminLength: 1 itemsdescription
string
Optional
Short description of the package. SHOULD NOT exceed 140 characters per FAIR convention.
maxLength: 1024 bytesmaxGraphemes: 140 graphemesextensions
unknown
Optional
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.
id
string
at-uri
Required
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.
keywords
array
of
string
Optional
Search keywords. SHOULD NOT exceed 5 items per FAIR convention.
maxLength: 5 itemslastUpdated
string
datetime
Optional
ISO 8601 datetime for the package's last update.
license
string
Required
SPDX license expression, or the literal 'proprietary'. Clients SHOULD refuse to install packages without a valid license.
maxLength: 256 bytesname
string
Optional
Human-readable name for the package, displayed in directory listings.
maxLength: 1024 bytesmaxGraphemes: 100 graphemessections
ref
#sections
Optional
Map of human-readable text sections (description, installation, faq, changelog, security). CommonMark Markdown. Each value capped at 20000 bytes / 2000 graphemes.
security
array
of
ref
#contact
Required
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.
maxLength: 8 itemsminLength: 1 itemsslug
string
Optional
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 bytesminLength: 1 bytestype
string
Required
Package type from FAIR's type registry. EmDash plugins use 'emdash-plugin'. Custom types use the 'x-' prefix.
maxLength: 64 bytesemdash-pluginView raw schema
{
"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"
}