at.happyproto.plugin.v1

happyproto.at

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "image": {
      "description": "A presentation image. SVG is not accepted, because it can carry script and renders in an operator's dashboard.",
      "properties": {
        "alt": {
          "description": "A description of the image for people who cannot see it.",
          "maxGraphemes": 300,
          "maxLength": 3000,
          "type": "string"
        },
        "height": {
          "minimum": 1,
          "type": "integer"
        },
        "image": {
          "accept": [
            "image/png",
            "image/jpeg",
            "image/webp",
            "image/gif",
            "image/avif"
          ],
          "maxSize": 1000000,
          "type": "blob"
        },
        "width": {
          "minimum": 1,
          "type": "integer"
        }
      },
      "required": [
        "image",
        "width",
        "height"
      ],
      "type": "object"
    },
    "main": {
      "description": "A HappyView plugin, as one entry in a software.release.manifest's `artifacts`. It carries the module and its manifest.json as blobs, so they are verified by their CIDs, and the manifest's facts in the signed record, so a consent screen renders without downloading the module. Those facts are not trusted: the loader checks them against the module itself and refuses a plugin that misstates what it does. The registry refuses a manifest whose artifact breaks a rule stated here, including the ones a lexicon cannot express.",
      "properties": {
        "allowedHosts": {
          "description": "Hosts the module's outbound requests may reach.",
          "items": {
            "maxLength": 256,
            "type": "string"
          },
          "type": "array"
        },
        "apiVersion": {
          "description": "The plugin API version the module targets. Its major version must be 2 or later.",
          "maxLength": 16,
          "type": "string"
        },
        "banner": {
          "description": "A wide image shown at the top of the plugin's page.",
          "ref": "#image",
          "type": "ref"
        },
        "capabilities": {
          "description": "What the module may do. The loader checks it against the module's imports, so a plugin cannot import what this does not cover.",
          "items": {
            "maxLength": 128,
            "type": "string"
          },
          "type": "array"
        },
        "fileExtensions": {
          "description": "Required for an interpreter: the file extensions of the scripts it runs, without the dot. Each is 1 to 16 lowercase letters or digits, none is `json`, and none repeats.",
          "items": {
            "maxLength": 16,
            "minLength": 1,
            "type": "string"
          },
          "maxLength": 8,
          "minLength": 1,
          "type": "array"
        },
        "languageId": {
          "description": "Required for an interpreter: the script type it runs.",
          "maxLength": 64,
          "type": "string"
        },
        "license": {
          "description": "An SPDX expression, or `proprietary`.",
          "maxLength": 256,
          "type": "string"
        },
        "manifest": {
          "accept": [
            "application/json"
          ],
          "description": "The module's manifest.json. A module stored as a blob has no directory beside it to hold a sibling file, so this is what says how to load it.",
          "maxSize": 1000000,
          "type": "blob"
        },
        "namespace": {
          "description": "Required for a library: the name scripts load it by, which is unique across a HappyView's installed plugins.",
          "maxLength": 256,
          "type": "string"
        },
        "package": {
          "accept": [
            "application/wasm"
          ],
          "description": "The WASM module.",
          "maxSize": 16777216,
          "type": "blob"
        },
        "pluginType": {
          "description": "What the plugin is. Any other value is refused.",
          "knownValues": [
            "auth",
            "library",
            "interpreter"
          ],
          "type": "string"
        },
        "requires": {
          "description": "Dependencies, as a map a lexicon cannot type. Each key is `env:<name>`, such as `env:happyview`, or the at-uri of a software.release.project; each value is a Cargo version requirement, such as `>=3.0.0` or `^1.0`, without `||`.",
          "type": "unknown"
        },
        "screenshots": {
          "items": {
            "ref": "#image",
            "type": "ref"
          },
          "maxLength": 8,
          "type": "array"
        },
        "sections": {
          "ref": "#sections",
          "type": "ref"
        }
      },
      "required": [
        "package",
        "manifest",
        "pluginType",
        "apiVersion",
        "capabilities",
        "license",
        "sections"
      ],
      "type": "object"
    },
    "sections": {
      "description": "Long-form CommonMark shown on the plugin's page. It is rendered as untrusted input, with raw HTML stripped.",
      "properties": {
        "description": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "installation": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        },
        "security": {
          "maxGraphemes": 2000,
          "maxLength": 20000,
          "type": "string"
        }
      },
      "required": [
        "description"
      ],
      "type": "object"
    }
  },
  "id": "at.happyproto.plugin.v1",
  "lexicon": 1
}

Validate Record

Validate a record against at.happyproto.plugin.v1

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:mo7vq4jbioxwafy5zkcc3eux
CID
bafyreihxgmuzpuo4ldabzktjiqh2m7wgz52kzihxsp73evwpryehteobw4
Indexed At
2026-10-26 21:34 UTC
AT-URI
at://did:plc:mo7vq4jbioxwafy5zkcc3eux/com.atproto.lexicon.schema/at.happyproto.plugin.v1

Similar Lexicons

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

  • The HappyView-specific half of a release, carried at extensions['at.happyproto.plugin.releaseExtension']. It is the plugin manifest, moved into the signed record so a consent screen renders without downloading the modul…

  • One version of a package. The record key is '<slug>:<version>'. A release at a given version is never modified: a registry that later sees a different CID at this key keeps the first and flags the conflict.

  • A HappyView plugin package, in its publisher's repo. The record key is the package slug, so the slug is immutable: changing it means a different package.

  • 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.

  • The HappyView facts about a software.release.project that make it a plugin. The record key is the project's name, and the record lives in the same repo as the project. The registry indexes a project's releases only whil…

Lexicon Garden

@